gpt4 book ai didi

android - SurfaceView.onDraw 未调用

转载 作者:行者123 更新时间:2023-11-30 03:36:34 26 4
gpt4 key购买 nike

我已经实现了一些类似的 Activity ,但由于某种原因,下面的类没有到达 onDraw 调用。(非常简单的)类:

import ...etc.


public class SVPlay extends SurfaceView implements Callback {
Context context;
Point screenSize;
Bitmap backGroundImage
public SVPlay(Context _context) {
super(_context);
context = _context;
this.getHolder().addCallback(this);
setFocusable(true);
screenSize = DrawUtil.getInstance(context).getScreenSize();
backgroundImage = BitmapFactory.decodeResource(context.getResources(), R.drawable.room);
backgroundImage = Bitmap.createScaledBitmap(backgroundImage, screenSize.x, screenSize.y, false);


}


@Override public boolean onTouchEvent(MotionEvent event) {
...
}


@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(0xFFAAAAAA);
canvas.drawBitmap(backgroundImage, 0, 0, paint);

}



public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
// TODO Auto-generated method stub

}
public void surfaceCreated(SurfaceHolder holder) {
setWillNotDraw(false);

}
public void surfaceDestroyed(SurfaceHolder holder) {
// TODO Auto-generated method stub

}

此类由一个 Activity 实例化并运行: 公共(public)类 PlayActivity 扩展 Activity {

SVPlay svPlay;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
svPlay = new SVPlay(this);
setContentView(svPlay);
}
....
}

这类似于适用于我的任何其他 Activity/表面 View 实现,但由于某些原因未调用 onDraw。为了简化问题的代码,我删除了实际的绘图 Activity ,并通过在 onDraw() 中设置断点来进行测试。执行未到达 onDraw 调用。添加 postInvalidate() 调用没有帮助。构造函数被调用并执行,没有任何问题或异常。到底是怎么回事?19/5/13 - 进一步调查。此 Activity/SurfaceView 在作为单独的项目运行时显示,因此问题不在此处显示的代码中,而是在调用该 Activity 的代码中。更多...

最佳答案

您应用的可见状态是否需要尽可能快地不断刷新(就像快速变化的游戏)?如果不是,则实际上不需要 SurfaceView,因为您可以在需要时调用 invalidate() 然后实现 onDraw(Canvas) 方法。

如果您确实需要持续快速地渲染,那么使用 SurfaceView 是有意义的。我认为您需要在 SurfaceView 类中添加一个 SurfaceHolder 对象(参见 http://developer.android.com/reference/android/view/SurfaceHolder.html )。使用 SurfaceHolder.lockCanvas() 访问要绘制到的 Canvas,然后使用普通 Canvas 绘图函数绘制到它,然后调用 unlockCanvasAndPost(Canvas)。您将需要生成一个单独的线程来处理渲染,并且该线程将需要一个持续的循环,您将在其中调用 lockCanvas() 和 unlockCanvasAndPost(Canvas)。

关于android - SurfaceView.onDraw 未调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16586969/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com