不登高山,不知天之高;不臨深溪,不知地之厚
相關(guān)文章:
《Android自定義控件三部曲文章索引》
前兩篇,我為大家講述了利用xml來定義動(dòng)畫及插值器,但在代碼中,我們常常是動(dòng)態(tài)生成動(dòng)畫的,所以,這篇將為大家講述如何用代碼生成動(dòng)態(tài)生成動(dòng)畫及插值器。
先簡(jiǎn)單寫出各個(gè)標(biāo)簽對(duì)應(yīng)的類,方便大家理解:
scale —— ScaleAnimationalpha —— AlphaAnimationrotate —— RotateAnimationtranslate —— TranslateAnimationset —— AnimationSet官方SDK講解頁(yè)面為:《Animation》
第一篇中我們提到過,Animation類是所有動(dòng)畫(scale、alpha、translate、rotate)的基類,它所具有的標(biāo)簽及對(duì)應(yīng)函數(shù)為:
android:duration setDuration(long) 動(dòng)畫持續(xù)時(shí)間,以毫秒為單位 android:fillAfter setFillAfter(boolean)如果設(shè)置為true,控件動(dòng)畫結(jié)束時(shí),將保持動(dòng)畫最后時(shí)的狀態(tài)android:fillBefore setFillBefore(boolean)如果設(shè)置為true,控件動(dòng)畫結(jié)束時(shí),還原到開始動(dòng)畫前的狀態(tài)android:fillEnabled setFillEnabled(boolean)與android:fillBefore 效果相同,都是在動(dòng)畫結(jié)束時(shí),將控件還原到初始化狀態(tài)android:repeatCount setRepeatCount(int)重復(fù)次數(shù)android:repeatMode setRepeatMode(int)重復(fù)類型,有reverse和restart兩個(gè)值,取值為RESTART或 REVERSE,必須與repeatCount一起使用才能看到效果。因?yàn)檫@里的意義是重復(fù)的類型,即回放時(shí)的動(dòng)作。android:interpolator setInterpolator(Interpolator) 設(shè)定插值器,其實(shí)就是指定的動(dòng)作效果,比如彈跳效果等在第一篇《 Animation 動(dòng)畫詳解(一)——alpha、scale、translate、rotate、set的xml屬性及用法》 我們已經(jīng)講解了每個(gè)標(biāo)簽具體所具有的功能,這里就不再細(xì)講,對(duì)于使用方法會(huì)在下面的各標(biāo)簽中使用。
這是scale標(biāo)簽對(duì)應(yīng)的類,官方SDK頁(yè)面為:《ScaleAnimation》
在Scale標(biāo)簽中,我們提到過它的自有屬性有下面幾條,先列一下:
android:fromXScale 起始的X方向上相對(duì)自身的縮放比例,浮點(diǎn)值,比如1.0代表自身無變化,0.5代表起始時(shí)縮小一倍,2.0代表放大一倍;android:toXScale 結(jié)尾的X方向上相對(duì)自身的縮放比例,浮點(diǎn)值;android:fromYScale 起始的Y方向上相對(duì)自身的縮放比例,浮點(diǎn)值,android:toYScale 結(jié)尾的Y方向上相對(duì)自身的縮放比例,浮點(diǎn)值;android:pivotX 縮放起點(diǎn)X軸坐標(biāo),可以是數(shù)值、百分?jǐn)?shù)、百分?jǐn)?shù)p 三種樣式,比如 50、50%、50%p,當(dāng)為數(shù)值時(shí),表示在當(dāng)前View的左上角,即原點(diǎn)處加上50px,做為起始縮放點(diǎn);如果是50%,表示在當(dāng)前控件的左上角加上自己寬度的50%做為起始點(diǎn);如果是50%p,那么就是表示在當(dāng)前的左上角加上父控件寬度的50%做為起始點(diǎn)x軸坐標(biāo)。(具體意義,后面會(huì)舉例演示)android:pivotY 縮放起點(diǎn)Y軸坐標(biāo),取值及意義跟android:pivotX一樣。放到代碼中,ScaleAnimation有下面幾個(gè)構(gòu)造函數(shù):ScaleAnimation(Context context, AttributeSet attrs) 從XML文件加載動(dòng)畫,基本用不到ScaleAnimation(float fromX, float toX, float fromY, float toY)ScaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY)ScaleAnimation(float fromX, float toX, float fromY, float toY, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)第一個(gè)構(gòu)造函數(shù)是從本地XML文件加載動(dòng)畫,基本用不到的,我們主要看下面三個(gè)構(gòu)造函數(shù)。在標(biāo)簽屬性android:pivotX中有三種取值,數(shù),百分?jǐn)?shù),百分?jǐn)?shù)p;體現(xiàn)在構(gòu)造函數(shù)中,就是最后一個(gè)構(gòu)造函數(shù)的pivotXType,它的取值有三個(gè),Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF和Animation.RELATIVE_TO_PARENT;
這三個(gè)構(gòu)造函數(shù)難度不大,就不再細(xì)講,舉個(gè)例子說明:
在第一篇中Scale的例子的XML代碼為:
[html] view plain copy對(duì)應(yīng)的代碼構(gòu)造代碼為:
[java]%20view%20plain%20copy%20在第一篇文章中,我們構(gòu)造的XML代碼為:
[java]%20view%20plain%20copy%20RotateAnimation類對(duì)應(yīng)Rotate標(biāo)簽,SDK文檔地址:《RotateAnimation》
Rotate標(biāo)簽所具有的XML屬性有:
android:fromDegrees %20 %20開始旋轉(zhuǎn)的角度位置,正值代表順時(shí)針方向度數(shù),負(fù)值代碼逆時(shí)針方向度數(shù)android:toDegrees %20 %20 %20 %20結(jié)束時(shí)旋轉(zhuǎn)到的角度位置,正值代表順時(shí)針方向度數(shù),負(fù)值代碼逆時(shí)針方向度數(shù)android:pivotX %20 %20 %20 %20 %20 %20 %20縮放起點(diǎn)X軸坐標(biāo),可以是數(shù)值、百分?jǐn)?shù)、百分?jǐn)?shù)p%20三種樣式,比如%2050、50%、50%p,具體意義已在scale標(biāo)簽中講述,這里就不再重講android:pivotY %20 %20 %20 %20 %20 %20 %20縮放起點(diǎn)Y軸坐標(biāo),可以是數(shù)值、百分?jǐn)?shù)、百分?jǐn)?shù)p%20三種樣式,比如%2050、50%、50%p對(duì)應(yīng)的構(gòu)造函數(shù)有:RotateAnimation(Context%20context,%20AttributeSet%20attrs) 從本地XML文檔加載動(dòng)畫,同樣,基本不用RotateAnimation(float%20fromDegrees,%20float%20toDegrees)RotateAnimation(float%20fromDegrees,%20float%20toDegrees,%20float%20pivotX,%20float%20pivotY)RotateAnimation(float%20fromDegrees,%20float%20toDegrees,%20int%20pivotXType,%20float%20pivotXValue,%20int%20pivotYType,%20float%20pivotYValue)RotateAnimation跟ScaleAnimation差不多,關(guān)鍵問題同樣是pivotXType和pivotYType的選擇,同樣有三個(gè)取值:Animation.ABSOLUTE、Animation.RELATIVE_TO_SELF和Animation.RELATIVE_TO_PARENT;
根據(jù)每一篇中的XML寫出對(duì)應(yīng)的JAVA構(gòu)造代碼:
XML為:
[java]%20view%20plain%20copy%20translate標(biāo)簽所具有的屬性為:
android:fromXDelta %20 %20起始點(diǎn)X軸坐標(biāo),可以是數(shù)值、百分?jǐn)?shù)、百分?jǐn)?shù)p%20三種樣式,比如%2050、50%、50%p,具體意義已在scale標(biāo)簽中講述,這里就不再重講android:fromYDelta %20 起始點(diǎn)Y軸從標(biāo),可以是數(shù)值、百分?jǐn)?shù)、百分?jǐn)?shù)p%20三種樣式;android:toXDelta%20 %20 %20 %20結(jié)束點(diǎn)X軸坐標(biāo)android:toYDelta %20 %20 %20 結(jié)束點(diǎn)Y軸坐標(biāo)這些屬性所對(duì)應(yīng)的構(gòu)造函數(shù)為:TranslateAnimation(Context%20context,%20AttributeSet%20attrs)%20 同樣,基本不用TranslateAnimation(float%20fromXDelta,%20float%20toXDelta,%20float%20fromYDelta,%20float%20toYDelta)TranslateAnimation(int%20fromXType,%20float%20fromXValue,%20int%20toXType,%20float%20toXValue,%20int%20fromYType,%20float%20fromYValue,%20int%20toYType,%20float%20toYValue)由于fromXDelta、fromYDelta、toXDelta、toYDelta這三個(gè)屬性都具有三種狀態(tài),所以在構(gòu)造函數(shù)中,最理想的狀態(tài)就是第三個(gè)構(gòu)造函數(shù),能夠指定每個(gè)值的類型,第二個(gè)構(gòu)造函數(shù):TranslateAnimation%20(float%20fromXDelta,%20float%20toXDelta,%20float%20fromYDelta,%20float%20toYDelta)使用是絕對(duì)數(shù)值。只有最后一個(gè)構(gòu)造函數(shù)可以指定百分?jǐn)?shù)和相對(duì)父控件的百分?jǐn)?shù)。
下面以第一篇中的XML代碼為例,用JAVA代碼構(gòu)造同樣的效果:
XML代碼:
[html]%20view%20plain%20copy%20增加動(dòng)畫的函數(shù)為:(更多函數(shù),請(qǐng)參看SDK文檔)
public%20void%20addAnimation%20(Animation%20a)下面在第一篇中的XML代碼為例寫出能構(gòu)造同樣效果的JAVA代碼:
XML代碼為:
[html]%20view%20plain%20copy%20關(guān)于插值器的SDK講解見《Animation%20Resources》中的Interpolators部分;
插值器XML屬性及對(duì)應(yīng)的類如下表所示: