0

Androidでビットマップをアニメーション化して、放物線のアーチまたはその他の湾曲したパスで画面上を移動するにはどうすればよいですか? 現在、私が使用している方法は、onDraw() メソッドを使用して x/y 座標でキャンバスにビットマップを描画し、ビットマップが描画された後にその x/y 座標を 1 ずつ増やすことです。メソッドは、invalidate() を呼び出して、新しい位置でビットマップを再描画します。

アップデート:

たぶん、これは私がやろうとしていることについてもう少し文脈を与えるでしょう. 以下は、ビットマップをアニメーション化するために現在持っている実装です。

canvas.drawColor(Color.TRANSPARENT);
canvas.drawBitmap(gBall, x, y, null);

x += changeX;
y += changeY;

if(x >= (canvas.getWidth()-gBall.getWidth()) || x <= 0)
    changeX = -changeX;
if(y >= (canvas.getHeight()-gBall.getHeight()) || y <= 0)
    changeY = -changeY;


invalidate();

この実装を使用して、画面の端に近づくにつれてビットマップ gBall を曲線にする方法はありますか?

4

2 に答える 2

0

カスタム アニメーターを実装します。カスタム アニメーターを実装するには、Animator クラスの applyTransformation メソッドをオーバーライドするだけです。次に、カスタム クラスのインスタンスを使用して View.startAnimation を呼び出すことができます。Google 開発者がスムーズなアニメーションを実装するために費やした時間を考えると、これが最良の解決策である可能性が高く、ハンドラーからアクションを実行するよりもはるかに優れています。これは、ガベージ コレクションによる不具合を引き起こす可能性があります。applyTransform メソッドでメモリ割り当てを実行しない適切に実装されたアニメーションは、ガベージ コレクションをまったく発生させることなく実行できます。

プラットフォーム ソースを見ると、グリッチのないアニメーションが Android 4.x の主要な開発目標であったことがすぐに明らかになります。Google のエンジニアは、アニメーションが問題なく動作するように多くの作業を行ってきました。描画して無効化する戦略は、実際にはうまく機能する可能性があります。ハンドラーのアプローチはそれほど多くありません。しかし、私だったら、アニメーションに注がれた努力を活用するために余分な時間を費やすでしょう.

于 2013-01-15T19:53:12.023 に答える
0

ハンドラーを使用して速度を制御します。

public void draw(Canvas canvas, ...){
   if (System.currentTimeMillis() - lastCall < PERIOD-50){
       mHandler.postDelayed(mReDrawRunnable,PERIOD);
       return;
   }

   //to call back
   mHandler.removeCallbacks(mReDrawRunnable);
   mHandler.postDelayed(mReDrawRunnable,PERIOD);
   lastCall = System.currentTimeMillis();

   //your code here
   ...


}
private long lastCall = 0;
private static final PERIOD = 250; //millis
private Handler mHandler = new Handler();
private Runnable mReDrawRunnable==new Runnable() {
          public void run() {YourClass.this.invalidate();}
        };

これはそれを行うための簡単な方法です。うまくいくはずです。描画を制御するには、別のスレッドを作成する必要があります。

于 2013-01-15T17:46:59.220 に答える