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

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

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

public void update() { //This method is called by a Thread 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()应该为我处理这个问题。 这里出了什么问题?

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

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

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

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

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

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

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

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