Android View動畫和屬性動畫簡單解析:

張朝旭發表於2017-11-08

簡介:View動畫通過對場景裡的物件不斷做影象變換(平移、縮放、旋轉、透明度)從而產生動畫效果,是一種漸近式動畫,並且View動畫支援自定義。
1.View動畫主要分為四類:TranslateAnimation,ScaleAnimation,RotateAnimation,AlphaAnimation,可通過XML或者Java程式碼宣告使用,動畫XML檔案需要放在res/anim/filename.xml中。
例子:

<set xmlns:android="[http://schemas.android.com/apk/res/android](http://schemas.android.com/apk/res/android)"
    android:interpolator=""
    android:shareInterpolator="["true" | "false"] >
    <alpha
        android:fromAlpha="float"
        android:toAlpha="float" />
    <scale
        android:fromXScale="float"
        android:toXScale="float"
        android:fromYScale="float"
        android:toYScale="float"
        android:pivotX="float"
        android:pivotY="float" />
    <translate 
        android:fromXDelta="float" 
        android:toXDelta="float"
        android:fromYDelta="float"
        android:toYDelta="float" />
    <rotate 
        android:fromDegrees="float"
        android:toDegrees="float"
        android:pivotX="float"
        android:pivotY="float" />
</set>複製程式碼

Java程式碼:

// 使用Java程式碼載入XML動畫
Animation animation = AnimationUtils.loadAnimation(this, R.anim.animation_test);
mButton.startAnimation(animation);
// 使用Java程式碼建立動畫
AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);複製程式碼

2.View動畫既可以是單個動畫,也可以由一系列動畫組成。
3.幾個標籤解讀:
set:
表示動畫集合,對應AnimationSet類,它可以包含若干個動畫,並且它的內部也是可以巢狀其他動畫集合的。
android:interpolator:
表示動畫集合所採用的插值器,什麼是插值器呢?它影響動畫的速度,比如非勻速動畫就需要通過插值器來控制動畫的播放過程。屬性可不指定,預設為@android:anim/accelerate_decelerate_interpolator,即加速減速插值器。
android:shareInterpolator:
表示集合中的動畫是否和集合共享同一個插值器。如果集合不指定插值器,那麼子動畫就需要單獨指定所需的插值器或者使用預設值。
其餘的屬性網上都能查到,這裡就不詳細描述了。

二:屬性動畫

簡介:屬性動畫通過動態地改變相關物件的屬性,比如長寬等,從而實現動畫效果,屬性動畫為API 11(Android 3.0)以上的新特性,在低版本無法直接使用屬性動畫,但仍然可通過相容庫(NineOldAndroids)去使用。
屬性動畫有ValueAnimator、ObjectAnimator和AnimatorSet等概念。其中ObjectAnimator繼承自ValueAnimator、AnimatorSet是動畫集合,可以定義一組動畫。
(1)使用
舉例:改變一個物件(myObject)的translationY屬性,讓其沿著Y軸上平移一段距離:

ObjectAnimator.ofFloat(myObject, "translationY", -myObject.getHeight()).start();複製程式碼

(2)插值器和估值器:
屬性動畫有兩個新概念:
插值器:根據時間流逝的百分比來計算出屬性值改變的百分比,對應的介面是Interpolator;
估值器:根據屬性改變的百分比計算出屬性的改變值,對應的介面是TypeEvaluator;
程式碼設定:

ValueAnimator.setEvaluator(TypeEvaluator evaluator)
ValueAnimator.setInterpolator(TimeInterpolator value)複製程式碼

(3)屬性動畫的監聽器
屬性動畫提供了監聽器用於監聽動畫的播放過程。主要有如下兩個介面:AnimatorUpdateListener和AnimatorListener。

public static interface AnimatorListener {
     void onAnimationStart(Animator animation);
     void onAnimationEnd(Animator animation);
     void onAnimationCancel(Animator animation);
     void onAnimationRepeat(Animator animation);
}複製程式碼

它可以監聽動畫的開始、結束、取消以及重複播放。系統提供了AnimatorListener的介面卡類AnimatorListenerAdapter。
AnimatorUpdateListener:

public static interface AnimatorUpdateListener { 
     void onAnimationUpdate(ValueAnimator animation);
}複製程式碼

AnimatorUpdateListener會監聽整個動畫過程,動畫是由許多幀組成的,每播放一幀,onAnimationUpdate就會被呼叫一次。
(4)對任意屬性做動畫
屬性動畫的原理:屬性動畫要求動畫作用的物件提供該屬性的get和set方法,屬性動畫根據外界傳遞的該屬性的初始值和最終值,以動畫的效果多次去呼叫set方法,每次傳遞給set方法的值都不一樣,確切地說是隨著時間的推移,所傳遞的值越來越接近最終值。
總結,對object的屬性abc做動畫,需滿足條件:
(1)object必須提供setAbc方法,如果動畫的時候沒有傳遞初始值,那麼還要提供getAbc方法,因為系統要去取abc屬性的初始值;
(2)object的setAbc對屬性abc所做的改變必須能夠通過某種方法反映出來,比如會帶來UI的改變。
建議:
①、給物件加上get和set方法;
②、用一個類來包裝原始物件,間接為其提供get和set方法;
③、採用ValueAnimator,監聽動畫過程,實現屬性的變化。

這篇文章會同步到我的個人日誌,如有問題,請大家踴躍提出,謝謝大家!

相關文章