1. 程式人生 > >用AnimatorSet類來編排多個動畫

用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());}