Android動畫可以分為三種:view動畫、幀動畫、屬性動畫
View動畫:通過對場景里的對象不斷做圖像變換(平移、縮放、旋轉、透明度)從而產生動畫效果,它是一種漸進式動畫,并且View動畫支持自定義
幀動畫:通過順序播放一系列圖像從而產生動畫效果,可以簡單理解為圖片切換動畫,很顯然,如果圖片過大很容易導致OOM
屬性動畫:通過動態地改變對象的屬性從而達到動畫效果
一、View動畫
View動畫的作用對象是View,它支持4種動畫效果,分別是平移動畫、縮放動畫、旋轉動畫和透明動畫。除了這四種動畫之外,幀動畫也屬于View動畫。
1.1 View動畫的種類
View動畫的四種變換效果對應著Animation的四個子類:TranslateAnimation、ScaleAnimation、RotateAnimation和AlphaAnimation。這四種動畫可以通過XML來創建,也可以通過代碼來創建,對于View動畫來說建議采用XML來創建動畫,這是因為XML可讀性更好。
View動畫都有固定的語法:
從上面的語法可看出,View動畫既可以是單個動畫,也可以由一系列動畫組成
<set>標簽標示動畫集合,對應SetAnimation類,可以包含多個若干個動畫,并且其內部也可以嵌套其他動畫集合的,其中兩個屬性含義如下:
android:interpolator
表示動畫集合所采用的插值器,插值器影響動畫的速度,比如非勻速動畫就需要通過插值器來控制動畫的播放過程
android:shareInterpolator
表示集合中的動畫是否和集合共享同一個插值器。如果集合不指定插值器,那么子動畫就需要單獨指定所需的插值器或者使用默認值。
translate 表示平移動畫
android:fromXDelta——表示X的起始值
android:fromYDelta——表示Y的起始值
android:toXDelta——表示X的結束值
android:toYDelta——表示Y的結束值
scale 表示縮放動畫
android:fromXScale——水平方向縮放的起始值
android:fromYScale——豎直方向縮放的起始值
android:pivotX——縮放的軸點的x坐標,它會影響縮放的效果
android:pivotY——縮放的軸點的y坐標,它會影響縮放的效果
android:toXScale——水平方向縮放的結束值
android:toYScale——豎直方向縮放的結束值
默認情況下軸點是View的中心點,這個時候再水平方向進行縮放的話會導致View向左右兩個方向同時進行縮放,但是如果把軸點設為View的右邊界,那么View就只會向左邊進縮放,反之則向右邊進行縮放。
rotate 表示旋轉動畫
android:pivotY——旋轉的軸點的x坐標
android:fromDegrees——旋轉開始的角度
android:pivotX——旋轉的軸點的y坐標
android:toDegrees——旋轉結束的角度
alpha 透明度動畫
android:fromAlpha——表示透明度的起始值
android:toAlpha——表示透明度的結束值
View動畫還有其他屬性:
android:duration——動畫的持續時間
android:fillAfter——動畫結束之后View是否停留在結束位置,true表示停留在結束位置
1.2 幀動畫
幀動畫是順序播放一組預先定義好的圖片,類似電影播放。不同于View動畫,系統提供了另外一個類AnimationDrawable來使用幀動畫。
首先需要通過xml來定義一個AnimationDrawable:
比較容易引起oom。
二、View動畫的特殊使用場景
2.1 LayoutAnimation
LayoutAnimation作用于ViewGroup,為ViewGroup指定一個動畫,這樣當它的子元素出場時都會有這種動畫效果。
android:delay?
表示子元素開始動畫的時間延遲,比如子元素入場動畫的時間周期為300ms,那么0.5表示每一個子元素都需要延遲150ms才能播放入場動畫
android:animation
為子元素指定具體的入場動畫
android:animationOrder
表示子元素動畫的順序,有三種選項:normal、reverse和random,其中normal表示順序顯示,即排在前面的子元素先開始播放入場動畫,reverse表示逆向顯示,即排在后面的子元素先開始播放入場動畫,random則是隨機播放入場動畫
2.2 Activity的切換效果
Activity有默認的切換效果,但是這個效果我們是可以自定義的,主要用到overridePendingTranslation(int enterAnim,int exitAnim)這個方法,這個方法必須在startActivity或者finish之后被調用才能生效,參數含義:
enterAnim——activity被打開時,所需的資源id
exitAnim——activity被暫停時,所需的動畫資源id
Frament可以通過FragmentTransaction中的setCustomAnimations()方法來添加切換動畫。
三、屬性動畫
3.1 使用屬性動畫
屬性動畫可以對任意對象的屬性進行動畫而不僅僅是View,動畫默認時間間隔300ms,默認幀率10ms幀。其可以達到的效果是:在一個時間間隔內完成對象從一個屬性值到另一個屬性值的改變。
屬性動畫是從API11才有,這就嚴重制約了屬性動畫的使用,可以采用開源動畫庫nineoldandroids。
nineoldandroids比較常用的幾個動畫類是:ValueAnimator、ObjectAnimation和AnimatorSet,其中ObjectAnimation繼承ValueAnimator。
1)改變一個對象的translationY屬性,讓其沿著Y軸向上平移一段距離:
ObjectAnimation.ofFloat(myObject,"translationY",-myObject.getHeight()).start();
2)改變一個對象的背景色屬性,典型的情形是改變View的背景色
讓背景色在3秒內實現從0XFFFF8080到0xFF8080FF的漸變,動畫會無限循環而且會有反轉的效果
ValueAnimator valueAnimator colorAnim=ObjectAnimation.ofInt(this,"backgroundColor",/*Red*/0xFFFF8080,/*Blue*/0xFF8080FF);
colorAnim.setDuration(3000);
colorAnim.setEvaluator(new ArgbEvaluator());
colorAnim.setRepeatCount(ValueAnimator.INFINITE);
colorAnim.setRepeatMode(ValueAnimator.REVERSE);
colorAnim.start();
3)動畫集合,5秒內對view的旋轉、平移、縮放和透明度都進行了改變
略
屬性動畫也可以通過XML定義,代碼如下:
其中,<set>標簽對應AnimatorSet,<animator>標簽對應ValueAnimator,<objectAnimator>對應ObjectAnimator。
其中,set標簽的android:ordering屬性有兩個可以選擇(默認值是together):
together:表示動畫集合中的子動畫同時播放
sequentially:表示動畫集合中的子動畫按照前后順序依次播放
android:propertyName——表示屬性動畫的作用對象的屬性的名稱
android:duration——表示動畫的時長
android:valueFrom——表示屬性的起始值
android:valueTo——表示屬性的結束值
android:startOffset——表示動畫的延遲時間,當動畫開始后,需要延遲多少毫秒才會真正播放此動畫
android:repeatCount——表示動畫的重復次數,默認是0,-1表示無限循環
android:repeatMode——表示動畫的重復模式,restart表示連續重復,reverse表示逆向重復
android:valueType——表示android:propertyName所指定的屬性的類型
如果android:propertyName所指定的屬性表示的是顏色,那么不需要指定valueType,系統會自動對顏色類型的屬性做處理
3.2 理解插值器和估值器
TimeInterpolator中文翻譯為時間插值器,它的作用是根據時間流逝的百分比來計算出當前屬性值改變的百分比,系統預置的有LineaeInterpolator(線性插值器:勻速動畫)、AccelerateDecelerateInterpolator(加速減速插值器:動畫兩頭慢中間快)和DecelerateInterpolator(減速插值器:動畫越來越慢)等。
TypeEvaluator的中文翻譯為類型估值算法,也叫估值器,它的作用是根據當前屬性改變的百分比來計算改變后的屬性值,系統預置的有IntEvaluator(針對整型屬性)、FloatEvaluator(針對浮點型屬性)和ArgbEvaluator(針對color屬性)。
對于勻速動畫,則使用的是線性插值器:
很顯然,線性插值器的返回值和輸入值一樣,因此插值器返回的值是0.5,這意味著x的改變也是0.5,這個時候插值器的工作就完成了。
evaluate的三個參數分別表示估值小數、開始值、結束值。
屬性動畫要求對象的該屬性有set和get方法(可選)。
可自定義插值器與估值算法,其中,自定義插值器需要實現Interpolator或者TimeInterpolator,自定義估值算法需要實現TypeEvaluator。如果要對其他類型(非int、float、Color)做動畫,那么必須要自定義類型估值算法。
3.3 屬性動畫的監聽器
屬性動畫提供了監聽器用于監聽動畫的播放過程,主要有如下兩個接口:AnimatorUpdateListener和AnimatorListener。
可監聽動畫的開始、結束、取消以及重復播放
會監聽這個動畫過程,動畫每播放一幀,就會被調用一次
3.4 對任意屬性做動畫
屬性動畫原理:屬性動畫要求動畫作用的對象提供該屬性的get和set方法,屬性動畫根據外界傳遞的該屬性的初始值和最終值,以動畫的效果多次去調用set方法,每次傳遞給set方法的值都不一樣,確切的說是隨著時間的推移,所傳遞的值越來越接近最終值。總結一下,我們對object的屬性abc做動畫,如果想讓動畫生效,要同時滿足兩個條件:
1、object必須要提供setAbc方法,如果動畫的時候沒有傳遞初始值,那么還要提供getAbc方法,因為系統要去取abc屬性的初始值。
2、object的setAbc對屬性abc所做的改變必須通過某種方法來反映出來,比如帶來UI得改變之類的。