对于我的动态壁纸,我使用以下代码(由 Runnable 调用)来绘制每一帧。每次调用它时,我都会用纯色填充当前 Canvas 并绘制背景位图(bg_image 已调整大小以完美适合屏幕)。然后我调用 drawParticles(c),它只是多次使用 c.drawCircle(...) 在整个 Canvas 上绘制粒子。
在动态壁纸预览模式下,这段代码效果很好。但是,当我实际将其设置为我的动态壁纸时,它会闪烁并且似乎在绘制之前不会清除 Canvas 。让我解释一下:
第 1 帧:绘制位图并叠加圆圈。
第2帧:绘制位图,叠加圆圈(我粗略理解,为了效率,有两个 Canvas 交替绘制和张贴)。
第 3 帧: Canvas 未被清除!此帧包括每个绘制圆的新位置以及第 1 帧中的圆!
第 4 帧:包括每个绘制圆的新位置以及第 2 帧中的圆!
最终效果是圆圈在整个屏幕上留下“轨迹”,在(我相信)两个交替的 Canvas 之间闪烁。为什么,根据我下面的代码,我的 Canvas 不是每帧都被清除?同样,这在预览模式下工作正常,但在实际设置为我的动态壁纸时却不行。还值得注意的是,只有在绘制位图时才会出现此闪烁问题;如果背景只是纯色,则永远不会出现此问题。
final SurfaceHolder holder = getSurfaceHolder();
Canvas c = null;
try {
c = holder.lockCanvas();
if (c != null) {
c.drawColor(Color.BLACK);
c.drawBitmap(bg_image, 0, 0, null);
fluid.drawParticles(c);
}
} finally {
if (c != null) holder.unlockCanvasAndPost(c);
}
mHandler.removeCallbacks(mDrawRunnable);
mHandler.postDelayed(mDrawRunnable, 1000/targetFramerate -(System.currentTimeMillis() - mLastTime));
}
最佳答案
我的猜测是您的动画太复杂,跟不上您的帧速率。如果你降低帧速率,你还有问题吗?此外,如果您在每一帧都绘制不透明的背景位图,则无需先将屏幕涂黑——那样只会浪费时间并限制您的最大帧速率。
我猜这个问题不会发生在预览模式下,因为更多的手机资源都集中在你身上,而一旦设置了壁纸,更多的东西就会在后台发生。
关于android - 包含位图的动态壁纸 Canvas 会闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5606079/