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

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.

学过的知识.


Rom*_*Guy 0

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

  • 你不解释问题是什么。怎么不工作呢? (2认同)