2011-10-07 76 views
28

我必須動畫循環倒數計時器,並通過使用AnimationDrawable動畫ImageView的背景(每個圖像具有相應的切片圓)。問題是用戶有能力暫停這個動畫,所以我必須重新加載動畫,但隨後出現問題。我嘗試將動畫設置爲null,將ImageView的背景設置爲null,設置動畫的可見性,但幾乎沒有任何幫助,因爲幀數保持不變。我必須找到一種解決方法來刪除所有幀並添加新幀或將整個動畫重置爲默認狀態。如何重置AnimationDrawable

第1步 - 初始化動畫(起始幀指數爲0)

timerView.setBackgroundResource(R.drawable.timer_switch); 
timerAnimation = (AnimationDrawable)timerView.getBackground(); 

System.out.println("Number of frames: " + timerAnimation.getNumberOfFrames()); 

for (int frameIndex = startingFrameIndex; frameIndex < 60; frameIndex++) { 
    if (frameIndex < 10) { 
     uri = "drawable/timer_0000" + frameIndex; 
    } else { 
     uri = "drawable/timer_000" + frameIndex; 
    } 

    imageResourceId = getResources().getIdentifier(uri, null, getPackageName()); 
    timerAnimation.addFrame(getResources().getDrawable(imageResourceId), timerImageFrameDuration); 
} 

第2步 - 這裏是棘手的部分,我不知道該怎麼辦。我已經試過的東西:

timerAnimation.stop(); 
timerAnimation.setCallback(null); 
timerAnimation.setVisibility(true, false); 
timerAnimation = null; 

第3步 - 調用第2步後,我打電話第1步中再次,但Sys.out仍顯示60幀的當前數量。 (當點擊暫停按鈕時,此處的起始索引被設置爲最後的隱藏幀)。

歡迎任何想法。

謝謝

+0

能ViewCompat.jumpDrawablesToCurrentState幫助:http://developer.android。 com/reference/android/support/v4/view/ViewCompat.html#jumpDrawablesToCurrentState(android.view.View)? –

回答

12

我有同樣的問題停止動畫會停止在當前幀。我希望它的行爲像iOS,在那裏停止會回到第一幀。此解決方案適用於我:

((AnimationDrawable)(someButton.getBackground())).stop(); 
someButton.setBackgroundDrawable(null); 
someButton.setBackgroundResource(R.drawable.animation); 

這首先停止它(可能不是必需的)。然後它殺死背景動畫。最後,它重新創建背景。

+7

Tigger的答案應該是被接受的答案。 – 2013-11-01 16:51:54

-2

android.view.animation.Animation.reset()不工作嗎?

+2

這是一個AnimationDrawable不是動畫,所以這不是一個選項 –

2

另一種可能的解決方案是爲第一幀和最後一幀使用相同的圖像,並執行以下操作而不是調用stop()方法。

((AnimationDrawable)(someButton.getBackground())).setOneShot(true); 

如果任何人有任何進一步調查。還有一種叫做setVisible(布爾可見,布爾重啓)的方法。但是,這並不適用於我自己。

1

你可以試試public boolean setVisible (boolean visible, boolean restart)它會播放一次動畫。例如:

animationDrawable.setVisible(false, true); 
79

這會盡快stop()已被稱爲派(AnimationDrawable)timerAnimation第一幀:

timerAnimation.stop(); 
timerAnimation.selectDrawable(0); 
+10

國際海事組織,這種解決方案比公認的答案好得多,也便宜。 –

+1

+1,開發者請看這裏。 'stop()'這樣做。 –

+0

這是正確的答案... – legomind