Android動畫深入分析

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動畫都有固定的語法:

從上面的語法可看出,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。

AnimatorListener

可監聽動畫的開始、結束、取消以及重復播放

AnimatorUpdateListener

會監聽這個動畫過程,動畫每播放一幀,就會被調用一次

3.4 對任意屬性做動畫

屬性動畫原理:屬性動畫要求動畫作用的對象提供該屬性的get和set方法,屬性動畫根據外界傳遞的該屬性的初始值和最終值,以動畫的效果多次去調用set方法,每次傳遞給set方法的值都不一樣,確切的說是隨著時間的推移,所傳遞的值越來越接近最終值。總結一下,我們對object的屬性abc做動畫,如果想讓動畫生效,要同時滿足兩個條件:

1、object必須要提供setAbc方法,如果動畫的時候沒有傳遞初始值,那么還要提供getAbc方法,因為系統要去取abc屬性的初始值。

2、object的setAbc對屬性abc所做的改變必須通過某種方法來反映出來,比如帶來UI得改變之類的。


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,643評論 2 380

推薦閱讀更多精彩內容

  • 7.1 View 動畫 View 動畫對應這 Animation 的四個子類: 標簽表示動畫集合,對應 Anima...
    kongjn閱讀 355評論 0 0
  • 1 背景 不能只分析源碼呀,分析的同時也要整理歸納基礎知識,剛好有人微博私信讓全面說說Android的動畫,所以今...
    未聞椛洺閱讀 2,735評論 0 10
  • 從上個版本開始,工程的Appstore安裝包竟然達到了53M,簡直到了不能忍的地步,工程瘦身勢在必行。 1,刪除自...
    悟_空閱讀 2,950評論 27 84
  • 鹿玙—40 她姓孫,我們都叫她孫主任。 孫主任年近五十歲,對你來說她也許只是蕓蕓眾生中的一個,普通的不能再普通,但...
    鹿玙閱讀 272評論 2 1
  • 我不是習慣晚睡 只是夜里沒有你的對白 令我有點狼狽
    風吟依舊閱讀 178評論 0 0