我试图使用加速度计更轻松地移动位图,并且意外地注意到当我在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
所以我正在做的是:
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();
}
。Canvas
。Canvas
并重新开始。据我所知,这应该给我Canvas
- 就像行为一样,但它会尝试显示壁纸,之后它会给我StackOverflowError。
答案 0 :(得分:1)
好的,我已经解决了这个问题。我只需要将位图初始化移动到onCreate()
方法。