4

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

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

public void onDraw(Canvas c) {

xPosition += xAcceleration;
yPosition += yAcceleration;

drawable = BitmapFactory.decodeResource(getResources(),R.drawable.ball);
c.drawBitmap(drawable, xPosition,yPosition, paint);

invalidate();

}

所以我去尝试创建我自己的类似无效的解决方案WallpaperService并想出了这个:

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

所以我正在做的是:

  1. 得到Canvas
  2. 画上Canvas
  3. 解锁Canvas并重新开始。

据我了解,这应该给我invalidate();类似的行为,但它会尝试显示壁纸,然后它给我 StackOverflowError。

4

1 回答 1

1

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

于 2012-09-08T16:28:12.867 回答