3

私は単純な画像アニメーションを始めようとしています。ヘリコプターのプロペラ ブレードが回転しているように見せたいです。ヘリコプターの 3 つの画像があり、アニメーションの進行状況に応じてこれらの画像の 1 つを表示しています。問題は、一度に 1 つの画像だけが表示されるのではなく、3 つの画像すべてが互いに重なってしまい、アニメーションが作成されることです。これは私がこれまで行ったことであり、このcanvas.drawColor(Color.BLACK)を実行してキャンバスをクリアしようとしましたが、それはキャンバス全体をクリアしてしまいます。これは私が望むものではありません。

これは私が持っているものです:

1) View クラスで:

静的クラス ヘリコプター {プライベート ロング mLastUpdate; プライベート ロング mProgress = 0; プライベート最終フロート mX; プライベート最終フロート mY;

    private final Bitmap mHelicopter1;
    private final Bitmap mHelicopter2;
    private final Bitmap mHelicopter3;
    private final float mRadius;

    Helicopter(long mLastUpdate, float mX, float mY,
              Bitmap helicopter1, Bitmap helicopter2, Bitmap helicopter3) {
        this.mLastUpdate = mLastUpdate;
        this.mX = mX;
        this.mY = mY;
        this.mHelicopter1 = helicopter1;
        this.mHelicopter2 = helicopter2;
        this.mHelicopter3 = helicopter3;
        mRadius = ((float) mHelicopter1.getWidth()) / 2f;

    }

    public void update(long now) {
        mProgress += (now - mLastUpdate);

        if(mProgress >= 400L)
        {
         mProgress = 0;
        }
        mLastUpdate = now;
    }

    public void setNow(long now) {
        mLastUpdate = now;
    }

    public void draw(Canvas canvas, Paint paint) 
    {       

        if (mProgress < 150L) 
        {
            canvas.drawBitmap(mHelicopter1, mX - mRadius, mY - mRadius, paint);
        } 
        else if (mProgress < 300L) 
        {
            canvas.drawBitmap(mHelicopter2, mX - mRadius, mY - mRadius, paint);

        } 
        else if(mProgress < 400L)
        {
         canvas.drawBitmap(mHelicopter3, mX - mRadius, mY - mRadius, paint);
        }

    }

    public boolean done() {
        return mProgress > 700L;
    }
}

private ArrayList<Helicopter> mHelicopters = new ArrayList<Helicopter>();

2) これは、スレッドの run() で呼び出されています。

private void doDraw(Canvas canvas) 
    {
     final long now = SystemClock.elapsedRealtime();

        canvas.save();

        for (int i = 0; i < mHelicopters.size(); i++) {
            final Helicopter explosion = mHelicopters.get(i);
            explosion.update(now);
        }

        for (int i = 0; i < mHelicopters.size(); i++) {
            final Helicopter explosion = mHelicopters.get(i);
            explosion.draw(canvas, mPaint);
        }

        canvas.restore();
    }

誰かが私を助けることができますか?私はアニメーションに関するウェブ上の多くの例を見てきましたが、それらには常にテキストが含まれているようですが、画像は含まれていないようです。ありがとう。

4

3 に答える 3

1

通常、キャンバスを描画するスレッドは、キャンバス全体とすべての小道具/俳優を再描画します。このようにして、ヘリコプター ブレードのイメージ インデックスをインクリメントすると、キャンバスの残りの部分が再描画された後に所定の位置に描画されます。のようなもの: Background->Helicopter->Blade1 次の反復 Background->Helicopter->Blade2。

于 2010-09-01T22:45:02.320 に答える
1

最新のドキュメントはここにあるようです:

http://developer.android.com/guide/topics/graphics/drawable-animation.html

于 2013-02-18T23:47:42.457 に答える
1

遅いかもしれませんが、応答はここにあるようです: http://developer.android.com/guide/topics/graphics/2d-graphics.html#frame-animation

于 2010-12-21T08:25:42.393 に答える