android - 包含位图的动态壁纸 Canvas 会闪烁

标签 android bitmap flicker live-wallpaper

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

相关文章:

android - 我应该为一个 Android 应用程序安装多个 Instant Apps 以避免 4 MB 的限制吗?

wpf - 将 drawing.bitmap 转换为 windows.controls.image

c++ - 摄像头视频显示闪烁,为什么?

matlab - Java 3D : Scenegraph disappears from some viewing positions

jquery - JQuery 中闪烁效果的动画颜色变化

java - 如何在Android(API 19)中获取MEDIA(MediaStore.Audio.Media)的封面

java - 如何使 vector 在图像中居中?

android - 如何在android mapview中为特定区域着色?

c++ - BITMAP 的正确步幅公式

java - 尝试使用回收位图的 Canvas