關(guān)于動(dòng)畫(huà)的實(shí)現(xiàn),Android提供了Animation,在Android SDK介紹了2種Animation模式:
1. Tween Animation:通過(guò)對(duì)場(chǎng)景里的對(duì)象不斷做圖象變換(平移、縮放、旋轉(zhuǎn))產(chǎn)生動(dòng)畫(huà)效果,即是1種漸變動(dòng)畫(huà);
2. Frame Animation:順序播放事前做好的圖象,是1種畫(huà)面轉(zhuǎn)換動(dòng)畫(huà)。
動(dòng)畫(huà)類型
下面先來(lái)看看Android提供的動(dòng)畫(huà)類型。Android的animation由4種類型組成
在XML文件中:
- alpha 漸變透明度動(dòng)畫(huà)效果
- scale 漸變尺寸伸縮動(dòng)畫(huà)效果
- translate 畫(huà)面轉(zhuǎn)換位置移動(dòng)動(dòng)畫(huà)效果
- rotate 畫(huà)面轉(zhuǎn)移旋轉(zhuǎn)動(dòng)畫(huà)效果
在Java 源碼中定義了相應(yīng)的類,可使用這些類的方法來(lái)獲得和操作相應(yīng)的屬性:
- AlphaAnimation漸變透明度動(dòng)畫(huà)效果
- ScaleAnimation漸變尺寸伸縮動(dòng)畫(huà)效果
- TranslateAnimation畫(huà)面轉(zhuǎn)換位置移動(dòng)動(dòng)畫(huà)效果
- RotateAnimation畫(huà)面轉(zhuǎn)移旋轉(zhuǎn)動(dòng)畫(huà)效果
Tween Animation
1個(gè)tween動(dòng)畫(huà)將對(duì)視圖對(duì)象中的內(nèi)容進(jìn)行1系列簡(jiǎn)單的轉(zhuǎn)換(位置,大小,旋轉(zhuǎn),透明性)。如果你有1個(gè)文本視圖對(duì)象,你可以移動(dòng)它,旋轉(zhuǎn)它,讓它變大或讓它變小,如果文字下面還有背景圖象,背景圖象也會(huì)隨著文件進(jìn)行轉(zhuǎn)換。
使用XML來(lái)定義Tween Animation
動(dòng)畫(huà)的XML文件在工程中res/anim目錄,這個(gè)文件必須包括1個(gè)根元素,可使<alpha><scale> <translate> <rotate>插值元素或是把上面的元素都放入<set>元素組中,默許情況下,所以的動(dòng)畫(huà)指令都是同時(shí)產(chǎn)生的,為了讓他們按序列產(chǎn)生,需要設(shè)置1個(gè)特殊的屬性startOffset。動(dòng)畫(huà)的指令定義了你想要產(chǎn)生甚么樣的轉(zhuǎn)換,當(dāng)他們產(chǎn)生了,應(yīng)當(dāng)履行多長(zhǎng)時(shí)間,轉(zhuǎn)換可以是連續(xù)的也能夠使同時(shí)的。例如,你讓文本內(nèi)容從左側(cè)移動(dòng)到右側(cè),然后旋轉(zhuǎn)180度,或在移動(dòng)的進(jìn)程中同時(shí)旋轉(zhuǎn),沒(méi)個(gè)轉(zhuǎn)換需要設(shè)置1些特殊的參數(shù)(開(kāi)始和結(jié)束的大小尺寸的大小變化,開(kāi)始和結(jié)束的旋轉(zhuǎn)角度等等,也能夠設(shè)置些基本的參數(shù)(例如,開(kāi)始時(shí)間與周期),如果讓幾個(gè)轉(zhuǎn)換同時(shí)產(chǎn)生,可以給它們?cè)O(shè)置相同的開(kāi)始時(shí)間,如果按序列的話,計(jì)算開(kāi)始時(shí)間加上其周期。
Tween Animation共同的節(jié)點(diǎn)屬性
屬性[類型] | 功能 | 備注 |
Duration[long] | 屬性為動(dòng)畫(huà)延續(xù)時(shí)間 | 時(shí)間以毫秒為單位 |
fillAfter [boolean] | 當(dāng)設(shè)置為true ,該動(dòng)畫(huà)轉(zhuǎn)化在動(dòng)畫(huà)結(jié)束后被利用 | |
fillBefore[boolean] | 當(dāng)設(shè)置為true ,該動(dòng)畫(huà)轉(zhuǎn)化在動(dòng)畫(huà)開(kāi)始前被利用 | |
interpolator |
指定1個(gè)動(dòng)畫(huà)的插入器 |
有1些常見(jiàn)的插入器 accelerate_decelerate_interpolator 加速-減速 動(dòng)畫(huà)插入器 accelerate_interpolator 加速-動(dòng)畫(huà)插入器 decelerate_interpolator 減速- 動(dòng)畫(huà)插入器 其他的屬于特定的動(dòng)畫(huà)效果 |
repeatCount[int] | 動(dòng)畫(huà)的重復(fù)次數(shù) | |
RepeatMode[int] | 定義重復(fù)的行動(dòng) | 1:重新開(kāi)始 2:plays backward |
startOffset[long] | 動(dòng)畫(huà)之間的時(shí)間間隔,從上次動(dòng)畫(huà)停多少時(shí)間開(kāi)始履行下個(gè)動(dòng)畫(huà) | |
zAdjustment[int] | 定義動(dòng)畫(huà)的Z Order的改變 |
0:保持Z Order不變 1:保持在最上層 ⑴:保持在最下層 |
表2 |
||
XML節(jié)點(diǎn) | 功能說(shuō)明 | |
alpha | 漸變透明度動(dòng)畫(huà)效果 | |
<alpha android:fromAlpha=”0.1″ android:toAlpha=”1.0″ android:duration=”3000″ /> |
||
fromAlpha |
屬性為動(dòng)畫(huà)起始時(shí)透明度 |
0.0表示完全透明 duration為動(dòng)畫(huà)延續(xù)時(shí)間,ms單位 |
|
屬性為動(dòng)畫(huà)結(jié)束時(shí)透明度 |
表3 |
|||
scale | 漸變尺寸伸縮動(dòng)畫(huà)效果 | ||
<scale android:interpolator= “@android:anim/accelerate_decelerate_interpolator” android:fromXScale=”0.0″ android:toXScale=”1.4″ android:fromYScale=”0.0″ android:toYScale=”1.4″ android:pivotX=”50%” android:pivotY=”50%” android:fillAfter=”false” android:startOffset=“700” android:duration=”700″ android:repeatCount=”10″ /> |
|||
fromXScale[float] fromYScale[float] | 為動(dòng)畫(huà)起始時(shí),X、Y坐標(biāo)上的伸縮尺寸 |
0.0表示收縮到?jīng)]有 1.0表示正常無(wú)伸縮 值小于1.0表示收縮 值大于1.0表示放大 |
|
toXScale [float] toYScale[float] |
為動(dòng)畫(huà)結(jié)束時(shí),X、Y坐標(biāo)上的伸縮尺寸 | ||
pivotX[float] pivotY[float] |
為動(dòng)畫(huà)相對(duì)物件的X、Y坐標(biāo)的開(kāi)始位置 | 屬性值說(shuō)明:從0%⑴00%中取值,50%為物件的X或Y方向坐標(biāo)上的中點(diǎn)位置 | |
表4 |
|||
translate | 畫(huà)面轉(zhuǎn)換位置移動(dòng)動(dòng)畫(huà)效果 | ||
<translate android:fromXDelta=”30″ android:toXDelta=”⑻0″ android:fromYDelta=”30″ android:toYDelta=”300″ android:duration=”2000″ /> |
|||
fromXDelta toXDelta |
為動(dòng)畫(huà)、結(jié)束起始時(shí) X坐標(biāo)上的位置 | ||
fromYDelta toYDelta |
為動(dòng)畫(huà)、結(jié)束起始時(shí) Y坐標(biāo)上的位置 | ||
表5 |
|||
rotate | 畫(huà)面轉(zhuǎn)移旋轉(zhuǎn)動(dòng)畫(huà)效果 | ||
<rotate android:interpolator=”@android:anim/accelerate_decelerate_interpolator” android:fromDegrees=”0″ android:toDegrees=”+350″ android:pivotX=”50%” android:pivotY=”50%” android:duration=”3000″ /> |
|||
fromDegrees | 為動(dòng)畫(huà)起始時(shí)物件的角度 |
說(shuō)明 當(dāng)角度為負(fù)數(shù)――表示逆時(shí)針旋轉(zhuǎn) 當(dāng)角度為正數(shù)――表示順時(shí)針旋轉(zhuǎn) (負(fù)數(shù)from――to正數(shù):順時(shí)針旋轉(zhuǎn)) (負(fù)數(shù)from――to負(fù)數(shù):逆時(shí)針旋轉(zhuǎn)) (正數(shù)from――to正數(shù):順時(shí)針旋轉(zhuǎn)) (正數(shù)from――to負(fù)數(shù):逆時(shí)針旋轉(zhuǎn)) |
|
toDegrees | 屬性為動(dòng)畫(huà)結(jié)束時(shí)物件旋轉(zhuǎn)的角度 可以大于360度 | ||
pivotX pivotY |
為動(dòng)畫(huà)相對(duì)物件的X、Y坐標(biāo)的開(kāi)始位 |
說(shuō)明:以上兩個(gè)屬性值 從0%⑴00%中取值 50%為物件的X或Y方向坐標(biāo)上的中點(diǎn)位置 |
下面給出1個(gè)完全的XML定義(SDK提供)
Tween Animation如何使用
使用AnimationUtils類的靜態(tài)方法loadAnimation()來(lái)加載XML中的動(dòng)畫(huà)XML文件
//main.xml中的ImageView ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage); //加載動(dòng)畫(huà) Animation hyperspaceJumpAnimation =AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); //使用ImageView顯示動(dòng)畫(huà) spaceshipImage.startAnimation(hyperspaceJumpAnimation);
如何在Java代碼中定義動(dòng)畫(huà)
interpolator的解釋
interpolator定義1個(gè)動(dòng)畫(huà)的變化率(the rate of change)。這使得基本的動(dòng)畫(huà)效果(alpha, scale, translate, rotate)得以加速,減速,重復(fù)等。
Interpolator 定義了動(dòng)畫(huà)的變化速度,可以實(shí)現(xiàn)勻速、正加速、負(fù)加速、無(wú)規(guī)則變加速等。Interpolator 是基類,封裝了所有 Interpolator 的共同方法,它只有1個(gè)方法,即 getInterpolation (float input),該方法 maps a point on the timeline to a multiplier to be applied to the transformations of an animation。Android 提供了幾個(gè) Interpolator 子類,實(shí)現(xiàn)了不同的速度曲線,以下:
AccelerateDecelerateInterpolator | 在動(dòng)畫(huà)開(kāi)始與介紹的地方速率改變比較慢,在中間的時(shí)候加速 |
AccelerateInterpolator | 在動(dòng)畫(huà)開(kāi)始的地方速率改變比較慢,然后開(kāi)始加速 |
CycleInterpolator | 動(dòng)畫(huà)循環(huán)播放特定的次數(shù),速率改變沿著正弦曲線 |
DecelerateInterpolator | 在動(dòng)畫(huà)開(kāi)始的地方速率改變比較慢,然后開(kāi)始減速 |
LinearInterpolator | 在動(dòng)畫(huà)的以均勻的速率改變 |
Frame Animation
Frame Animation是順序播放事前做好的圖象,跟電影類似。不同于animation package, Android SDK提供了另外1個(gè)類AnimationDrawable來(lái)定義、使用Frame Animation。
Frame Animation可以在XML Resource定義(還是寄存到resanim文件夾下),也能夠使用AnimationDrawable中的API定義。由于Tween Animation與Frame Animation有著很大的不同,因此XML定義的格式也完全不1樣,其格式是:首先是animation-list根節(jié)點(diǎn),animation-list根節(jié)點(diǎn)中包括多個(gè)item子節(jié)點(diǎn),每一個(gè)item節(jié)點(diǎn)定義1幀動(dòng)畫(huà),當(dāng)前幀的drawable資源和當(dāng)前幀延續(xù)的時(shí)間。下面對(duì)節(jié)點(diǎn)的元素加以說(shuō)明:
XML屬性 | 說(shuō)明 |
drawable | 當(dāng)前幀援用的drawable資源 |
duration | 當(dāng)前幀顯示的時(shí)間(毫秒為單位) |
oneshot | 如果為true,表示動(dòng)畫(huà)只播放1次停止在最后1幀上,如果設(shè)置為false表示動(dòng)畫(huà)循環(huán)播放。 |
variablePadding | If true, allows the drawable’s padding to change based on the current state that is selected. |
visible | 規(guī)定drawable的初始可見(jiàn)性,默許為flase; |
下面就給個(gè)具體的XML例子,來(lái)定義1幀1幀的動(dòng)畫(huà):
上面的XML就定義了1個(gè)Frame Animation,其包括3幀動(dòng)畫(huà),3幀動(dòng)畫(huà)中分別利用了drawable中的3張圖片:rocket_thrust1,rocket_thrust2,rocket_thrust3,每幀動(dòng)畫(huà)延續(xù)200毫秒。
然后我們將以上XML保存在res/anim/文件夾下,命名為rocket_thrust.xml,顯示動(dòng)畫(huà)的代碼:
代碼運(yùn)行的結(jié)果:3張圖片依照順序的播放1次.
有1點(diǎn)需要強(qiáng)調(diào)的是:?jiǎn)?dòng)Frame Animation動(dòng)畫(huà)的代碼rocketAnimation.start();不能在OnCreate()中,由于在OnCreate()中AnimationDrawable還沒(méi)有完全的與ImageView綁定,在OnCreate()中啟動(dòng)動(dòng)畫(huà),就只能看到第1張圖片。這里實(shí)在拖曳事件中實(shí)現(xiàn)的。
下面,瀏覽Android SDK中對(duì)AnimationDrawable的介紹,有個(gè)簡(jiǎn)單的了解:
AnimationDrawable |
|
獲得、設(shè)置動(dòng)畫(huà)的屬性 | |
int getDuration() | 獲得動(dòng)畫(huà)的時(shí)長(zhǎng) |
int getNumberOfFrames() | 獲得動(dòng)畫(huà)的幀數(shù) |
boolean isOneShot()
Void setOneShot(boolean oneshot) |
獲得oneshot屬性 設(shè)置oneshot屬性 |
void inflate(Resurce r,XmlPullParser p, AttributeSet attrs) |
|
增加、獲得幀動(dòng)畫(huà) | |
Drawable getFrame(int index) | 獲得某幀的Drawable資源 |
void addFrame(Drawable frame,int duration) | 為當(dāng)前動(dòng)畫(huà)增加幀(資源,延續(xù)時(shí)長(zhǎng)) |
動(dòng)畫(huà)控制 | |
void start() | 開(kāi)始動(dòng)畫(huà) |
void run() | 外界不能直接掉調(diào)用,使用start()替換 |
boolean isRunning() | 當(dāng)前動(dòng)畫(huà)是不是在運(yùn)行 |
void stop() | 停止當(dāng)前動(dòng)畫(huà) |
本文參考:Android SDK
moandroid.com
eoeandroid.com


關(guān)注 - 10
粉絲 - 673
? 下1篇:Android網(wǎng)絡(luò)連接處理學(xué)習(xí)筆記