Android SurfaceHolder.unlockCanvasAndPost()不会导致重绘

时间:2010-09-29 02:10:02

标签: 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);
            }
        } 

此代码正在执行,不会抛出异常,并且没有我可以找到的负面影响;但是,unlockCanvasAndPost()调用永远不会导致调用onDraw()。

换句话说,unlockCanvasAndPost()不会导致重绘SurfaceView。

任何可能导致此症状的想法?我有丰富的Java经验,相当多的Android经验,以及大量的调试经验,无法跟踪这个。

提前致谢。

4 个答案:

答案 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)
}