WallpaperServices的draw方法的类似于Invalidate的方法

时间:2012-09-06 10:31:01

标签: android canvas invalidation

我试图使用加速度计更轻松地移动位图,并且意外地注意到当我在invalidate();方法结束时调用onDraw()而不是在onSensorChanged()结束时调用它时我得到了即使我没有任何类型的低通滤波器,运动也会更顺畅。然后我尝试用我的LiveWallpaper做同样的事情,但是你知道onDraw()的{​​{1}}中没有Engine方法,但是你必须自己创建一个并用例如WallpaperService。但即使代码的其余部分与其他程序相同,这样做也不会给出任何更平滑的结果。

这是我在非壁纸程序中使用的代码,它运行正常:

Handler

所以我去尝试为public void onDraw(Canvas c) { xPosition += xAcceleration; yPosition += yAcceleration; drawable = BitmapFactory.decodeResource(getResources(),R.drawable.ball); c.drawBitmap(drawable, xPosition,yPosition, paint); invalidate(); } 创建我自己的类似无效的解决方案并想出了这个:

WallpaperService

所以我正在做的是:

  1. 获取void drawFrame() { final SurfaceHolder holder = getSurfaceHolder(); Canvas c = null; try { c = holder.lockCanvas(); if (c != null) { xPosition += xAcceleration; yPosition += yAcceleration; background = BitmapFactory.decodeResource(getResources(),R.drawable.bg); drawable = BitmapFactory.decodeResource(getResources(),R.drawable.ball); c.drawBitmap(background, 0,0, null); c.drawBitmap(drawable, xPosition,yPosition, null); } } catch (Exception ex){ } holder.unlockCanvasAndPost(c); drawFrame(); }
  2. 借鉴Canvas
  3. 解锁Canvas并重新开始。
  4. 据我所知,这应该给我Canvas - 就像行为一样,但它会尝试显示壁纸,之后它会给我StackOverflowError。

1 个答案:

答案 0 :(得分:1)

好的,我已经解决了这个问题。我只需要将位图初始化移动到onCreate()方法。