加速度計を使用してビットマップの移動をよりスムーズにしようとしていましたが、メソッドの最後で呼び出すのではなく、メソッドinvalidate();
の最後で呼び出すと、ローパス フィルターの種類がなくても、動きがよりスムーズになることに偶然気付きました。 . 次に、LiveWallpaper で同じことをしようとしましたが、ご存知のようにofにはメソッドがありませんが、自分で作成して、たとえば で呼び出す必要があります。しかし、そのようにしても、コードの残りの部分が他のプログラムと同じであっても、よりスムーズな結果は得られません。onDraw()
onSensorChanged()
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が発生します。