2012-11-18 63 views
0
public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.genie_out); 



     genie = (ImageView) findViewById(R.id.genieout); 
     startService(new Intent(this, MyService2.class)); 
     SceneAnimation come = new SceneAnimation(genie, comingout,  durationcomingout); 
     SceneAnimation circled = new SceneAnimation(genie, circle,durationcircle); 

     come.play(1); 



     circled.play(1); 


    } 

有一個ImageView,它需要整個屏幕,我想知道如何等待come.play(1)完成播放circle.play(1),就像這個圓圈先播放然後播放,因爲來的剩下的部分是一個較長的動畫,我想也知道這一點,因爲我有更多的服務,我想開始也跟着他們的方式停止,感謝您的時間等待ImageView中的一個動畫停止啓動另一個動畫?

class SceneAnimation { 
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); 
} 


    public 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); 
} 



}; 
+0

你可能應該使用'AnimationListener'。將animtionlistener設置爲第一個動畫,並在'onAnimationEnd'開始第二個動畫。 – Wenhui

+0

它不是一個動畫類AnimationListener不知道什麼時候結束,生病把代碼放到SceneAnimation中我不知道如何讓AnimationListener通過類運行,也許你可以幫助 – JRowan

+0

我可能是錯的,但是SceneAnimation看起來像Frame Animation 。你有沒有考慮過使用['AnimationDrawable'](http://developer.android.com/reference/android/graphics/drawable/AnimationDrawable.html),它支持逐幀動畫。否則,您可以提供您自己的動畫偵聽器。我將在下面發佈答案。 – Wenhui

回答

1

這裏一種方式實現自己的AnimationListener

package com.example.intentfiletersample; 

import android.widget.ImageView; 

class SceneAnimation { 
public int x; 
public ImageView mImageView; 
public int[] mFrameRess; 
public int[] mDurations; 
public int mDuration; 

public int mLastFrameNo; 
public long mBreakDelay; 

private AnimationListener mAnimationListener; 

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); 
} 

public void setAnimationListener(AnimationListener listener){ 
    this.mAnimationListener = listener; 
} 

public void play(final int pFrameNo) { 

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

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

      // Callback when animation ends. 
      if(mAnimationListener != null){ 
       mAnimationListener.onAnimationEnd(); 
      } 
     } 
    }, 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); 

      // Callback when animation ends. 
      if(mAnimationListener != null){ 
       mAnimationListener.onAnimationEnd(); 
      } 
     } 
    }, pFrameNo == mLastFrameNo && mBreakDelay > 0 ? mBreakDelay : mDuration); 
} 


public static interface AnimationListener { 
    public void onAnimationEnd(); 
    // You can add onAnimationStart(), and do the same thing like onAnimationEnd. 
} 
}; 

總是建議您首先瀏覽Android SDK附帶的Animation API,在實現自己的SDK之前查看是否適合您。

希望這能幫到你。

+0

謝謝你這是我尋找的解決方案,我沒有嘗試,但即時去現在,我不得不使這個類,因爲animationdrawable保持超過虛擬機預算我有大約80個全幀,我即將gona現在嘗試 – JRowan

+0

你保存我從過去的48小時直接研究一個解決方案,非常感謝你,你使用!= null來設置onAnimationRepeat()?再次感謝你,即將去刪除我所有關於此問題的其他問題現在,這是我第一次設置AnimationListener – JRowan

+1

我很高興這對你有用。當您使用AniamtionDrawable並獲取OOM錯誤時,您的代碼可能有問題。檢查'mAnimation!= null'以避免NPE總是很好的習慣,你可以對'onAimationRepeat()'做同樣的事情,只要把調用放到適當的地方即可。 – Wenhui

相關問題