我试图使带有加速度计的移动位图更平滑,并且意外地注意到,当我在方法结束时调用invalidate();
而onDraw()
不是在结束时调用它时onSensorChanged()
,即使我没有任何类型的低通滤波器,我也会得到更平滑的运动. 然后我尝试用我的 LiveWallpaper 做同样的事情,但是你知道在of中没有onDraw()
方法,但是你必须自己创建一个并调用它,例如使用. 但是即使其余代码与其他程序中的代码相同,这样做也不会产生任何更平滑的结果。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
并重新开始。
据我了解,这应该给我invalidate();
类似的行为,但它会尝试显示壁纸,然后它给我 StackOverflowError。