1 背景
不能只分析源碼呀,分析的同時也要整理歸納基礎(chǔ)知識,剛好有人微博私信讓全面說說Android的動畫,所以今天來一發(fā)Android應(yīng)用的各種Animation大集合。英文厲害的請直接移步參考Android Developer。
Android系統(tǒng)提供了很多豐富的API去實(shí)現(xiàn)UI的2D與3D動畫,最主要的劃分可以分為如下幾類:
View Animation:?視圖動畫在古老的Android版本系統(tǒng)中就已經(jīng)提供了,只能被用來設(shè)置View的動畫。
Drawable Animation:?這種動畫(也叫Frame動畫、幀動畫)其實(shí)可以劃分到視圖動畫的類別,專門用來一個一個的顯示Drawable的resources,就像放幻燈片一樣。
Property Animation:?屬性動畫只對Android 3.0(API 11)以上版本的Android系統(tǒng)才有效,這種動畫可以設(shè)置給任何Object,包括那些還沒有渲染到屏幕上的對象。這種動畫是可擴(kuò)展的,可以讓你自定義任何類型和屬性的動畫。
可以看見,當(dāng)前應(yīng)用程序開發(fā)涉及的主要動畫也就這三大類,我們接下來以類別為基礎(chǔ)來慢慢展開說明。
2 View Animation(視圖動畫)使用詳解 2-1 視圖動畫概述
視圖動畫,也叫Tween(補(bǔ)間)動畫可以在一個視圖容器內(nèi)執(zhí)行一系列簡單變換(位置、大小、旋轉(zhuǎn)、透明度)。譬如,如果你有一個TextView對象,您可以移動、旋轉(zhuǎn)、縮放、透明度設(shè)置其文本,當(dāng)然,如果它有一個背景圖像,背景圖像會隨著文本變化。
補(bǔ)間動畫通過XML或Android代碼定義,建議使用XML文件定義,因?yàn)樗呖勺x性、可重用性。
如下是視圖動畫相關(guān)的類繼承關(guān)系:
AlphaAnimation?放置在res/anim/目錄下
漸變透明度動畫效果
RotateAnimation
?放置在res/anim/目錄下
畫面轉(zhuǎn)移旋轉(zhuǎn)動畫效果
ScaleAnimation
?放置在res/anim/目錄下
漸變尺寸伸縮動畫效果
TranslateAnimation
?放置在res/anim/目錄下
畫面轉(zhuǎn)換位置移動動畫效果
AnimationSet
?放置在res/anim/目錄下
一個持有其它動畫元素alpha、scale、translate、rotate或者其它set元素的容器
通過上圖和上表可以直觀的看出來補(bǔ)間動畫的關(guān)系及種類了吧,接下來我們就詳細(xì)一個一個的介紹一下各種補(bǔ)間動畫。
2-2 視圖動畫詳細(xì)說明
可以看出來Animation抽象類是所有補(bǔ)間動畫類的基類,所以基類會提供一些通用的動畫屬性方法,如下我們就來詳細(xì)看看這些屬性
2-2-1 Animation屬性詳解android:detachWallpaper setDetachWallpaper(boolean) 是否在壁紙上運(yùn)行 android:duration setDuration(long) 動畫持續(xù)時間,毫秒為單位 android:fillAfter setFillAfter(boolean) 控件動畫結(jié)束時是否保持動畫最后的狀態(tài) android:fillBefore setFillBefore(boolean) 控件動畫結(jié)束時是否還原到開始動畫前的狀態(tài) android:fillEnabled setFillEnabled(boolean) 與android:fillBefore效果相同 android:interpolator setInterpolator(Interpolator) 設(shè)定插值器(指定的動畫效果,譬如回彈等) android:repeatCount setRepeatCount(int) 重復(fù)次數(shù) android:repeatMode setRepeatMode(int) 重復(fù)類型有兩個值,reverse表示倒序回放,restart表示從頭播放 android:startOffset setStartOffset(long) 調(diào)用start函數(shù)之后等待開始運(yùn)行的時間,單位為毫秒 android:zAdjustment setZAdjustment(int) 表示被設(shè)置動畫的內(nèi)容運(yùn)行時在Z軸上的位置(top/bottom/normal),默認(rèn)為normal
也就是說,無論我們補(bǔ)間動畫的哪一種都已經(jīng)具備了這種屬性,也都可以設(shè)置使用這些屬性中的一個或多個。
那接下來我們就看看每種補(bǔ)間動畫特有的一些屬性說明吧。
2-2-2 Alpha屬性詳解android:fromAlpha AlphaAnimation(float fromAlpha, …) 動畫開始的透明度(0.0到1.0,0.0是全透明,1.0是不透明) android:toAlpha AlphaAnimation(…, float toAlpha) 動畫結(jié)束的透明度,同上 2-2-3 Rotate屬性詳解android:fromDegrees RotateAnimation(float fromDegrees, …) 旋轉(zhuǎn)開始角度,正代表順時針度數(shù),負(fù)代表逆時針度數(shù) android:toDegrees RotateAnimation(…, float toDegrees, …) 旋轉(zhuǎn)結(jié)束角度,正代表順時針度數(shù),負(fù)代表逆時針度數(shù) android:pivotX RotateAnimation(…, float pivotX, …) 縮放起點(diǎn)X坐標(biāo)(數(shù)值、百分?jǐn)?shù)、百分?jǐn)?shù)p,譬如50表示以當(dāng)前View左上角坐標(biāo)加50px為初始點(diǎn)、50%表示以當(dāng)前View的左上角加上當(dāng)前View寬高的50%做為初始點(diǎn)、50%p表示以當(dāng)前View的左上角加上父控件寬高的50%做為初始點(diǎn)) android:pivotY RotateAnimation(…, float pivotY) 縮放起點(diǎn)Y坐標(biāo),同上規(guī)律 2-2-4 Scale屬性詳解android:fromXScale ScaleAnimation(float fromX, …) 初始X軸縮放比例,1.0表示無變化 android:toXScale ScaleAnimation(…, float toX, …) 結(jié)束X軸縮放比例 android:fromYScale ScaleAnimation(…, float fromY, …) 初始Y軸縮放比例 android:toYScale ScaleAnimation(…, float toY, …) 結(jié)束Y軸縮放比例 android:pivotX ScaleAnimation(…, float pivotX, …) 縮放起點(diǎn)X軸坐標(biāo)(數(shù)值、百分?jǐn)?shù)、百分?jǐn)?shù)p,譬如50表示以當(dāng)前View左上角坐標(biāo)加50px為初始點(diǎn)、50%表示以當(dāng)前View的左上角加上當(dāng)前View寬高的50%做為初始點(diǎn)、50%p表示以當(dāng)前View的左上角加上父控件寬高的50%做為初始點(diǎn)) android:pivotY ScaleAnimation(…, float pivotY) 縮放起點(diǎn)Y軸坐標(biāo),同上規(guī)律 2-2-5 Translate屬性詳解android:fromXDelta TranslateAnimation(float fromXDelta, …) 起始點(diǎn)X軸坐標(biāo)(數(shù)值、百分?jǐn)?shù)、百分?jǐn)?shù)p,譬如50表示以當(dāng)前View左上角坐標(biāo)加50px為初始點(diǎn)、50%表示以當(dāng)前View的左上角加上當(dāng)前View寬高的50%做為初始點(diǎn)、50%p表示以當(dāng)前View的左上角加上父控件寬高的50%做為初始點(diǎn)) android:fromYDelta TranslateAnimation(…, float fromYDelta, …) 起始點(diǎn)Y軸從標(biāo),同上規(guī)律 android:toXDelta TranslateAnimation(…, float toXDelta, …) 結(jié)束點(diǎn)X軸坐標(biāo),同上規(guī)律 android:toYDelta TranslateAnimation(…, float toYDelta) 結(jié)束點(diǎn)Y軸坐標(biāo),同上規(guī)律 2-2-6 AnimationSet詳解
AnimationSet繼承自Animation,是上面四種的組合容器管理類,沒有自己特有的屬性,他的屬性繼承自Animation,所以特別注意,當(dāng)我們對set標(biāo)簽使用Animation的屬性時會對該標(biāo)簽下的所有子控件都產(chǎn)生影響。
2-3 視圖動畫使用方法
通過上面對于動畫的屬性介紹之后我們來看看在Android中這些動畫如何使用(PS:這里直接演示xml方式,至于java方式太簡單了就不說了),如下
上面就是一個標(biāo)準(zhǔn)的使用我們定義的補(bǔ)間動畫的模板。至于補(bǔ)間動畫的使用,Animation還有如下一些比較實(shí)用的方法介紹:
reset() 重置Animation的初始化 cancel() 取消Animation動畫 start() 開始Animation動畫 setAnimationListener(AnimationListener listener) 給當(dāng)前Animation設(shè)置動畫監(jiān)聽 hasStarted() 判斷當(dāng)前Animation是否開始 hasEnded() 判斷當(dāng)前Animation是否結(jié)束
既然補(bǔ)間動畫只能給View使用,那就來看看View中和動畫相關(guān)的幾個常用方法吧,如下:
...
ImageView?spaceshipImage?=?(ImageView)?findViewById(R.id.spaceshipImage); Animation?hyperspaceJumpAnimation?=?AnimationUtils.loadAnimation(this,?R.anim.hyperspace_jump); spaceshipImage.startAnimation(hyperspaceJumpAnimation);
startAnimation(Animation animation) 對當(dāng)前View開始設(shè)置的Animation動畫 clearAnimation() 取消當(dāng)View在執(zhí)行的Animation動畫
到此整個Android的補(bǔ)間動畫常用詳細(xì)屬性及方法全部介紹完畢,如有特殊的屬性需求可以訪問Android Developer查閱即可。如下我們就來個綜合大演練。
2-4 視圖動畫注意事項(xiàng)
關(guān)于視圖動畫(補(bǔ)間動畫)的例子我就不介紹了,網(wǎng)上簡直多的都泛濫了。只是強(qiáng)調(diào)在使用補(bǔ)間動畫時注意如下一點(diǎn)即可:
特別特別注意:補(bǔ)間動畫執(zhí)行之后并未改變View的真實(shí)布局屬性值。切記這一點(diǎn),譬如我們在Activity中有一個Button在屏幕上方,我們設(shè)置了平移動畫移動到屏幕下方然后保持動畫最后執(zhí)行狀態(tài)呆在屏幕下方,這時如果點(diǎn)擊屏幕下方動畫執(zhí)行之后的Button是沒有任何反應(yīng)的,而點(diǎn)擊原來屏幕上方?jīng)]有Button的地方卻響應(yīng)的是點(diǎn)擊Button的事件。
2-5 視圖動畫Interpolator插值器詳解 2-5-1 插值器簡介
介紹補(bǔ)間動畫插值器之前我們先來看一幅圖,如下:
可以看見其實(shí)各種插值器都是實(shí)現(xiàn)了Interpolator接口而已,同時可以看見系統(tǒng)提供了許多已經(jīng)實(shí)現(xiàn)OK的插值器,具體如下:
AccelerateDecelerateInterpolator @android:anim/accelerate_decelerate_interpolator 動畫始末速率較慢,中間加速 AccelerateInterpolator @android:anim/accelerate_interpolator 動畫開始速率較慢,之后慢慢加速 AnticipateInterpolator @android:anim/anticipate_interpolator 開始的時候從后向前甩 AnticipateOvershootInterpolator @android:anim/anticipate_overshoot_interpolator 類似上面AnticipateInterpolator BounceInterpolator @android:anim/bounce_interpolator 動畫結(jié)束時彈起 CycleInterpolator @android:anim/cycle_interpolator 循環(huán)播放速率改變?yōu)檎仪€ DecelerateInterpolator @android:anim/decelerate_interpolator 動畫開始快然后慢 LinearInterpolator @android:anim/linear_interpolator 動畫勻速改變 OvershootInterpolator @android:anim/overshoot_interpolator 向前彈出一定值之后回到原來位置 PathInterpolator ? 新增,定義路徑坐標(biāo)后按照路徑坐標(biāo)來跑。
如上就是系統(tǒng)提供的一些插值器,下面我們來看看怎么使用他們。
2-5-2 插值器使用方法
插值器的使用比較簡單,如下:
...
2-5-3 插值器的自定義
有時候你會發(fā)現(xiàn)系統(tǒng)提供的插值器不夠用,可能就像View一樣需要自定義。所以接下來我們來看看插值器的自定義,關(guān)于插值器的自定義分為兩種實(shí)現(xiàn)方式,xml自定義實(shí)現(xiàn)(其實(shí)就是對現(xiàn)有的插值器的一些屬性修改)或者java代碼實(shí)現(xiàn)方式。如下我們來說說。
先看看XML自定義插值器的步驟:
在res/anim/目錄下創(chuàng)建filename.xml文件。修改你準(zhǔn)備自定義的插值器。
在你的補(bǔ)間動畫文件中引用該文件即可。
可以看見上面第二步修改的是現(xiàn)有插值器的一些屬性,但是有些插值器卻不具備修改屬性,具體如下:
無可自定義的attribute。
android:factor 浮點(diǎn)值,加速速率(默認(rèn)值為1)。
android:tension 浮點(diǎn)值,起始點(diǎn)后拉的張力數(shù)(默認(rèn)值為2)。
android:tension 浮點(diǎn)值,起始點(diǎn)后拉的張力數(shù)(默認(rèn)值為2)。?
android:extraTension 浮點(diǎn)值,拉力的倍數(shù)(默認(rèn)值為1.5)。
無可自定義的attribute。
android:cycles 整形,循環(huán)的個數(shù)(默認(rèn)為1)。
android:factor 浮點(diǎn)值,減速的速率(默認(rèn)為1)。
無可自定義的attribute。
android:tension 浮點(diǎn)值,超出終點(diǎn)后的張力(默認(rèn)為2)。
再來看看Java自定義插值器的(Java自定義插值器其實(shí)是xml自定義的升級,也就是說如果我們修改xml的屬性還不能滿足需求,那就可以選擇通過Java來實(shí)現(xiàn))方式。
可以看見上面所有的Interpolator都實(shí)現(xiàn)了Interpolator接口,而Interpolator接口又繼承自TimeInterpolator,TimeInterpolator接口定義了一個float getInterpolation(float input);方法,這個方法是由系統(tǒng)調(diào)用的,其中的參數(shù)input代表動畫的時間,在0和1之間,也就是開始和結(jié)束之間。
如下就是一個動畫始末速率較慢、中間加速的AccelerateDecelerateInterpolator插值器:
public?class?AccelerateDecelerateInterpolator?extends?BaseInterpolator ????????implements?NativeInterpolatorFactory?{ ????...... ????public?float?getInterpolation(float?input)?{ ????????return?(float)(Math.cos((input?+?1)?*?Math.PI)?/?2.0f)?+?0.5f; ????} ????...... }
到此整個補(bǔ)間動畫與補(bǔ)間動畫的插值器都分析完畢了,接下來看下別的動畫。
【工匠若水?http://blog.csdn.net/yanbober?轉(zhuǎn)載請注明出處。點(diǎn)我開始Android技術(shù)交流】
3 Drawable Animation(Drawable動畫)使用詳解 3-1 Drawable動畫概述
Drawable動畫其實(shí)就是Frame動畫(幀動畫),它允許你實(shí)現(xiàn)像播放幻燈片一樣的效果,這種動畫的實(shí)質(zhì)其實(shí)是Drawable,所以這種動畫的XML定義方式文件一般放在res/drawable/目錄下。具體關(guān)于幀動畫的xml使用方式翻墻點(diǎn)擊我查看,java方式翻墻點(diǎn)擊我查看。
如下圖就是幀動畫的源碼文件:
可以看見實(shí)際的真實(shí)父類就是Drawable。
3-2 Drawable動畫詳細(xì)說明
我們依舊可以使用xml或者java方式實(shí)現(xiàn)幀動畫。但是依舊推薦使用xml,具體如下:
?必須是根節(jié)點(diǎn),包含一個或者多個
元素,屬性有:
android:oneshot?true代表只執(zhí)行一次,false循環(huán)執(zhí)行。?類似一幀的動畫資源。
?animation-list的子項(xiàng),包含屬性如下:
android:drawable?一個frame的Drawable資源。android:duration?一個frame顯示多長時間。 3-3 Drawable動畫實(shí)例演示
關(guān)于幀動畫相對來說比較簡單,這里給出一個常規(guī)使用框架,如下:
ImageView?rocketImage?=?(ImageView)?findViewById(R.id.rocket_image); rocketImage.setBackgroundResource(R.drawable.rocket_thrust); rocketAnimation?=?(AnimationDrawable)?rocketImage.getBackground(); rocketAnimation.start();
特別注意,AnimationDrawable的start()方法不能在Activity的onCreate方法中調(diào)運(yùn),因?yàn)锳nimationDrawable還未完全附著到window上,所以最好的調(diào)運(yùn)時機(jī)是onWindowFocusChanged()方法中。
至此幀動畫也就說明完成了。讓我們接下來進(jìn)入Android更牛叉的動畫類型。
4 Property Animation(屬性動畫)使用詳解
在使用屬性動畫之前先來看幾個常用的View屬性成員:
translationX,translationY:控制View的位置,值是相對于View容器左上角坐標(biāo)的偏移。rotationX,rotationY:控制相對于軸心旋轉(zhuǎn)。x,y:控制View在容器中的位置,即左上角坐標(biāo)加上translationX和translationY的值。alpha:控制View對象的alpha透明度值。
這幾個常用的屬性相信大家都很熟悉,接下來的屬性動畫我們就從這里展開。
4-1 屬性動畫概述
Android 3.0以后引入了屬性動畫,屬性動畫可以輕而易舉的實(shí)現(xiàn)許多View動畫做不到的事,上面也看見了,View動畫無非也就做那幾種事情,別的也搞不定,而屬性動畫就可以的,譬如3D旋轉(zhuǎn)一張圖片。其實(shí)說白了,你記住一點(diǎn)就行,屬性動畫實(shí)現(xiàn)原理就是修改控件的屬性值實(shí)現(xiàn)的動畫。
具體先看下類關(guān)系:
/** ?*?This?is?the?superclass?for?classes?which?provide?basic?support?for?animations?which?can?be ?*?started,?ended,?and?have?AnimatorListeners?added?to?them. ?*/ public?abstract?class?Animator?implements?Cloneable?{ ????...... }
所有的屬性動畫的抽象基類就是他。我們看下他的實(shí)現(xiàn)子類:?
?
其實(shí)可以看見,屬性動畫的實(shí)現(xiàn)有7個類(PS,之所以類繼承關(guān)系列表會出來那么多是因?yàn)槲蚁螺d了所有版本的SDK,你只用關(guān)注我紅點(diǎn)標(biāo)注的就行,妹的,ubuntu下圖片處理工具怎么都這么難用),進(jìn)去粗略分析可以發(fā)現(xiàn),好幾個是hide的類,而其他可用的類繼承關(guān)系又如下:
ValueAnimator?放置在res/animator/目錄下
在一個特定的時間里執(zhí)行一個動畫
TimeAnimator
不支持/點(diǎn)我查看原因
時序監(jiān)聽回調(diào)工具
ObjectAnimator
?放置在res/animator/目錄下
一個對象的一個屬性動畫
AnimatorSet
?放置在res/animator/目錄下
動畫集合
所以可以看見,我們平時使用屬性動畫的重點(diǎn)就在于AnimatorSet、ObjectAnimator、TimeAnimator、ValueAnimator。所以接下來我們就來依次說說如何使用。
4-2 屬性動畫詳細(xì)說明 4-2-1 屬性動畫計(jì)算原理
參看Android官方文檔,英文原版詳情點(diǎn)我查看!
Android屬性動畫(注意最低兼容版本,不過可以使用開源項(xiàng)目來替代低版本問題)提供了以下屬性:
Duration:動畫的持續(xù)時間;TimeInterpolation:定義動畫變化速率的接口,所有插值器都必須實(shí)現(xiàn)此接口,如線性、非線性插值器;TypeEvaluator:用于定義屬性值計(jì)算方式的接口,有int、float、color類型,根據(jù)屬性的起始、結(jié)束值和插值一起計(jì)算出當(dāng)前時間的屬性值;Animation sets:動畫集合,即可以同時對一個對象應(yīng)用多個動畫,這些動畫可以同時播放也可以對不同動畫設(shè)置不同的延遲;Frame refreash delay:多少時間刷新一次,即每隔多少時間計(jì)算一次屬性值,默認(rèn)為10ms,最終刷新時間還受系統(tǒng)進(jìn)程調(diào)度與硬件的影響;Repeat Country and behavoir:重復(fù)次數(shù)與方式,如播放3次、5次、無限循環(huán),可以讓此動畫一直重復(fù),或播放完時向反向播放;
接下來先來看官方為了解釋原理給出的兩幅圖(其實(shí)就是初中物理題,不解釋):
?
上面就是一個線性勻速動畫,描述了一個Object的X屬性運(yùn)動動畫,該對象的X坐標(biāo)在40ms內(nèi)從0移動到40,每10ms刷新一次,移動4次,每次移動為40/4=10pixel。?
?
上面是一個非勻速動畫,描述了一個Object的X屬性運(yùn)動動畫,該對象的X坐標(biāo)在40ms內(nèi)從0移動到40,每10ms刷新一次,移動4次,但是速率不同,開始和結(jié)束的速度要比中間部分慢,即先加速后減速。
接下來我們來詳細(xì)的看一下,屬性動畫系統(tǒng)的重要組成部分是如何計(jì)算動畫值的,下圖描述了如上面所示動畫的實(shí)現(xiàn)作用過程。
其中的ValueAnimator是動畫的執(zhí)行類,跟蹤了當(dāng)前動畫的執(zhí)行時間和當(dāng)前時間下的屬性值;ValueAnimator封裝了動畫的TimeInterpolator時間插值器和一個TypeEvaluator類型估值,用于設(shè)置動畫屬性的值,就像上面圖2非線性動畫里,TimeInterpolator使用了AccelerateDecelerateInterpolator、TypeEvaluator使用了IntEvaluator。
為了執(zhí)行一個動畫,你需要創(chuàng)建一個ValueAnimator,并且指定目標(biāo)對象屬性的開始、結(jié)束值和持續(xù)時間。在調(diào)用start后,整個動畫過程中, ValueAnimator會根據(jù)已經(jīng)完成的動畫時間計(jì)算得到一個0到1之間的分?jǐn)?shù),代表該動畫的已完成動畫百分比。0表示0%,1表示100%,譬如上面圖一線性勻速動畫中總時間 t = 40 ms,t = 10 ms的時候是 0.25。
當(dāng)ValueAnimator計(jì)算完已完成動畫分?jǐn)?shù)后,它會調(diào)用當(dāng)前設(shè)置的TimeInterpolator,去計(jì)算得到一個interpolated(插值)分?jǐn)?shù),在計(jì)算過程中,已完成動畫百分比會被加入到新的插值計(jì)算中。如上圖2非線性動畫中,因?yàn)閯赢嫷倪\(yùn)動是緩慢加速的,它的插值分?jǐn)?shù)大約是 0.15,小于t = 10ms時的已完成動畫分?jǐn)?shù)0.25。而在上圖1中,這個插值分?jǐn)?shù)一直和已完成動畫分?jǐn)?shù)是相同的。
當(dāng)插值分?jǐn)?shù)計(jì)算完成后,ValueAnimator會根據(jù)插值分?jǐn)?shù)調(diào)用合適的 TypeEvaluator去計(jì)算運(yùn)動中的屬性值。
好了,現(xiàn)在我們來看下代碼就明白這段話了,上面圖2非線性動畫里,TimeInterpolator使用了AccelerateDecelerateInterpolator、TypeEvaluator使用了IntEvaluator。所以這些類都是標(biāo)準(zhǔn)的API,我們來看下標(biāo)準(zhǔn)API就能類比自己寫了,如下:
首先計(jì)算已完成動畫時間分?jǐn)?shù)(以10ms為例):t=10ms/40ms=0.25。
接著看如下源碼如何實(shí)現(xiàn)計(jì)算差值分?jǐn)?shù)的:
public?class?AccelerateDecelerateInterpolator?extends?BaseInterpolator ????????implements?NativeInterpolatorFactory?{ ????public?AccelerateDecelerateInterpolator()?{ ????} ????...... ????//這是我們關(guān)注重點(diǎn),可以發(fā)現(xiàn)如下計(jì)算公式計(jì)算后(input即為時間因子)插值大約為0.15。 ????public?float?getInterpolation(float?input)?{ ????????return?(float)(Math.cos((input?+?1)?*?Math.PI)?/?2.0f)?+?0.5f; ????} ????...... }
其實(shí)AccelerateDecelerateInterpolator的基類接口就是TimeInterpolator,如下,他只有g(shù)etInterpolation方法,也就是上面我們關(guān)注的方法。
public?interface?TimeInterpolator?{ ????float?getInterpolation(float?input); }
接著ValueAnimator會根據(jù)插值分?jǐn)?shù)調(diào)用合適的TypeEvaluator(IntEvaluator)去計(jì)算運(yùn)動中的屬性值,如下,因?yàn)閟tartValue = 0,所以屬性值:0+0.15*(40-0)= 6。
public?class?IntEvaluator?implements?TypeEvaluator{ ????public?Integer?evaluate(float?fraction,?Integer?startValue,?Integer?endValue)?{ ????????int?startInt?=?startValue; ????????return?(int)(startInt?+?fraction?*?(endValue?-?startInt)); ????} }
這就是官方給的一個關(guān)于屬性動畫實(shí)現(xiàn)的過程及基本原理解釋,相信你看到這里是會有些迷糊的,沒關(guān)系,你先有個大致概念就行,接下來我們會慢慢進(jìn)入實(shí)戰(zhàn),因?yàn)锳ndroid的屬性動畫相對于其他動畫來說涉及的知識點(diǎn)本來就比較復(fù)雜,所以我們慢慢來。
4-2-2 XML方式屬性動畫
在xml中可直接用的屬性動畫節(jié)點(diǎn)有ValueAnimator、ObjectAnimator、AnimatorSet。如下是官方的一個例子和解釋(詳情點(diǎn)我):
...
屬性解釋:
android:ordering 控制子動畫啟動方式是先后有序的還是同時進(jìn)行。sequentially:動畫按照先后順序;together(默認(rèn)):動畫同時啟動;
屬性解釋:
android:propertyName String類型,必須要設(shè)置的節(jié)點(diǎn)屬性,代表要執(zhí)行動畫的屬性(通過名字引用),辟如你可以指定了一個View的”alpha” 或者 “backgroundColor” ,這個objectAnimator元素沒有對外說明target屬性,所以你不能在XML中設(shè)置執(zhí)行這個動畫,必須通過調(diào)用loadAnimator()方法加載你的XML動畫資源,然后調(diào)用setTarget()應(yīng)用到具備這個屬性的目標(biāo)對象上(譬如TextView)。 android:valueTo float、int或者color類型,必須要設(shè)置的節(jié)點(diǎn)屬性,表明動畫結(jié)束的點(diǎn);如果是顏色的話,由6位十六進(jìn)制的數(shù)字表示。 android:valueFrom 相對應(yīng)valueTo,動畫的起始點(diǎn),如果沒有指定,系統(tǒng)會通過屬性的get方法獲取,顏色也是6位十六進(jìn)制的數(shù)字表示。 android:duration 動畫的時長,int類型,以毫秒為單位,默認(rèn)為300毫秒。 android:startOffset 動畫延遲的時間,從調(diào)用start方法后開始計(jì)算,int型,毫秒為單位。 android:repeatCount 一個動畫的重復(fù)次數(shù),int型,”-1“表示無限循環(huán),”1“表示動畫在第一次執(zhí)行完成后重復(fù)執(zhí)行一次,也就是兩次,默認(rèn)為0,不重復(fù)執(zhí)行。 android:repeatMode 重復(fù)模式:int型,當(dāng)一個動畫執(zhí)行完的時候應(yīng)該如何處理。該值必須是正數(shù)或者是-1,“reverse”會使得按照動畫向相反的方向執(zhí)行,可實(shí)現(xiàn)類似鐘擺效果?!皉epeat”會使得動畫每次都從頭開始循環(huán)。 android:valueType 關(guān)鍵參數(shù),如果該value是一個顏色,那么就不需要指定,因?yàn)閯赢嬁蚣軙詣拥奶幚眍伾怠S衖ntType和floatType(默認(rèn))兩種:分別說明動畫值為int和float型。
屬性解釋:?
同上屬性,不多介紹。
XML屬性動畫使用方法:
AnimatorSet?set?=?(AnimatorSet)?AnimatorInflater.loadAnimator(myContext, ????R.animtor.property_animator); set.setTarget(myObject); set.start();
4-2-3 Java方式屬性動畫
1、ObjectAnimator:繼承自ValueAnimator,允許你指定要進(jìn)行動畫的對象以及該對象的一個屬性。該類會根據(jù)計(jì)算得到的新值自動更新屬性。大多數(shù)的情況使用ObjectAnimator就足夠了,因?yàn)樗沟媚繕?biāo)對象動畫值的處理過程變得足夠簡單,不用像ValueAnimator那樣自己寫動畫更新的邏輯,但是ObjectAnimator有一定的限制,比如它需要目標(biāo)對象的屬性提供指定的處理方法(譬如提供getXXX,setXXX方法),這時候你就需要根據(jù)自己的需求在ObjectAnimator和ValueAnimator中看哪種實(shí)現(xiàn)更方便了。
<pre style="font-family:'Source Code Pro', monospace;font-size:14px;l
java類名 | xml關(guān)鍵字 | 描述信息 |
---|---|---|
xml屬性 | java方法 | 解釋 |
xml屬性 | java方法 | 解釋 |
xml屬性 | java方法 | 解釋 |
xml屬性 | java方法 | 解釋 |
xml屬性 | java方法 | 解釋 |
Animation類的方法 | 解釋 | |
View類的常用動畫操作方法 | 解釋 | |
java類 | xml id值 | 描述 |
java類名 | xml關(guān)鍵字 | 描述信息 |
xml屬性 | 解釋 | |
xml屬性 | 解釋 |