2

对于我的动态壁纸,我使用以下代码(由 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));
}
4

1 回答 1

2

我的猜测是您的动画太复杂而无法跟上您的帧速率。如果您将帧速率降低很多,您还有问题吗?此外,如果您在每一帧绘制一个不透明的背景位图,则不需要先将屏幕涂黑——这只会浪费时间,并限制您的最大帧速率。

我猜这个问题不会在预览模式下发生,因为更多的手机资源都集中在你身上,而一旦设置了壁纸,背景中就会发生更多的事情。

于 2011-04-09T17:08:04.210 回答