簡介: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,監聽動畫過程,實現屬性的變化。
這篇文章會同步到我的個人日誌,如有問題,請大家踴躍提出,謝謝大家!