所以我试图使用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()应该为我处理这个问题。这里出了什么问题?
答案 0 :(得分:3)
我想知道这是否与SurfaceView
被双重缓冲并且它们交替每一帧。因此,您必须清除屏幕至少两帧。
将toClear = true
更改为toClear = 2
并设置
if(toClear > 0) {
'drawColor'
toClear--;
}
答案 1 :(得分:3)
我过去遇到过同样的问题,或者至少听起来与你的描述相似。我解决它的方法是避免调用onDraw方法,因为框架也在你的线程的run方法中调用这个方法BETWEEN你的调用。
简而言之,将onDraw方法重命名为Render(),然后从运行循环中调用Render。如果您仍想清除屏幕,那么只需在运行循环中(在调用渲染之前)执行此操作,这就解决了我的“随机精灵被绘制”问题。
如果这有帮助,请告诉我 - 它对我来说非常合适。
答案 2 :(得分:0)
您是否阅读了SurfaceHolder上的文档?我确保你遵循从另一个线程调用的所有推荐用途。
您确定在完成黑色填充后不会简单地绘制其他物体吗?你提到绘制移动物体,并说如果你没有重置你的清除旗子它就不会闪烁。也许它被画了两次?您是否在该方法中放置了一个调试断点来验证发生了什么以及何时/多久调用它?