android中的動(dòng)畫(huà)分 View Animation和Property Animation兩大類(lèi)
View Animation包括Tween Animation(補(bǔ)間動(dòng)畫(huà))和Frame Animation(逐幀動(dòng)畫(huà));
Tween Animation:通過(guò)對(duì)場(chǎng)景里的對(duì)象不斷做圖像變換(平移、縮放蝇棉、旋轉(zhuǎn))產(chǎn)生動(dòng)畫(huà)效果,即是一種漸變動(dòng)畫(huà)偎蘸;
Frame Animation:順序播放事先做好的圖像,是一種畫(huà)面轉(zhuǎn)換動(dòng)畫(huà)瞬内。
Property Animation? 包括ValueAnimator和ObjectAnimator迷雪;
Property Animation:屬性動(dòng)畫(huà),通過(guò)動(dòng)態(tài)地改變對(duì)象的屬性從而達(dá)到動(dòng)畫(huà)效果虫蝶,屬性動(dòng)畫(huà)為API 11新特性章咧。
屬性動(dòng)畫(huà)是怎么實(shí)現(xiàn)的?
屬性動(dòng)畫(huà)的運(yùn)行機(jī)制是通過(guò)不斷地對(duì)值進(jìn)行操作來(lái)實(shí)現(xiàn)的能真,而初始值和結(jié)束值之間的動(dòng)畫(huà)過(guò)渡就是由ValueAnimator這個(gè)類(lèi)來(lái)負(fù)責(zé)計(jì)算的赁严。它的內(nèi)部使用一種時(shí)間循環(huán)的機(jī)制來(lái)計(jì)算值與值之間的動(dòng)畫(huà)過(guò)渡调限,我們只需要將初始值和結(jié)束值提供給ValueAnimator,并且告訴它動(dòng)畫(huà)所需運(yùn)行的時(shí)長(zhǎng)误澳,那么ValueAnimator就會(huì)自動(dòng)幫我們完成從初始值平滑地過(guò)渡到結(jié)束值這樣的效果。除此之外秦躯,ValueAnimator還負(fù)責(zé)管理動(dòng)畫(huà)的播放次數(shù)忆谓、播放模式、以及對(duì)動(dòng)畫(huà)設(shè)置監(jiān)聽(tīng)器等
為什么要有屬性動(dòng)畫(huà)?
Property Animator能實(shí)現(xiàn)補(bǔ)間動(dòng)畫(huà)無(wú)法實(shí)現(xiàn)的功能
View Animation僅能對(duì)指定的控件做動(dòng)畫(huà)踱承,而Property Animator是通過(guò)改變控件某一屬性值來(lái)做動(dòng)畫(huà)的倡缠。
補(bǔ)間動(dòng)畫(huà)雖能對(duì)控件做動(dòng)畫(huà),但并沒(méi)有改變控件內(nèi)部的屬性值茎活。而Property Animator則是恰恰相反昙沦,Property Animator是通過(guò)改變控件內(nèi)部的屬性值來(lái)達(dá)到動(dòng)畫(huà)效果的
View Animation和PropertyAnimation有什么不同?
1、引入時(shí)間不同:View Animation是API Level 1就引入的载荔。Property Animation是API Level 11引入的盾饮,即Android 3.0才開(kāi)始有Property ? ? ? ?Animation相關(guān)的API。
2懒熙、所在包名不同:View Animation在包android.view.animation中丘损。而Property Animation API在包 android.animation中。
3工扎、動(dòng)畫(huà)類(lèi)的命名不同:View Animation中動(dòng)畫(huà)類(lèi)取名都叫XXXXAnimation,而在Property Animator中動(dòng)畫(huà)類(lèi)的取名則叫XXXXAnimator
Tween Animation有四種形式:
l? alpha???? ???????? 漸變透明度動(dòng)畫(huà)效果
l? scale ? ? ? ? ? ? ? 漸變尺寸伸縮動(dòng)畫(huà)效果
l? translate ? ? ? ? 畫(huà)面位置移動(dòng)動(dòng)畫(huà)效果
l? rotate ? ? ? ? ? ? ?畫(huà)面旋轉(zhuǎn)動(dòng)畫(huà)效果
Tween動(dòng)畫(huà)的實(shí)現(xiàn)原理
通過(guò)view的matrix和alpha變量對(duì)view進(jìn)行修改徘钥,但是并不會(huì)修改view自身屬性。
Frame Animation
Frame Animation是順序播放事先做好的圖像肢娘,跟電影類(lèi)似呈础。不同于animation package,Android SDK提供了另外一個(gè)類(lèi)AnimationDrawable來(lái)定義使用Frame Animation橱健。
這里有點(diǎn)不同的是而钞,利用AnimationDrawable實(shí)現(xiàn)動(dòng)畫(huà)時(shí),本身并沒(méi)有提供接口來(lái)監(jiān)聽(tīng)動(dòng)畫(huà)的狀態(tài)(開(kāi)始拘荡,結(jié)束)笨忌,需要自己處理。
Property Animation? 包括ValueAnimator和ObjectAnimator俱病;
ValueAnimator和ObjectAnimator有什么不同官疲?
ValueAnimator只不過(guò)是對(duì)值進(jìn)行了一個(gè)平滑的動(dòng)畫(huà)過(guò)渡,而ObjectAnimator就不同了亮隙,它是可以直接對(duì)任意對(duì)象的任意屬性進(jìn)行動(dòng)畫(huà)操作的途凫,比如說(shuō)View的alpha屬性。雖說(shuō)ObjectAnimator會(huì)更加常用一些溢吻,但是它其實(shí)是繼承自ValueAnimator的维费,底層的動(dòng)畫(huà)實(shí)現(xiàn)機(jī)制也是基于ValueAnimator來(lái)完成的
ObjectAnimator? 動(dòng)畫(huà)的執(zhí)行類(lèi)
為了能讓動(dòng)畫(huà)直接與對(duì)應(yīng)控件相關(guān)聯(lián)果元,以使我們從監(jiān)聽(tīng)動(dòng)畫(huà)過(guò)程中解放出來(lái),谷歌的開(kāi)發(fā)人員在ValueAnimator的基礎(chǔ)上犀盟,又派生了一個(gè)類(lèi)ObjectAnimator;
ObjectAnimator做動(dòng)畫(huà)而晒,并不是根據(jù)控件xml中的屬性來(lái)改變的,而是通過(guò)指定屬性所對(duì)應(yīng)的set方法來(lái)改變的
(1)阅畴、setRotationX倡怎、setRotationY與setRotation
? ? ? setRotationX(float rotationX):表示圍繞X軸旋轉(zhuǎn),rotationX表示旋轉(zhuǎn)度數(shù)
? ? ? setRotationY(rotationY):表示圍繞Y軸旋轉(zhuǎn)贱枣,rotationY表示旋轉(zhuǎn)度數(shù)
? ? ? setRotation(float rotation):表示圍繞Z旋轉(zhuǎn),rotation表示旋轉(zhuǎn)度數(shù)
(2)监署、setTranslationX與setTranslationY?
? ? setTranslationX(float translationX) :表示在X軸上的平移距離,以當(dāng)前控件為原點(diǎn),向右為正方向纽哥,參數(shù)translationX表示移動(dòng)的距離钠乏。
? ? setTranslationY(float translationY) :表示在Y軸上的平移距離,以當(dāng)前控件為原點(diǎn)春塌,向下為正方向晓避,參數(shù)translationY表示移動(dòng)的距離。
(3)只壳、setScaleX與setScaleY
? setScaleX(float scaleX):在X軸上縮放够滑,scaleX表示縮放倍數(shù)
? setScaleY(float scaleY):在Y軸上縮放,scaleY表示縮放倍數(shù)
ValueAnimator 動(dòng)畫(huà)的執(zhí)行類(lèi)
這個(gè)Animation是針對(duì)值的吕世!ValueAnimator不會(huì)對(duì)控件做任何操作 我們可以給它設(shè)定從哪個(gè)值運(yùn)動(dòng)到哪個(gè)值彰触,通過(guò)監(jiān)聽(tīng)這些值的漸變過(guò)程來(lái)自己操作控件。以前我們?cè)v過(guò)Scroller類(lèi)命辖,Scroller類(lèi)也是不會(huì)對(duì)控件操作的况毅,也是通過(guò)給他設(shè)定滾動(dòng)值和時(shí)長(zhǎng),它會(huì)自己計(jì)算滾動(dòng)過(guò)程尔艇,然后我們需要監(jiān)聽(tīng)它的動(dòng)畫(huà)過(guò)程來(lái)自己操作控件尔许,ValueAnimator的原理與Scroller類(lèi)相似?
第一步:創(chuàng)建ValueAnimator實(shí)例
創(chuàng)建實(shí)例
ValueAnimator.ofInt創(chuàng)建了一個(gè)值從0到400的動(dòng)畫(huà),動(dòng)畫(huà)時(shí)長(zhǎng)是1s
第二步:添加監(jiān)聽(tīng)
AnimatorListener
AnimatorListener中终娃,主要是監(jiān)聽(tīng)Animation的四個(gè)狀態(tài)味廊,start、end棠耕、cancel余佛、repeat;當(dāng)動(dòng)畫(huà)開(kāi)始時(shí)窍荧,會(huì)調(diào)用onAnimationStart(Animator animation)方法辉巡,當(dāng)動(dòng)畫(huà)結(jié)束時(shí)調(diào)用onAnimationEnd(Animator animation),當(dāng)動(dòng)畫(huà)取消時(shí)蕊退,調(diào)用onAnimationCancel(Animator animation)函數(shù)郊楣,當(dāng)動(dòng)畫(huà)重復(fù)時(shí)憔恳,會(huì)調(diào)用onAnimationRepeat(Animator animation)函數(shù)。
AnimatorUpdateListener
三净蚤、移除監(jiān)聽(tīng)
針對(duì)AnimatorUpdateListener和AnimatorListener钥组,每個(gè)監(jiān)聽(tīng)器都有兩個(gè)方法來(lái)移除
ValueAnimator和ObjectAnimator除了通過(guò)ofInt(),ofFloat(),ofObject()創(chuàng)建實(shí)例外,還都有一個(gè)ofPropertyValuesHolder()方法來(lái)創(chuàng)建實(shí)例
PropertyValuesHolder 這個(gè)類(lèi)的意義就是今瀑,它其中保存了動(dòng)畫(huà)過(guò)程中所需要操作的屬性和對(duì)應(yīng)的值
AnimatorSet 用于控制一組動(dòng)畫(huà)的執(zhí)行:線性程梦,一起,每個(gè)動(dòng)畫(huà)的先后執(zhí)行等放椰。
插值器
插值器,也叫加速器 是用來(lái)控制動(dòng)畫(huà)區(qū)間的值被如何計(jì)算出來(lái)的Interpolator?屬性是Animation類(lèi)的一個(gè)XML屬性 所以alpha愉粤、scale砾医、rotate、translate衣厘、set都會(huì)繼承得到這個(gè)屬性如蚜。Interpolator被譯為插值器?其實(shí)他是一個(gè)指定動(dòng)畫(huà)如何變化的東東,跟PS里的動(dòng)作有點(diǎn)類(lèi)似
Evaluator ?就是將從加速器返回的數(shù)字進(jìn)度轉(zhuǎn)成對(duì)應(yīng)的數(shù)字值影暴。
Evaluator ? ?其實(shí)就是一個(gè)轉(zhuǎn)換器错邦,他能把小數(shù)進(jìn)度轉(zhuǎn)換成對(duì)應(yīng)的數(shù)值位置
二、scale標(biāo)簽 縮放(從控件中心點(diǎn)型宙,從0放大到1.4倍撬呢,保持結(jié)束時(shí)的狀態(tài))
三、rotate標(biāo)簽 旋轉(zhuǎn)(從控件中心點(diǎn)妆兑,從0放大到1.4倍魂拦,保持結(jié)束時(shí)的狀態(tài))
四、alpha標(biāo)簽 (將透明度從0變成1.0)?
五搁嗓、translate標(biāo)簽 位移(把控件從(0芯勘,0)平移到(-200,-200)的位置腺逛,保持結(jié)束時(shí)狀態(tài)不變)
Animation類(lèi)是所有動(dòng)畫(huà)(scale荷愕、alpha、translate棍矛、rotate)的基類(lèi)安疗,
ScaleAnimation 縮放
AlphaAnimation 透明度
RotateAnimation 旋轉(zhuǎn)
TranslateAnimation 位移
AnimationSet 定義動(dòng)作類(lèi)的集合 它是沒(méi)有XML屬性的
alphaAnim =newAlphaAnimation(1.0f,0.1f);
scaleAnim?=newScaleAnimation(0.0f,1.4f,0.0f,1.4f,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f);
rotateAnim?=newRotateAnimation(0,720,?Animation.RELATIVE_TO_SELF,0.5f,?Animation.RELATIVE_TO_SELF,0.5f);
setAnim=newAnimationSet(true);
setAnim.addAnimation(alphaAnim);
setAnim.addAnimation(scaleAnim);
setAnim.addAnimation(rotateAnim);
setAnim.setDuration(3000);
setAnim.setFillAfter(true);
AnimatorInflater 用戶加載屬性動(dòng)畫(huà)的xml文件
TypeEvaluator? 類(lèi)型估值,主要用于設(shè)置動(dòng)畫(huà)操作屬性的值够委。
TimeInterpolator 時(shí)間插值茂契,上面已經(jīng)介紹。