对于我的动态壁纸,我使用以下代码(由 Runnable 调用)来绘制每一帧。每次调用它时,我都会用纯色填充当前画布并绘制背景位图(bg_image 已调整大小以完全适合屏幕)。然后我调用 drawParticles(c),它简单地使用 c.drawCircle(...) 在画布上绘制粒子。
在动态壁纸预览模式下,此代码效果很好。但是,当我实际将其设置为我的动态壁纸时,它会闪烁并且在绘制之前似乎没有清除画布。让我解释一下:
第 1 帧:绘制位图并覆盖圆形。
Frame 2:绘制位图并叠加圆圈(根据我的粗略理解,为了提高效率,有两个画布交替绘制和发布)。
第 3 帧:画布没有被清除!此帧包括每个绘制的圆圈的新位置以及来自第 1 帧的圆圈!。
第 4 帧:包括每个绘制的圆圈的新位置以及第 2 帧中的圆圈!
最终效果是圆圈在整个屏幕上留下“轨迹”,在(我相信)两个交替的画布之间闪烁。为什么,根据我下面的代码,我的画布不是每帧都被清除?同样,这在预览模式下工作正常,但在实际设置为我的动态壁纸时却不行。还值得注意的是,只有在绘制位图时才会出现这种闪烁问题;如果背景只是纯色,则永远不会出现此问题。
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));
}