【发布时间】:2012-09-09 00:28:12
【问题描述】:
我试图使带有加速度计的移动位图更平滑,但无意中注意到,当我在 onDraw() 方法的末尾调用 invalidate(); 而不是在 onSensorChanged() 的末尾调用它时,我得到了更平滑的运动,即使我没有任何类型的低通滤波器。然后我尝试用我的 LiveWallpaper 做同样的事情,但是你知道在 Engine 和 WallpaperService 中没有 onDraw() 方法,但是你必须自己创建一个并调用它,例如使用 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();-like 行为,但它会尝试显示壁纸,然后它给我 StackOverflowError。
【问题讨论】:
标签: android canvas invalidation