4

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