什么是Android屬性動(dòng)畫(huà)
屬性動(dòng)畫(huà)(Property Animation)系統(tǒng)是一個(gè)健壯的動(dòng)畫(huà)框架系統(tǒng),它可以滿足你大部分動(dòng)畫(huà)需求。不管動(dòng)畫(huà)對(duì)象是否已經(jīng)繪制到屏幕上,你都可以在動(dòng)畫(huà)執(zhí)行過(guò)程中改變它任意的屬性值。一個(gè)屬性動(dòng)畫(huà)會(huì)在一段特定長(zhǎng)度的時(shí)間內(nèi)改變一個(gè)屬性(一個(gè)對(duì)象中的字段)的值。你可以通過(guò)以下幾步定義一個(gè)動(dòng)畫(huà):指定你要執(zhí)行動(dòng)畫(huà)的屬性,比如動(dòng)畫(huà)對(duì)象(View)在屏幕上的位置,指定執(zhí)行時(shí)長(zhǎng),指定你希望的屬性的變化值。
同類技術(shù)對(duì)比:
·
補(bǔ)間動(dòng)畫(huà)(Tween Animation)
a. 漸變動(dòng)畫(huà)支持四種類型:平移(Translate)、旋轉(zhuǎn)(Rotate)、縮放(Scale)、不透明度(Alpha)。
b. 只是顯示的位置變動(dòng),View的實(shí)際位置未改變,表現(xiàn)為View移動(dòng)到其他地方,點(diǎn)擊事件仍在原處才能響應(yīng)。
c. 組合使用步驟較復(fù)雜。
d. View Animation 也是指此動(dòng)畫(huà)。
·
幀動(dòng)畫(huà)(Frame Animation)
a. 用于生成連續(xù)的Gif效果圖。
b. Drawable Animation也是指此動(dòng)畫(huà)。
·
屬性動(dòng)畫(huà)(Property Animation)
a. 支持對(duì)所有View能更新的屬性的動(dòng)畫(huà)(需要屬性的setXxx()和getXxx())
b. 更改的是View實(shí)際的屬性,所以不會(huì)影響其在動(dòng)畫(huà)執(zhí)行后所在位置的正常使用。
c. Android3.0 (API11)及以后出現(xiàn)的功能,3.0之前的版本可使用github第三方開(kāi)源庫(kù)nineoldandroids.jar進(jìn)行支持。
屬性動(dòng)畫(huà)組成部分、相關(guān)類介紹:
1.
ObjectAnimator :對(duì)象動(dòng)畫(huà)執(zhí)行類。
2.
ValueAnimator :值動(dòng)畫(huà)執(zhí)行類,常配合AnimatorUpdateListener使用。
3.
PropertyValuesHolder : 屬性存儲(chǔ)器,為兩個(gè)執(zhí)行類提供更新多個(gè)屬性的功能。
4.
Keyframe :為 PropertyValuesHolder提供多個(gè)關(guān)鍵幀的操作值。
5.
AnimatorSet :一組動(dòng)畫(huà)的執(zhí)行集合類:設(shè)置執(zhí)行的先后順序,時(shí)間等。
6.
AnimatorUpdateListener :動(dòng)畫(huà)更新監(jiān)聽(tīng)。
7.
AnimatorListener :動(dòng)畫(huà)執(zhí)行監(jiān)聽(tīng),在動(dòng)畫(huà)開(kāi)始、重復(fù)、結(jié)束、取消時(shí)進(jìn)行回調(diào)。
8.
AnimatorInflater :加載屬性動(dòng)畫(huà)的xml文件。
9.
TypeEvaluator :類型估值,用于設(shè)置復(fù)雜的動(dòng)畫(huà)操作屬性的值。
10.
TimeInterpolator :時(shí)間插值,用于控制動(dòng)畫(huà)執(zhí)行過(guò)程。
1. ObjectAnimator對(duì)象動(dòng)畫(huà)執(zhí)行類
介紹:
1. 通過(guò)靜態(tài)方法ofInt、ofFloat、ofObject、ofPropertyValuesHolder 獲取類對(duì)象。
2. 根據(jù)屬性值類型選擇靜態(tài)方法,如view的setLeft(int left) 則選用ofInt方法, setY(float y)則選用ofFloat方法。
3. 同ValueAnimator一樣,可以進(jìn)行串聯(lián)式使用,示例如下。
示例:
· 簡(jiǎn)單示例:View的橫向移動(dòng)
· 復(fù)合示例:View彈性落下然后彈起,執(zhí)行一次。
2. ValueAnimator 值動(dòng)畫(huà)執(zhí)行類
介紹
1. 構(gòu)造方法與ObjectAnimator類似。
2. 與ObjectAnimator的區(qū)別在于ValueAnimator構(gòu)造函數(shù)的參數(shù)中不包含動(dòng)畫(huà)“屬性”信息。
3. 優(yōu)點(diǎn):結(jié)合動(dòng)畫(huà)更新監(jiān)聽(tīng)onAnimationUpdate使用,可以在回調(diào)中不斷更新View的多個(gè)屬性,使用起來(lái)更加靈活。
示例:
View向右下角移動(dòng):
3. PropertyValuesHolder 屬性存儲(chǔ)器
介紹:
為ValueAnimator提供多個(gè)操作屬性及相應(yīng)的執(zhí)行參數(shù):
示例:
同時(shí)修改View多個(gè)屬性的動(dòng)畫(huà):
4. Keyframe 關(guān)鍵幀
介紹:
為 PropertyValuesHolder提供關(guān)鍵幀的操作值集合。
示例:
以下示例表示該P(yáng)ropertyValuesHolder進(jìn)行的旋轉(zhuǎn)(rotation)動(dòng)畫(huà),在執(zhí)行時(shí)間在0%, 50%, 100%時(shí),其旋轉(zhuǎn)角度分別為0°, 360°, 0°。動(dòng)畫(huà)執(zhí)行過(guò)程中自動(dòng)進(jìn)行補(bǔ)間。表現(xiàn)為自旋360°后再轉(zhuǎn)回來(lái)。
5. AnimatorSet 執(zhí)行集合類
介紹:
1. 為多個(gè)屬性動(dòng)畫(huà)提供播放順序控制(注意play,with,after,before的用法)
2. AnimatorSet類與AnimationSet類不能搞混,AnimatorSet在3.0及以上版本中才有。3.0之前的版本可使用第三方開(kāi)源庫(kù)nineoldandroids.jar進(jìn)行支持,功能使用完全一致
示例:
以下示例動(dòng)畫(huà)的播放順序?yàn)?br />
1. 播放 bounceAnim.
2. 同時(shí)播放 squashAnim1, squashAnim2, stretchAnim1, stretchAnim2
3. 接著播放 bounceBackAnim.
4. 最后播放 fadeAnim.
詳細(xì)代碼參見(jiàn):
http://developer.android.com/samples/index.html
6. AnimatorUpdateListener 動(dòng)畫(huà)更新監(jiān)聽(tīng)
介紹:
1. 在動(dòng)畫(huà)執(zhí)行過(guò)程中,每次更新都會(huì)調(diào)用該回調(diào),可以在該回調(diào)中手動(dòng)更新view的屬性。
2. 當(dāng)調(diào)用的屬性方法中沒(méi)有進(jìn)行View的重繪時(shí),需要進(jìn)行手動(dòng)觸發(fā)重繪。設(shè)置AnimatorUpdateListener監(jiān)聽(tīng),并在onAnimationUpdate回調(diào)中執(zhí)行View的invalidate()方法。
示例:
1. 在回調(diào)中手動(dòng)更新View對(duì)應(yīng)屬性:
2. 在自定義View內(nèi)部用于引發(fā)重繪
7. AnimatorListener 動(dòng)畫(huà)執(zhí)行監(jiān)聽(tīng)
介紹:
1. 實(shí)現(xiàn)AnimatorListener中的方法可在動(dòng)畫(huà)執(zhí)行全程進(jìn)行其他任務(wù)的回調(diào)執(zhí)行。
2. 也可以添加AnimatorListener的實(shí)現(xiàn)類AnimatorListenerAdapter,僅重寫(xiě)需要的監(jiān)聽(tīng)即可。
示例:
8. AnimatorInflater 動(dòng)畫(huà)加載器
介紹:
1. 屬性動(dòng)畫(huà)可以通過(guò)xml文件的形式加載。
2. set標(biāo)簽內(nèi)的animator也可單獨(dú)使用。
3. XML語(yǔ)法如下:
<set android:ordering=["together" ¦ "sequentially"]>
<objectAnimator
android:propertyName="string"
android:duration="int"
android:valueFrom="float ¦ int ¦ color"
android:valueTo="float ¦ int ¦ color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode=["repeat" ¦ "reverse"]
android:valueType=["intType" ¦ "floatType"]/>
<animator
android:duration="int"
android:valueFrom="float ¦ int ¦ color"
android:valueTo="float ¦ int ¦ color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode=["repeat" ¦ "reverse"]
android:valueType=["intType" ¦ "floatType"]/>
<set>
...
</set>
</set>
示例:
xml文件:
9. TypeEvaluator 類型估值
介紹:
1. TypeEvaluator可傳入?yún)?shù)值的類型(本例為PointF)
2. 重寫(xiě)函數(shù)public T evaluate(float fraction, T startValue, T endValue);實(shí)現(xiàn)不同需求值的計(jì)算。
3. 注意fraction的使用,fraction是從開(kāi)始到結(jié)束的分度值0.0 -> 1.0
示例:
10. TimeInterpolator 時(shí)間插值器
1. 幾種常見(jiàn)的插值器:
Interpolator對(duì)象 |
資源ID |
功能作用 |
AccelerateDecelerateInterpolator |
@android:anim/accelerate_decelerate_interpolator |
先加速再減速 |
AccelerateInterpolator |
@android:anim/accelerate_interpolator |
加速 |
AnticipateInterpolator |
@android:anim/anticipate_interpolator |
先回退一小步然后加速前進(jìn) |
AnticipateOvershootInterpolator |
@android:anim/anticipate_overshoot_interpolator |
在上一個(gè)基礎(chǔ)上超出終點(diǎn)一小步再回到終點(diǎn) |
BounceInterpolator |
@android:anim/bounce_interpolator |
最后階段彈球效果 |
CycleInterpolator |
@android:anim/cycle_interpolator |
周期運(yùn)動(dòng) |
DecelerateInterpolator |
@android:anim/decelerate_interpolator |
減速 |
LinearInterpolator |
@android:anim/linear_interpolator |
勻速 |
OvershootInterpolator |
@android:anim/overshoot_interpolator |
快速到達(dá)終點(diǎn)并超出一小步最后回到終點(diǎn) |
2. 自定義插值器
a. 實(shí)現(xiàn)Interpolator(TimeInterpolator)接口
b. 重寫(xiě)接口函數(shù)float getInterpolation(float input);
以上源代碼下載地址:http://pan.baidu.com/s/1mgFXOkK
本文版權(quán)歸傳智播客Android培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客Android培訓(xùn)學(xué)院
首發(fā):http://xamj520.com/android/