android 動畫常用代碼

  • 組合動畫

    實現組合動畫功能主要需要藉助AnimatorSet這個類,這個類提供了一個play()方法,如果我們向這個方法中傳入一個Animator對象(ValueAnimator或ObjectAnimator)將會返回一個AnimatorSet.Builder的實例,AnimatorSet.Builder中包括以下四個方法:
    • after(Animator anim)   將現有動畫插入到傳入的動畫之後執行
    • after(long delay)   將現有動畫延遲指定毫秒後執行
    • before(Animator anim)   將現有動畫插入到傳入的動畫之前執行
    • with(Animator anim)   將現有動畫和傳入的動畫同時執行

    有了這四個方法,我們就可以完成組合動畫的邏輯了,那麼比如說我們想要讓TextView先從屏幕外移動進屏幕,然後開始旋轉360度,旋轉的同時進行淡入淡出操作,就可以這樣寫:

    [java] view plain copy
    1. ObjectAnimator moveIn = ObjectAnimator.ofFloat(textview, "translationX", -500f, 0f);  
    2. ObjectAnimator rotate = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);  
    3. ObjectAnimator fadeInOut = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);  
    4. AnimatorSet animSet = new AnimatorSet();  
    5. animSet.play(rotate).with(fadeInOut).after(moveIn);  
    6. animSet.setDuration(5000);  
    7. animSet.start();  
  • Animator監聽器


    在很多時候,我們希望可以監聽到動畫的各種事件,比如動畫何時開始,何時結束,然後在開始或者結束的時候去執行一些邏輯處理。這個功能是完全可以實現的,Animator類當中提供了一個addListener()方法,這個方法接收一個AnimatorListener,我們只需要去實現這個AnimatorListener就可以監聽動畫的各種事件了。

    ObjectAnimator是繼承自ValueAnimator的,而ValueAnimator又是繼承自Animator的,因此不管是ValueAnimator還是ObjectAnimator都是可以使用addListener()這個方法的。另外AnimatorSet也是繼承自Animator的,因此addListener()這個方法算是個通用的方法。

    添加一個監聽器的代碼如下所示:

    [java] view plain copy
    1. anim.addListener(new AnimatorListener() {  
    2.     @Override  
    3.     public void onAnimationStart(Animator animation) {  
    4.     }  
    5.   
    6.     @Override  
    7.     public void onAnimationRepeat(Animator animation) {  
    8.     }  
    9.   
    10.     @Override  
    11.     public void onAnimationEnd(Animator animation) {  
    12.     }  
    13.   
    14.     @Override  
    15.     public void onAnimationCancel(Animator animation) {  
    16.     }  
    17. });  

    可以看到,我們需要實現接口中的四個方法,onAnimationStart()方法會在動畫開始的時候調用,onAnimationRepeat()方法會在動畫重複執行的時候調用,onAnimationEnd()方法會在動畫結束的時候調用,onAnimationCancel()方法會在動畫被取消的時候調用。

    但是也許很多時候我們並不想要監聽那麼多個事件,可能我只想要監聽動畫結束這一個事件,那麼每次都要將四個接口全部實現一遍就顯得非常繁瑣。沒關係,爲此Android提供了一個適配器類,叫作AnimatorListenerAdapter,使用這個類就可以解決掉實現接口繁瑣的問題了,如下所示:

    [java] view plain copy
    1. anim.addListener(new AnimatorListenerAdapter() {  
    2. });  
    這裏我們向addListener()方法中傳入這個適配器對象,由於AnimatorListenerAdapter中已經將每個接口都實現好了,所以這裏不用實現任何一個方法也不會報錯。那麼如果我想監聽動畫結束這個事件,就只需要單獨重寫這一個方法就可以了,如下所示:
    [java] view plain copy
    1. anim.addListener(new AnimatorListenerAdapter() {  
    2.     @Override  
    3.     public void onAnimationEnd(Animator animation) {  
    4.     }  
    5. });  
  • 使用XML編寫動畫

  • <animator>  對應代碼中的ValueAnimator
  • <objectAnimator>  對應代碼中的ObjectAnimator
  • <set>  對應代碼中的AnimatorSet

那麼比如說我們想要實現一個從0到100平滑過渡的動畫,在XML當中就可以這樣寫:

[html] view plain copy
  1. <animator xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:valueFrom="0"  
  3.     android:valueTo="100"  
  4.     android:valueType="intType"/>  
而如果我們想將一個視圖的alpha屬性從1變成0,就可以這樣寫:
[html] view plain copy
  1. <objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:valueFrom="1"  
  3.     android:valueTo="0"  
  4.     android:valueType="floatType"  
  5.     android:propertyName="alpha"/>  
其實XML編寫動畫在可讀性方面還是挺高的,上面的內容相信不用我做解釋大家也都看得懂吧。


另外,我們也可以使用XML來完成複雜的組合動畫操作,比如將一個視圖先從屏幕外移動進屏幕,然後開始旋轉360度,旋轉的同時進行淡入淡出操作,就可以這樣寫:

[html] view plain copy
  1. <set xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:ordering="sequentially" >  
  3.   
  4.     <objectAnimator  
  5.         android:duration="2000"  
  6.         android:propertyName="translationX"  
  7.         android:valueFrom="-500"  
  8.         android:valueTo="0"  
  9.         android:valueType="floatType" >  
  10.     </objectAnimator>  
  11.   
  12.     <set android:ordering="together" >  
  13.         <objectAnimator  
  14.             android:duration="3000"  
  15.             android:propertyName="rotation"  
  16.             android:valueFrom="0"  
  17.             android:valueTo="360"  
  18.             android:valueType="floatType" >  
  19.         </objectAnimator>  
  20.   
  21.         <set android:ordering="sequentially" >  
  22.             <objectAnimator  
  23.                 android:duration="1500"  
  24.                 android:propertyName="alpha"  
  25.                 android:valueFrom="1"  
  26.                 android:valueTo="0"  
  27.                 android:valueType="floatType" >  
  28.             </objectAnimator>  
  29.             <objectAnimator  
  30.                 android:duration="1500"  
  31.                 android:propertyName="alpha"  
  32.                 android:valueFrom="0"  
  33.                 android:valueTo="1"  
  34.                 android:valueType="floatType" >  
  35.             </objectAnimator>  
  36.         </set>  
  37.     </set>  
  38.   
  39. </set>  

最後XML文件是編寫好了,那麼我們如何在代碼中把文件加載進來並將動畫啓動呢?只需調用如下代碼即可:

[java] view plain copy
  1. Animator animator = AnimatorInflater.loadAnimator(context, R.animator.anim_file);  
  2. animator.setTarget(view);  
  3. animator.start();  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章