2011-04-09 91 views
2

对于我的动态壁纸,我使用以下代码(由Runnable调用)绘制每个帧。每次调用时,我用纯色填充当前画布并绘制背景位图(bg_image已调整大小以完全适合屏幕)。然后我调用drawParticles(c),它只是简单地使用c.drawCircle(...)一堆遍布画布绘制粒子。当它包含位图时,动态壁纸画布闪烁

在动态壁纸预览模式下,此代码效果很好。但是,当我将其设置为我的动态壁纸时,它会闪烁,并且在绘图之前似乎不清除画布。让我来说明:

第1帧:绘制位图并覆盖圆圈。

第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)); 
} 

回答

2

我的猜测是您的动画太复杂以至于无法跟上帧速率。如果你放慢帧率,你还有问题吗?另外,如果你在每帧画一个不透明的背景位图,你不需要先画黑屏 - 这只是浪费时间,并限制了你的最大帧速率。

我猜这个问题不会发生在预览模式下,因为更多的手机资源都集中在你身上,而一旦设置了壁纸,更多的东西正在后台进行。

+0

听起来像你可能是对的。 – wopkins 2011-04-10 14:54:00

+0

@wopkins谢谢你接受我的回答。 :-)我不知道你制作的是什么样的壁纸,但是使用“粒子”这个词让我觉得你也可能想看看游戏引擎(AndEngine,LibGDX)。另外,我认为星系壁纸的来源可以在这里找到:http://android.git.kernel.org/?p=platform/packages/wallpapers/Basic.git;a=tree;f=src/com/android /墙纸 – 2011-04-10 16:36:11