9

我正在使用 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

4 回答 4

12

所以事实证明,当使用 SurfaceView 时,您绘制到窗口下方的 Surface。我在 xml 中设置视图的背景颜色;事实证明,它设置了 Window 的背景颜色,而不是 Surface。实际上,我将 Window 设置为不透明的,这样您就看不到下面的 Surface。

学过的知识。

于 2010-10-05T20:28:11.500 回答
0

这不是 SurfaceView 的工作方式。调用 unlockCanvasAndPost() 不会调用 onDraw(),这就是使用 SurfaceView 的全部意义所在。SurfaceView 的表面位于不同的窗口中。

于 2010-09-29T05:27:22.347 回答
0

这是旧的,但我感觉问题是没有表面持有者回调。他试图在创建表面之前在表面上绘图

于 2011-03-20T18:35:07.300 回答
0

要将 SurfaceView 设置为顶部 Z-View 索引,请向您的 CustomerSurfaceView 添加以下代码:

init {
   setZOrderOnTop(true)
}
于 2021-07-24T21:07:15.553 回答