-1
    class SceneAnimation extends Animation{
public int x;
public ImageView mImageView;
public int[] mFrameRess;
public int[] mDurations;
public int mDuration;

public int mLastFrameNo;
public long mBreakDelay;

 public SceneAnimation(ImageView pImageView, int[] pFrameRess, int[] pDurations)
 {

    mImageView = pImageView;
    mFrameRess = pFrameRess;
    mDurations = pDurations;
    mLastFrameNo = pFrameRess.length - 1;

    play(1);
}

    public SceneAnimation(ImageView pImageView, int[] pFrameRess, int pDuration){
    mImageView = pImageView;
    mFrameRess = pFrameRess;
    mDuration = pDuration;
    mLastFrameNo = pFrameRess.length - 1;

    mImageView.setImageResource(mFrameRess[0]);
    playConstant(1);
}

    public SceneAnimation(ImageView pImageView, int[] pFrameRess, int pDuration, long pBreakDelay){            
    mImageView = pImageView;
    mFrameRess = pFrameRess;
    mDuration = pDuration;
    mLastFrameNo = pFrameRess.length - 1;
    mBreakDelay = pBreakDelay;

    mImageView.setImageResource(mFrameRess[0]);
    playConstant(1);
}


synchronized void play(final int pFrameNo)
{


    mImageView.postDelayed(new Runnable(){
        public void run() {


            mImageView.setImageResource(mFrameRess[pFrameNo]);
            if(pFrameNo == mLastFrameNo)
                {
                return;}
            else
                play(pFrameNo + 1);
        }
    }, mDurations[pFrameNo]);
}


public void playConstant(final int pFrameNo){
    mImageView.postDelayed(new Runnable(){
        public void run() {                    
            mImageView.setImageResource(mFrameRess[pFrameNo]);

            if(pFrameNo == mLastFrameNo)
                playConstant(0);
            else
                playConstant(pFrameNo + 1);
        }
    }, pFrameNo==mLastFrameNo && mBreakDelay>0 ? mBreakDelay : mDuration);
}



};

これを使用して多くのフレームを再生できます。アニメーションを次々に再生したり、アニメーションの合間に一時停止したりすることはできません。このクラスをインスタンス化したら、AnimationListenerの使用方法を見つけようとしています。

4

1 に答える 1

0

クラスのフィールドとしてAnimationListenerを追加し、セッターを追加します。次に、他のクラスがSceneAnimationにリスナーを追加できます。

その後、メソッドfireFooEventを作成して、nullでない場合にリスナーにイベントを発生させます。

次に、SceneAnimationクラス内でこれらのfireメソッドを使用して、アニメーションの開始と終了を潜在的なリスナーに通知します。

次に、アクティビティ内で、最初のアニメーションにリスナーを追加し、開始します。そして、リスナーが最初のアニメーションの終わりを受け取ったら、2番目のアニメーションを開始します。

---いくつかのコードで更新

public void setAnimationLIstener( AnimationListener listener ) {
 this.animationListener = listener;
}

public void fireOnAnimationEnd(Animation animation)() {
 if( this.animationListener == null ) {
    return;
 }
 this.animationListener.onAnimationEnd(animation);
}

そして、すべてのイベントに対してこれを行います。次に、AnimationSceneオブジェクトで何が起こっているかをリスナーに簡単に通知できます。

于 2012-11-18T09:17:54.660 に答える