用AnimatorSet類來編排多個動畫
轉載自:http://www.2cto.com/kf/201207/139085.html
用AnimatorSet類來編排多個動畫
在很多場景中,一個動畫的播放要依賴與另一個動畫的開始或結束。Android系統讓你把這些相互依賴的動畫繫結到一個AnimatorSet物件中,以便能夠指定它們是同時的、順序的、或在指定的延時之後來播放。AnimatorSet物件也能夠彼此巢狀。
以下示例程式碼來自Bouncing Balls示例,它按照以下方式播放Animator物件:
1. 播放bounceAnim
2. 同時播放squashAnim1、squashAnim2、stretchAnim1和stetchAnim2
3. 播放bounceBackAnim
4. 播放fadeAnim
AnimatorSet bouncer = new AnimatorSet();
bouncer.play(bounceAnim).before(squashAnim1);
bouncer.play(squashAnim1).with(squashAnim2);
bouncer.play(squashAnim1).with(stretchAnim1);
bouncer.play(squashAnim1).with(stretchAnim2);
bouncer.play(bounceBackAnim).after(stretchAnim2);
ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
fadeAnim.setDuration(250);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(bouncer).before(fadeAnim);
animatorSet.start();
關於如何使用動畫集的完整示例,請看APIDemo中的Bouncing Balls示例。
動畫監聽器
使用下列介紹的監聽器能夠監聽動畫播放期間的重要事件:
1. Animator.AnimatorListener
onAnimationStart()---動畫開始的時候被呼叫
onAnimationEnd()---動畫結束的時候被呼叫,它不管動畫是如何結束的。
onAnimationRepeate()---動畫重複播放的時候被呼叫
onAnimationCancel()---動畫被取消播放的時候被呼叫。
2. ValueAnimator.AnimatorUpdateListener
onAnimationUpdate()---在動畫的幀上呼叫這個方法。通過監聽這個事件,使用在動畫期間由ValueAnimator物件產生的計算值。要使用這個值,就要用getAnimateValue()方法查詢傳遞到事件中的ValueAnimator物件,以便獲得當前的動畫值。如果使用ValueAnimator類,那麼實現這個監聽器是必須的。
根據屬性或物件的動畫效果,可能需要呼叫View物件上的invalidate()方法,用新的動畫值來強制螢幕的指定區域進行重繪。例如,Drawable物件的顏色屬性的動畫效果,在物件重繪自己的時候,只會導致螢幕的更新。在View物件上的所有屬性的設定器,如setAlpha()、setTranslationX()等方法都會正確的讓View物件失效,因此在呼叫這些方法設定新值的時候,你不需要讓該View物件失效。
如果不實現Animator.AnimatorListener介面的所有方法,你能夠繼承AnimatorListenerAdapter類,來代替對Animator.AnimatorListener介面的實現。AnimatorListenerAdapter類對這些方法提供了空的實現,你可以選擇性的重寫這些方法。
例如,APIDemo中的Bouncing Balls示例就只建立了一個AnimatorListenerdapter類的onAnimationEnd()回撥方法:
ValueAnimatorAnimator fadeAnim =ObjectAnimator.ofFloat(newBall,"alpha",1f,0f);fadeAnim.setDuration(250);fadeAnim.addListener(newAnimatorListenerAdapter(){publicvoid onAnimationEnd(Animator animation){ balls.remove(((ObjectAnimator)animation).getTarget());}