cbl*_*des 9 java android draw surfaceview
我正在使用Android sdk实现一个相当标准的应用程序,该应用程序涉及使用SurfaceView,SurfaceHolder和Callback设置进行绘制.
在我的主线程(UI线程)中,我没有绘制或处理SurfaceHolder(或您使用它检索的画布).
在一个单独的线程中,我有以下内容:
Log.i("GAME.DrawThread", "run()");
Log.i("GAME.DrawThread", Thread.currentThread().getName());
Canvas canvas = null;
try {
canvas = holder.lockCanvas();
synchronized(holder) {
Log.i("GAME", "draw():synchronized");
Paint paint = new Paint();
paint.setColor(R.color.draw_color);
canvas.drawColor(R.color.draw_color);
canvas.drawLine(0, 0, 500, 500, paint);
}
} catch (SurfaceHolder.BadSurfaceTypeException e) {
Log.e("GAME", "onDraw(): BadSurfaceTypeException");
} finally {
if (canvas != null) {
holder.unlockCanvasAndPost(canvas);
}
}
Run Code Online (Sandbox Code Playgroud)
正在执行此代码,不会抛出任何异常,并且没有我可以找到的负面影响; 但是,unlockCanvasAndPost()调用永远不会导致调用onDraw().
换句话说,unlockCanvasAndPost()不会导致重绘SurfaceView.
什么可能导致这种症状的想法?我有丰富的java经验,相当多的android经验,以及大量的调试经验,无法跟踪这一点.
提前致谢.
cbl*_*des 11
事实证明,当使用SurfaceView时,您将绘制到Window下面的Surface.我在xml中设置View的背景颜色; 事实证明,设置窗口的背景颜色,而不是Surface.实际上,我使Window变得不透明,因此您无法看到下面的Surface.
学过的知识.
SurfaceView 不是这样工作的。调用unlockCanvasAndPost()不会调用onDraw(),这就是使用SurfaceView的全部意义。SurfaceView 的表面位于不同的窗口中。