我正在使用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);
}
}
此代码正在执行,不会抛出异常,并且没有我可以找到的负面影响;但是,unlockCanvasAndPost()调用永远不会导致调用onDraw()。
换句话说,unlockCanvasAndPost()不会导致重绘SurfaceView。
任何可能导致此症状的想法?我有丰富的Java经验,相当多的Android经验,以及大量的调试经验,无法跟踪这个。
提前致谢。
答案 0 :(得分:11)
事实证明,当使用SurfaceView时,您将绘制到Window下面的Surface。我在xml中设置View的背景颜色;事实证明,设置窗口的背景颜色,而不是Surface。实际上,我使Window不透明,以至于你无法看到下面的Surface。
经验教训。
答案 1 :(得分:0)
这不是SurfaceView的工作原理。调用unlockCanvasAndPost()不会调用onDraw(),这是使用SurfaceView的全部要点。 SurfaceView的表面位于不同的窗口中。
答案 2 :(得分:0)
这是旧的,但我有一种感觉问题是没有表面支持者回调。他试图在表面创建之前在表面上绘图
答案 3 :(得分:0)
要将 SurfaceView 设置为顶部 Z-View 索引,请将以下代码添加到您的 CustomerSurfaceView:
init {
setZOrderOnTop(true)
}