走穿Android動畫—補間動畫alpha、scale、translate、rotate、set的xml屬性及用法
先看幾種簡單的補間動畫效果:

上面一共顯示了五個效果:平移、透明、縮放、旋轉和旋轉+透明
代碼也是比較簡單的,以平移群組合效果簡單講解:
1.資源檔案:
補間動畫的檔案都是放在res下的anmi檔案夾内,沒有的話要自己建立
(1)平移的translate_anim.xml
往同時往右邊和下邊方向移動100個像素
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="100"
android:fromYDelta="0"
android:toYDelta="100"
android:duration="2000"
android:fillBefore="true"/>
(2)組合的all_anim.xml
透明效果:從完全顯示到很透明
旋轉效果:逆時針旋轉650度
<?xml version="1.0" encoding="utf-8"?>
<set>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="1.0"
android:toAlpha="0.1"
android:duration="3000"
android:fillBefore="true"/>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromDegrees="0"
android:toDegrees="-650"
android:pivotX="50%"
android:pivotY="50%"
android:duration="3000"
android:fillAfter="true"/>
</set>
這裡的組個可以放置多個,這裡隻是放置兩個動畫透明和旋轉做示例。
2.java控制的主要代碼
ImageView iv;
Animation animation;
/**
* 平移動畫
*/
public void translate(View view) {
animation = AnimationUtils.loadAnimation(this, R.anim.translate_anim);
iv.startAnimation(animation);
}
/**
* 各種效果集于一身的動畫
*/
public void all(View view) {
setIVAnimation(R.anim.all_anim);
}
/**
* 傳入動畫的ID,直接給ImageView設定動畫
*/
private void setIVAnimation(int animID) {
iv.startAnimation(AnimationUtils.loadAnimation(this, animID));
}
上面平移動畫也是可以直接調用那個私有方法來調用動畫。
下面是補間動畫和各種屬性的詳細講解。
一.基本知識
補間動畫就是通過對場景的對象不斷進行圖像變化來産生動畫效果,在實作補間動畫時,隻要定義動畫開始和結束的”關鍵幀”其它過度幀由系統自動計算并補齊.android中提供了4種補間動畫效果:透明、旋轉、縮放、平移。
1.android補間動畫的四種類别
alpha | 漸變透明度動畫效果 |
---|---|
translate | 畫面轉換位置移動動畫效果 |
scale | 漸變尺寸伸縮動畫效果 |
rotate | 畫面轉移旋轉動畫效果 |
上面這四個類别名稱是可以在xml中當作根标簽使用,來對應各種補間動畫。
當然也是可以用set做根标簽,裡面放幾個補間動畫,做組合效果。
2.關于補間動畫的類
Animation有五個子類:AlphaAnimation (透明動畫)TranslateAnimation (平移動畫)、ScaleAnimation (縮放動畫)、RotateAnimation (旋轉動畫)、AnimationSet (組合動畫)
2.動畫檔案存放位置
補間動畫定義檔案應該存放在res/anim檔案夾下,通路時采用R.anim.XXX.xml的方式,位置如圖:
3.根據xml檔案擷取動畫類的對象,并設定動畫
//擷取動畫對象
Animation animation = AnimationUtils.loadAnimation(this, R.anim.alpha_anim);
//你也可以擷取具體的動畫對象
AlphaAnimation animation = (AlphaAnimation) AnimationUtils.loadAnimation(this, R.anim.alpha_anim);
//給控件設定動畫
imageView.startAnimation(animation);
//這裡控件不僅僅是ImageView,也可以是TextView,或是一個布局或一個自定義View都是可以的!
4.各個補間動畫可以設定的通用屬性(Animation類的屬性)
下面這些屬性在各個補間動畫效果内都是通用的,并且表示的意義也是一樣的。
(1)android:interpolator 插值器
用于控制動畫的變化速度,使用動畫效果可以勻速,先加速再減速,先減速後加速或抛物線速度等各種速度變化,後面會有文章詳解
(2)android:repeatMode
用于設定動畫的重複方式,可選擇為reverse(反向)或restart(重新開始)
比如放大動畫,圖像變化剛開始從小到大,第二次會從大變小,後面一直重複。。。
(3)android:repeatCount
用于設定動畫的重複次數,屬性可以是代表次數的數值,也可以是infinite(無限循環)
預設次數為0,如果設定次數為1,動畫會執行2次,以此類推。。。
(4)android:duration
用于指定動畫持續的時間,機關為毫秒
如果你的動畫時間沒有設定,動畫就是在一瞬間完成的,比如從圖像從正常到很透明,就想換了一個圖檔的感覺,沒有過程。
(5)android:fillBefore
如果設定為true,控件動畫結束時,還原到開始動畫前的狀态
比如,透明動畫,從透明到完全顯示,動畫結束後,圖像會顯示動畫沒開始前的樣子。
(6)android:fillEnabled
與android:fillBefore 效果相同,都是在動畫結束時,将控件還原到初始化狀态
(7)android:fillAfter
如果設定為true,控件動畫結束時,将保持動畫最後時的狀态
這個屬性如果設定了為true,fillBefore也設定為true,動畫結束後,圖像是不會恢複的,就是以fillAfter為準。
如果fillAfter屬性設定為false,不管fillBefore設定為true還是false,圖像最終都是會恢複動畫前的樣子!
二.透明動畫:alpha
圖像大小不變,動畫實作圖像從某一個透明度的值變成另一個透明度的值。透明度的值從0到1的浮點數,0為透明,1為完全顯示。
xml代碼:
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="1.0" //設定開始時的透明度,這裡表示完全可見
android:toAlpha="0.1" //設定動畫結束時的透明度,很透明
android:duration="3000" //動畫持續時間
android:fillBefore="true" //是否是保持開始的樣子(完全可見),預設為true
android:fillAfter="true" //是否儲存結束時的透明度,預設為false
/>
解析:
透明動畫的屬性設定
1. android:fromAlpha
用于指定動畫開始時的透明度,值為0.0代表完全透明 ,值為1.0代表完全不透明
2. android:toAlpha
用于指定動畫結束時的透明度,值為0.0代表完全透明,值為1.0代表完全不透明
其他
注意上面屬性fillBefore和fillBefore如果都是true,以fillAfter屬性為主,即圖像保持動畫最後的效果。
如果上面兩個屬性都是false,最後圖像還是會顯示動畫開始時的樣子。
上面這段代碼運作的效果:
重複3次的效果:
從不太顯示到完全顯示三次效果。把重複的次數設定為2,即可。
設定:
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:fromAlpha="0.1"
android:toAlpha="1"
android:duration="3000"
android:fillAfter="false"
android:fillBefore="false"
android:repeatCount="2"
/>
效果:
三.平移動畫:translate
圖像大小不變,通過為圖像指定開始時的位置,結束時的位置,經及持續時間來建立動畫效果。
xml代碼
從左上角往右下角平移
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0" //x軸開始的位置
android:toXDelta="100" //往右滑動100個像素點
android:fromYDelta="0" //y軸開始的位置
android:toYDelta="100" //往下移動100個像素點
android:duration="2000" //時間2000毫秒
android:fillBefore="true"//動畫結束後,回到原來的位置
/>
解析:
1. android:fromXDelta
用于指定動畫開始時水準方向上的起始位置,預設機關是像素,可以使用100%代表的是自身長度,100%p代表的是父框體的長度。50%就是表示一半的距離。下面屬性的距離也可以這樣表示。
2. android:toXDelta
用于指定動畫結束時水準方向上的位置
3. android:fromYDelta
用于指定動畫開始時垂直方向上的位置
4. android:toYDelta
用于指定動畫結束時垂直方向上的位置
從左往右的平移:
剛好移出螢幕
設定:
android:fromXDelta="0" //x軸開始的位置
android:toXDelta="100%p" //往右滑動一個父框體的距離
android:fromYDelta="0" //y軸開始的位置
android:toYDelta="0" //不往下移動
android:duration="2000" //時間2000毫秒
android:fillBefore="true"//動畫結束後,回到原來的位置
效果:
圖解
從上下的平移:
設定:
android:fromXDelta="100"
android:toXDelta="100"
android:fromYDelta="0"
android:toYDelta="200"
android:duration="2000"
效果:
可以看到在距離y軸100像素的地方,從上往下移動200像素的效果。
從右下角往右上角平移:
設定:
““
android:fromXDelta=”80%p”
android:toXDelta=”0”
android:fromYDelta=”80%p”
android:toYDelta=”0”
####效果:

##四.縮放動畫:scale
改變圖檔大小,動畫指定開始時縮放系數,結束時的縮放系數,以及持續時間來他建動畫,在縮放時還可以通過指定軸心點坐标來改變綻放的中心。
###1.xml代碼
###2.解析
####(1)android:fromXScale 用于指定動畫開始時水準方向上的縮放系數,浮點數,值0表示無,值為1.0表示不變化 ,值為2.0表示放大一倍 。。。以此類推
####(2)android:toXScale 用于指定動畫結束時水準方向上的縮放系數。
####(3)android:fromYScale 用于指定動畫開始時垂直方向上的縮放系數。
####(4)android:toYScale 用于指定動畫結束時垂直方向上的縮放系數。
####(5)android:pivotX 用于指定軸心點X軸坐标,200表示距離y軸200個像素點的距離,50%表示自身的x軸中心點的,50%p表示父框體的x軸中心點
####(6)android:pivotY 用于指定軸心點Y軸坐标,200表示距離x軸200個像素點的距離,50%表示自身的y軸中心點的,50%p表示父框體的y軸中心點
###上面代碼運作的效果:

可以看到圖像是由無變到有,并且是(200,200)這個點開始做放大,最後到1.4倍後停下,并保持最後的樣子。
###從0變大到3倍效果:
####設定代碼:
設定在自身位置中心開始放大
android:fromXScale="0.0"
android:toXScale="3"
android:fromYScale="0.0"
android:toYScale="3"
android:pivotX="50%"
android:pivotY="50%"
####效果:

###在父窗體中心位置放大到0.5倍
####設定代碼:
android:fromXScale="0.0"
android:toXScale="0.5"
android:fromYScale="0.0"
android:toYScale="0.5"
android:pivotX="50%p"
android:pivotY="50%p"
這個比較坑的就是它會向你圖像本來的位置移動!這裡會從中心點向原點方向移動。
####效果:

這裡可以看到圖像向原來的方向移動一半,如果設定放大的倍率大于1,就會發現圖像移動到螢幕外面去了!如果設定x和y的倍率剛好是1,圖像放大後,剛好到原點的位置。
要想圖像在中心點放大或縮小,就要把圖像位置定在中心點,然後在自身的中心點,進行放大或縮小。
##五.旋轉動畫:rotate
旋轉動畫就是通過為動畫指定開始時的旋轉角度,結束時的旋轉角度,經及持續時間來建立動畫,在旋轉時還可以通過指定軸心點坐标來改為旋轉的中心。
###1.xml代碼
###2.解析
####(1)android:fromDegrees 用于指定動畫開始時旋轉的角度數,正負任意大小的浮點數,正的表示順時針,負的表示逆時針
####(2) android:toDeggrees 用于指定動畫結束時旋轉的角度 數,正負任意大小的浮點數,正的表示順時針,負的表示逆時針
####(3) android:pivotX 用于指定軸心點X軸坐标,20表示距離y軸20個像素點的距離,50%表示自身的x軸中心點的,50%p表示父框體的x軸中心點
####(4) android:pivotY 用于指定軸心點Y軸坐标 ,20表示距離x軸20個像素點的距離,50%表示自身的y軸中心點的,50%p表示父框體的y軸中心點
###上面代碼顯示的效果:

可以看到圖像,以自身為中心旋轉90度後停下來。
###圖檔以父窗體的40%的一個中心點旋轉180度
####代碼:
android:fromDegrees="0"
android:toDegrees="180"
android:pivotX="40%p"
android:pivotY="40%p"
android:duration="3000"
####效果:

可以看到圖檔旋轉了180,但是旋轉到了螢幕右下角
圖解:

###如果把最終角度換成360度,效果:
語句:android:toDegrees="360"

角度可以任意指定,旋轉720度,就會顯示旋轉兩圈效果!
這裡的pivotX和pivotY,我剛開始是以為圖像在這個點旋轉,但是實際上是以這個點為中心旋轉,半徑就是圖像原點到這個中心點之間的距離!
##六.組合動畫:set
組合動畫就是可以把多種動畫放在一起顯示。可以是單獨一個,也可以是多個東西一起顯示。
###1.xml代碼
2.解析
組合動畫,各個動畫的屬性還是不變
set标簽也是可以設定通用的那些屬性。
但是如果通用屬性在set标簽中設定,在其他動畫也設定,會有什麼效果呢?
根據之前Android的其他知識,我們知道裡面的标簽屬性會覆寫掉外面的标簽屬性,
但是這個補間動畫的卻不是,通用屬性都是以外邊set标簽中設定為準,不然可以看看上面代碼運作的效果,
上面代碼從左到右移動要5秒,裡面标簽設定旋轉時間2秒,但是實際效果是旋轉5秒時間
同樣,fillAfter等等這些通用屬性都是以set标簽為準的。
上面代碼的效果:
關于xml使用補間動畫,這裡已經詳細介紹了各方面的知識,但是插值器還沒有說,這個會在後面的文章介紹。
插值器,其實就是可以讓動畫顯示效果有點不同,比如一個平移過程,前期勻速,到中間加速到最後。
動畫還是原來動畫,隻是顯示的速率會發生改變!
共勉:成功是失敗走剩的路。
失敗是什麼?沒有什麼,隻是走向成功更近一步;怎麼走向成功呢?當你走穿所有失敗的路,剩下的那條路必定是成功的路,但是也不一定是每條路都走到底,有時候看穿也可以的。