尝试清除它后,Android SurfaceView / Canvas闪烁

时间:2011-07-27 15:48:17

标签: java android graphics canvas

所以我试图使用canvas.drawColor(Color.BLACK)来清除Canvas但是如果我只调用一次,显示屏会闪烁并显示应该被drawColor覆盖的旧图形。

以下是我的代码的重要部分 -

// This method is called by a Thread                
public void update() {
    Canvas canvas = holder.lockCanvas(null);
    if (canvas != null) {
        onDraw(canvas);
    }
    holder.unlockCanvasAndPost(canvas);
}

@Override
protected void onDraw(Canvas canvas) {

    if (toClear) {
        canvas.drawColor(Color.BLACK);

        //if this is not set to change back to false, it does not flicker
        toClear = false;
    }

    //Draw some objects that are moving around
}

public void clearScreen() {     
    // This method is called when the user pressed a button
    toClear = true;
}

在谷歌搜索后,我听说有双重缓冲,但后来了解到lockCanvas()和unlockCanvasAndPost()应该为我处理这个问题。这里出了什么问题?

3 个答案:

答案 0 :(得分:3)

我想知道这是否与SurfaceView被双重缓冲并且它们交替每一帧。因此,您必须清除屏幕至少两帧。

toClear = true更改为toClear = 2并设置

if(toClear > 0) { 
   'drawColor'
   toClear--; 
}

答案 1 :(得分:3)

我过去遇到过同样的问题,或者至少听起来与你的描述相似。我解决它的方法是避免调用onDraw方法,因为框架也在你的线程的run方法中调用这个方法BETWEEN你的调用。

简而言之,将onDraw方法重命名为Render(),然后从运行循环中调用Render。如果您仍想清除屏幕,那么只需在运行循环中(在调用渲染之前)执行此操作,这就解决了我的“随机精灵被绘制”问题。

如果这有帮助,请告诉我 - 它对我来说非常合适。

答案 2 :(得分:0)

  1. 您是否阅读了SurfaceHolder上的文档?我确保你遵循从另一个线程调用的所有推荐用途。

  2. 您确定在完成黑色填充后不会简单地绘制其他物体吗?你提到绘制移动物体,并说如果你没有重置你的清除旗子它就不会闪烁。也许它被画了两次?您是否在该方法中放置了一个调试断点来验证发生了什么以及何时/多久调用它?