2012-03-25 71 views
1

這是情況。我的活動正在運行,並且我調用了一個函數來啓動一個動畫。一旦這個動畫完成,我需要等待另外2秒鐘,然後正常繼續進程。你建議我做什麼?動畫結束後如何繼續處理?

OnAnimationEnd在我到達迭代結束時並沒有幫助我的情況,我的進程已經從調用函數返回並繼續處理。 你覺得我做什麼?做thread.sleep(動畫持續時間+ 2秒)? 感謝

編輯: OK我想,也許我應該解釋一下我的代碼 正在做的,我有以下代碼

Public class myclassActivity extends Activity{ 
.. 
. 
. 
. 
public void runGame(){ 

    player1.startAnimating(); 
    player2.start Animating(); 
    player3.startAnimating(); 
    updateStatus(); 
    runGame(); 
} 

} 

因此,大家可以看到我的活動不斷給你打電話startAnimating每個球員。其中一些工作,然後動畫1秒完成。

我不希望player2.startAnimation直接啓動,直到player1.startAnimation完成,等等代碼的其餘部分。 目前發生的情況是代碼在動畫仍在運行時完全執行並再次運行。請任何幫助嗎?

+0

什麼對象類型是player1,player2和player3? – Phil 2012-03-26 01:54:27

+0

它們只是普通的java類,不能擴展任何東西。 – Snake 2012-03-26 02:15:07

回答

0

使用postDelayed函數在精確延遲後運行某些東西。例如(2秒延遲):

LinearLayout.postDelayed(new Runnable() { 
    public void run() { 
     //Do something 
    } 
}, 2000); 
+0

它不是我需要運行的東西。我正在恢復我的過程(從動畫返回),所以我需要延遲整個事情 – Snake 2012-03-25 21:39:18

0

如何圍繞由

player1.startAnimating(this) 

傳遞呼叫者實例,然後調用方法等

myclassActivity#animationFinished(this) 

上整理PLAYER1/2的動畫?然後

void animationFinished(Player p) { 
    if (p==player1) { 
     player2.start(); 
    } else if (p==player2) { 
     player3.start(); 
    } 
} 

什麼

+0

感謝您的答案。這將工作,但問題是,代碼設計將是非常糟糕的,因爲你會有一個動畫類調用外部允許的圈子方法 – Snake 2012-03-26 15:15:59

2

遵守本守則是幫助全你。

public class PlayersActivity extends Activity { 
ImageView I1,I2; 
Button B; 
Animation T1,T2; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    I1=(ImageView)findViewById(R.id.i1); 
    I2=(ImageView)findViewById(R.id.i2); 

    B=(Button)findViewById(R.id.b1); 

    B.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      T1=new TranslateAnimation(0,100,0,0); 
      T1.setDuration(1000); 
      I1.startAnimation(T1); 
      T1.setAnimationListener(new AnimationListener() { 

       @Override 
       public void onAnimationStart(Animation animation) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void onAnimationRepeat(Animation animation) { 
        // TODO Auto-generated method stub 

       } 

       @Override 
       public void onAnimationEnd(Animation animation) { 
        T2=new TranslateAnimation(0,100,0,0); 
        T2.setDuration(1000); 
        T2.setStartOffset(2000); 
        I2.startAnimation(T2); 
        T2.setAnimationListener(new AnimationListener() { 

         @Override 
         public void onAnimationStart(Animation animation) { 
          // TODO Auto-generated method stub 

         } 

         @Override 
         public void onAnimationRepeat(Animation animation) { 
          // TODO Auto-generated method stub 

         } 

         @Override 
         public void onAnimationEnd(Animation animation) { 
          T1.setStartOffset(2000); 
          I1.startAnimation(T1); 

         } 
        }); 

       } 
      }); 


     } 
    }); 

} 

}

假設你將開始這兩種方法完成後player3,你將player3 onAnimationEnd(){updateStatus(); runGame();}

+0

感謝您的答案。這可行,但問題是代碼設計會非常糟糕,因爲您將有一個動畫類在其允許的圓圈之外調用方法。 – Snake 2012-03-26 15:15:42

+0

只是我給出了一個示例代碼,您正在調用方法,因此定義onAnimationListener以在onAnimationEnd()中實現您的代碼。你會在那裏調用你的方法。 – VSC 2012-03-27 05:14:16