2012-04-10 95 views
10

我試圖將兩個動畫「鏈接」在一起,所以當一個完成時,另一個開始。除了一個問題,這是行得通的。第一個動畫完成後,它會回到原始位置。我將填充設置爲true。我還有什麼遺漏?Android鏈接動畫

這是我使用的代碼。請注意,這是在擴展LinearLayout的類中。

// FIRST ANIMATION 
mAnimation = new TranslateAnimation(0, PANEL_END_X, 0, 0); 
mAnimation.setDuration(PANEL_TRANSITION_TIME); 
mAnimation.setFillAfter(true); 

mAnimation.setAnimationListener(new Animation.AnimationListener() { 
    public void onAnimationEnd(Animation animation) { 

     // FIRST ANIMATION COMPLETE, CALL THE SECOND ANIMATION 
     startAnimation(mAlphaAnimation); 
    } 
}); 

// SECOND ANIMATION  
mAlphaAnimation = new AlphaAnimation(1.0f, 0.0f); 
mAlphaAnimation.setDuration(PANEL_ALPHA_TRANSITION_TIME); 
mAlphaAnimation.setFillAfter(true); 

解決方案:

我能得到這個工作讓我滿意的,唯一的方法是使用一個AnimationSet,但設置的起始偏移量第二的動畫,開始偏移第一動畫+持續時間,加上一點填充。在我的情況下,他們不必完全確切。

我嘗試使用CommonsWare建議的各種值進行播放,但我總是會得到某種類型的「捕捉」效果,其中值會在採用新值之前恢復爲其原始值。

回答

5

第一次動畫完成後,它會回到它的原始位置。我將填充設置爲true。我還有什麼遺漏?

動畫是瞬態效果。如果您希望效果是永久性的,您必須自己在onAnimationEnd()中執行此操作。在TranslateAnimation的情況下,您需要更改LayoutParams或受影響的小部件的某些內容,以永久保留它的最終位置。或者,如果您將其從屏幕上翻譯出來,請將可見性設置爲View.GONE

+2

AnimationSet.Builder最終成爲我所需要的:http://developer.android.com/reference/android/animation/AnimatorSet.Builder.html。 – Steve 2012-04-11 23:41:38

2

嘗試將它們組合成一個AnimationSet

+0

不執行他們兩個同時關係嗎?我希望一個動畫在另一個完成後開始。 – Steve 2012-04-10 16:01:13

+0

是的,你說得對,對不起。我誤解了Javadoc中的這句話:「兒童動畫的變形是按照它們被添加的順序來應用的」 – 2012-04-10 16:03:25

+0

這句話令人困惑,似乎暗示它按照我的意願去做。不管怎麼說,多謝拉。 – Steve 2012-04-10 16:04:28

8

我發現我認爲是API級別11和以上使用AnimationSet.Builder類別的理想解決方案。

Builder對象是一個實用工具類,用於方便地將動畫添加到AnimatorSet以及各種動畫之間的關係。 Builder方法的意圖以及AnimatorSet的play()方法可以以自然的方式表達動畫的依賴關係。如果這些方法適合需要,開發人員也可以使用playTogether()和playSequentially()方法,但是在某些情況下可能會更容易地表達AnimatorSet動畫

例如,這設置了一個AnimatorSet來播放anim1和anim2同時,anim3玩的時候anim2完成,並anim4當anim3完成打:

AnimatorSet s = new AnimatorSet(); 
s.play(anim1).with(anim2); 
s.play(anim2).before(anim3); 
s.play(anim4).after(anim3); 
+0

請注意,這僅適用於API Level 11及更高版本,因此Android 1.x/2.x設備無法使用它。 – CommonsWare 2012-04-12 00:11:01