2013-04-06 124 views
0

所以我有一個AnimationDrawable在屏幕上移動一個字符一個空格。動畫工作正常,但我需要刷新屏幕刷新GUI的其餘部分。基本上當地圖移動時,遊戲必須刷新屏幕以更新新的位置。重繪的代碼位於遊戲類的內部,動畫位於顯示實際遊戲板的gridview的圖像適配器中。這是麻煩的兩行代碼。如何在繼續執行代碼之前等待AnimationDrawable結束?

playerAdapter.animateLeft(); 
    redraw(); 

第一行調用具有需要發生的兩個動畫的適配器,都需要700ms。然後,重新更新電路板本身。問題是,重繪不會等待動畫。我嘗試過使用睡眠和類似的東西,但這只是暫停整個該死的事情,什麼也沒有發生。我想我需要使用線程或處理程序,但我不確定這是如何工作的。有任何想法嗎?所有的幫助是非常讚賞:)

回答

10

嘗試:

YourAnimation.setAnimationListener(new Animation.AnimationListener() { 
    @Override 
    public void onAnimationStart(Animation animation) { } 

    @Override 
    public void onAnimationEnd(Animation animation) { 
     //Ended 
    } 

    @Override 
    public void onAnimationRepeat(Animation animation) { } 
}); 

編輯:哎呀。沒有閱讀可繪製的部分。下面是我用它來檢查是否所有的幀是通過遞歸函數:

private void checkIfAnimationDone(AnimationDrawable anim){ 
     final AnimationDrawable a = anim; 
     int timeBetweenChecks = 300; 
     Handler h = new Handler(); 
     h.postDelayed(new Runnable(){ 
      public void run(){ 
       if (a.getCurrent() != a.getFrame(a.getNumberOfFrames() - 1)){ 
        checkIfAnimationDone(a); 
       } else{ 
        Toast.makeText(getApplicationContext(), "ANIMATION DONE!", Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }, timeBetweenChecks); 
    }; 

您也可以登錄的時間,當你啓動動畫,並添加持續時間(你的手知道之前)將其獲得的結局時間。但是,這可能不準確,因爲設置和啓動動畫也需要一些時間。

1

另一個有趣的解決方案:

animation.start(); 
long totalDuration = 0; 
for(int i = 0; i< animation.getNumberOfFrames();i++){ 
    totalDuration += animation.getDuration(i); 
}      
Timer timer = new Timer(); 
TimerTask timerTask = new TimerTask(){ 
    @Override 
     public void run() { 
       animation.stop(); 
    } 
}; 
timer.schedule(timerTask, totalDuration); 
相關問題