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

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经验和大量的调试经验,但无法追踪此问题。
提前致谢。

这段代码现在在Android 4.3上崩溃了。 - Cory Trese
4个回答

13

使用SurfaceView时,实际上是在一个位于Window下方的Surface上进行绘制。我之前在xml中设置了View的背景颜色,结果设置的是Window的背景颜色而不是Surface的背景颜色。因此,我使得Window变为不透明,导致无法看到位于其下方的Surface。

这给我敲响了警钟。


哇,谢谢你的跟进!我也遇到了同样的问题,不知道要花多长时间才能找到解决方法。在这里找到解决方案之前,我花了几个小时的时间。唉。 - spartygw
我已经花了好几个小时寻找答案,为什么unlockCanvasAndPost()不会刷新屏幕,尽管所有的绘图方法都已执行...最终看到了你的回答,才意识到这是我的同样问题,我为视图设置了黑色背景,而SurfaceView在其下方绘制...我差点就疯了 :P - JorgeGRC

0

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


0

这不是 SurfaceView 的工作方式。调用 unlockCanvasAndPost() 不会调用 onDraw(),这就是使用 SurfaceView 的整个意义。 SurfaceView 的 Surface 位于另一个窗口中。


1
谢谢,但这并不能解决问题。用于将你写的画布发布到屏幕上的任何机制都没有被调用。 - cblades
2
你没有解释问题出在哪里。它为什么不能工作? - Romain Guy
是的,Romain Guy,请帮助我们解决这个难题 :p - AZ_

0

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

init {
   setZOrderOnTop(true)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接