Android 五類動畫簡單整理

fighting.jpg

分類5種:

Tween Animation、Property Animation

Frame Animation(Drawable、gif呀袱、Apng)初厚、SVG動畫件蚕、Airbnb Lottie

一、Tween Animation

AlphaAnimation:漸變透明度動畫效果
RotateAnimation:畫面轉(zhuǎn)移旋轉(zhuǎn)動畫效果
ScaleAnimation:漸變尺寸伸縮動畫效果
TranslateAnimation:畫面轉(zhuǎn)換位置移動動畫效果
AnimationSet:一個持有其它動畫元素alpha产禾、scale排作、translate、rotate或者其它set元素的容器
以上均可以自行設(shè)置插值器

二亚情、屬性動畫

記住一點就行妄痪,屬性動畫實現(xiàn)原理就是修改控件的屬性值實現(xiàn)的動畫

1、類繼承關(guān)系圖

Animator下有AnimatorSet势似、ValueAnimator拌夏,ValueAnimator下有ObjectAnimator、TimeAnimator履因。


extends.png
extends.png
2障簿、主要類作用

ValueAnimator:在一個特定的時間里執(zhí)行一個動畫
TimeAnimator:時序監(jiān)聽回調(diào)工具
ObjectAnimator:一個對象的一個屬性動畫
AnimatorSet:動畫集合

3、計算原理

Android屬性動畫(注意最低兼容版本栅迄,不過可以使用開源項目來替代低版本問題)提供了以下屬性:

Duration:動畫的持續(xù)時間站故;

TimeInterpolation:定義動畫變化速率的接口,所有插值器都必須實現(xiàn)此接口,如線性西篓、非線性插值器愈腾;

TypeEvaluator:用于定義屬性值計算方式的接口,有int岂津、float虱黄、color類型,根據(jù)屬性的起始吮成、結(jié)束值和插值一起計算出當(dāng)前時間的屬性值橱乱;

Animation sets:動畫集合,即可以同時對一個對象應(yīng)用多個動畫粱甫,這些動畫可以同時播放也可以對不同動畫設(shè)置不同的延遲泳叠;

Frame refreash delay:多少時間刷新一次,即每隔多少時間計算一次屬性值茶宵,默認(rèn)為10ms危纫,最終刷新時間還受系統(tǒng)進(jìn)程調(diào)度與硬件的影響;

Repeat Country and behavoir:重復(fù)次數(shù)與方式乌庶,如播放3次种蝶、5次、無限循環(huán)瞒大,可以讓此動畫一直重復(fù)蛤吓,或播放完時向反向播放;

  • 其中的ValueAnimator是動畫的執(zhí)行類糠赦,跟蹤了當(dāng)前動畫的執(zhí)行時間和當(dāng)前時間下的屬性值;ValueAnimator封裝了動畫的TimeInterpolator時間插值器和一個TypeEvaluator類型估值锅棕,用于設(shè)置動畫屬性的值拙泽。

  • 為了執(zhí)行一個動畫,你需要創(chuàng)建一個ValueAnimator裸燎,并且指定目標(biāo)對象屬性的開始顾瞻、結(jié)束值和持續(xù)時間。在調(diào)用start后德绿,整個動畫過程中荷荤, ValueAnimator會根據(jù)已經(jīng)完成的動畫時間計算得到一個0到1之間的分?jǐn)?shù),代表該動畫的已完成動畫百分比

  • 當(dāng)ValueAnimator計算完已完成動畫分?jǐn)?shù)后移稳,它會調(diào)用當(dāng)前設(shè)置的TimeInterpolator蕴纳,去計算得到一個interpolated(插值)分?jǐn)?shù),在計算過程中个粱,已完成動畫百分比會被加入到新的插值計算中古毛。

  • 當(dāng)插值分?jǐn)?shù)計算完成后,ValueAnimator會根據(jù)插值分?jǐn)?shù)調(diào)用合適的 TypeEvaluator去計算運動中的屬性值。

4稻薇、ObjectAnimator

繼承自ValueAnimator嫂冻,允許你指定要進(jìn)行動畫的對象以及該對象的一個屬性。該類會根據(jù)計算得到的新值自動更新屬性塞椎。大多數(shù)的情況使用ObjectAnimator就足夠了桨仿,因為它使得目標(biāo)對象動畫值的處理過程變得足夠簡單,不用像ValueAnimator那樣自己寫動畫更新的邏輯案狠,但是ObjectAnimator有一定的限制服傍,比如它需要目標(biāo)對象的屬性提供指定的處理方法(譬如提供getXXX,setXXX方法)莺戒,這時候你就需要根據(jù)自己的需求在ObjectAnimator和ValueAnimator中看哪種實現(xiàn)更方便了伴嗡。

ObjectAnimator類提供了ofInt、ofFloat从铲、ofObject這個三個常用的方法瘪校,這些方法都是設(shè)置動畫作用的元素、屬性名段、開始阱扬、結(jié)束等任意屬性值。當(dāng)屬性值(上面方法的參數(shù))只設(shè)置一個時就把通過getXXX反射獲取的值作為起點伸辟,設(shè)置的值作為終點麻惶;如果設(shè)置兩個(參數(shù)),那么一個是開始信夫、另一個是結(jié)束窃蹋。特別注意:ObjectAnimator的動畫原理是不停的調(diào)用setXXX方法更新屬性值,所有使用ObjectAnimator更新屬性時的前提是Object必須聲明有g(shù)etXXX和setXXX方法静稻。

5警没、ViewPropertyAnimator

ViewPropertyAnimator提供了一種非常方便的方法為View的部分屬性設(shè)置動畫(切記,是部分屬性)振湾,它可以直接使用一個Animator對象設(shè)置多個屬性的動畫杀迹;在多屬性設(shè)置動畫時,它比 上面的ObjectAnimator更加牛逼押搪、高效树酪,因為他會管理多個屬性的invalidate方法統(tǒng)一調(diào)運觸發(fā),而不像上面分別調(diào)用大州,所以還會有一些性能優(yōu)化续语。如下就是一個例子:
myView.animate().x(0f).y(100f).start();

6、Java屬性動畫拓展之LayoutAnimator容器布局動畫

Property動畫系統(tǒng)還提供了對ViewGroup中View添加時的動畫功能厦画,我們可以用LayoutTransition對ViewGroup中的View進(jìn)行動畫設(shè)置顯示绵载。LayoutTransition的動畫效果都是設(shè)置給ViewGroup,然后當(dāng)被設(shè)置動畫的ViewGroup中添加刪除View時體現(xiàn)出來。該類用于當(dāng)前布局容器中有View添加娃豹、刪除焚虱、隱藏、顯示等時候定義布局容器自身的動畫和View的動畫

mTransitioner = new LayoutTransition();
ObjectAnimator anim = ObjectAnimator.ofFloat(this,"scaleX",0,1);
......//設(shè)置更多動畫
mTransition.setAnimator(LayoutTransition.APPEARING, anim);
......//設(shè)置更多類型的動畫
mViewGroup.setLayoutTransition(mTransitioner);

三懂版、Drawable動畫詳細(xì)說明

我們依舊可以使用xml或者java方式實現(xiàn)幀動畫鹃栽。但是依舊推薦使用xml,具體如下:

**<animation-list>
** 必須是根節(jié)點躯畴,包含一個或者多個<item>元素民鼓,屬性有:

android : oneshottrue代表只執(zhí)行一次,false循環(huán)執(zhí)行蓬抄。

<item>類似一幀的動畫資源丰嘉。

<item> animation-list的子項,包含屬性如下:

android:drawable 一個frame的Drawable資源嚷缭。

android:duration 一個frame顯示多長時間饮亏。

特別注意,AnimationDrawable的start()方法不能在Activity的onCreate方法中調(diào)運阅爽,因為AnimationDrawable還未完全附著到window上路幸,所以最好的調(diào)運時機(jī)是onWindowFocusChanged()方法中。

四付翁、gif動畫

1简肴、GifDrawable koral大神出品

GitHub:https://github.com/koral--/android-gif-drawable
原理:采用JNI方式,把渲染操作放到了so庫中

2百侧、Movie實現(xiàn)播放:

http://hellorheaven.iteye.com/blog/2092907

五砰识、apng動畫

APNG 格式是 PNG 的擴(kuò)展,第一幀儲存方式和普通的 PNG 一樣在 IDAT 區(qū)段中佣渴,APNG 只是新增了三種區(qū)段仍翰,所以如果一個軟件只支持 PNG 而不支持 APNG 的話,依舊可以顯示出圖片的第一幀观话,只是不能動罷了。


六越平、SVG動畫

https://github.com/geftimov/android-pathview
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0825/3362.html

可惜的是Android官方目前(根據(jù)多方消息频蛔,估計不久會適配)對SVG格式的支持只是在Android 5.0 (LOLLIPOP) 以上,如果低版本需要使用SVG格式的圖片,你需要使用第三方開源庫 SVG Android
它主要有有以下幾種特征:

  1. SVG 用來定義用于網(wǎng)絡(luò)的基于矢量的圖形
  2. SVG 使用 XML 格式定義圖形
  3. SVG 圖像在放大或改變尺寸的情況下其圖形質(zhì)量不會有所損失
  4. SVG 是萬維網(wǎng)聯(lián)盟的標(biāo)準(zhǔn)
  5. SVG 與諸如 DOM 和 XSL 之類的 W3C 標(biāo)準(zhǔn)是一個整體

七秦叛、Lottie

Lottie 的使用流程很簡單晦溪,就是在AE中設(shè)計完成你的動畫后,通過bodymoving插件導(dǎo)出一份記錄動畫信息的JSON文件挣跋,然后開發(fā)人員使用 Lottie 的Android三圆,iOS,React Native apps開源動畫庫讀取這份JSON文件。

配置文件的位置舟肉,原生動畫的配置文件位置固定修噪,難以動態(tài)下發(fā)配置文件修改應(yīng)用內(nèi)的動畫,這一點lottie相比起來更有優(yōu)勢路媚。

支持的sdk版本不同黄琼,原生動畫中view動畫幾乎所有sdk版本都支持,屬性動畫api14以上支持(如果用外部庫ninneold的話可以支持到api9)整慎,而lottie支持api16以上

對硬件加速都無法完美支持脏款,開啟硬件加速之后會出現(xiàn) 將曲線繪制成空白矩形,或者黑屏的情況裤园,我想lottie也一定會存在這些問題撤师,因為他解析完數(shù)據(jù)后底層也是用android去實現(xiàn)的動畫繪制。
另外拧揽,AE軟件 思路其實和SVG是一致的剃盾,都是用描述語言去約束畫面,所以他們也會存在一些相同的問題和限制强法。 比如說svg圖往往更適合描述一些簡約的畫面万俗,比如單純的線條類的幾何界面,如果圖片需要豐富的顏色細(xì)節(jié)饮怯,陰影闰歪,光照,那svg描述起來就非常費力了蓖墅,而且體積會異常龐大库倘,我相信 lottie在處理這種類型的動畫時也必然 力不從心。

參考資料:
http://blog.csdn.net/yanbober/article/details/46481171
http://www.reibang.com/p/cae606f45c0b%0A
https://github.com/koral--/android-gif-drawable
http://hellorheaven.iteye.com/blog/2092907
https://github.com/geftimov/android-pathview
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0825/3362.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末论矾,一起剝皮案震驚了整個濱河市教翩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌贪壳,老刑警劉巖饱亿,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異闰靴,居然都是意外死亡彪笼,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門蚂且,熙熙樓的掌柜王于貴愁眉苦臉地迎上來配猫,“玉大人,你說我怎么就攤上這事杏死”靡蓿” “怎么了捆交?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長腐巢。 經(jīng)常有香客問我品追,道長,這世上最難降的妖魔是什么系忙? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任诵盼,我火速辦了婚禮,結(jié)果婚禮上银还,老公的妹妹穿的比我還像新娘风宁。我一直安慰自己,他們只是感情好蛹疯,可當(dāng)我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布戒财。 她就那樣靜靜地躺著,像睡著了一般捺弦。 火紅的嫁衣襯著肌膚如雪饮寞。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天列吼,我揣著相機(jī)與錄音幽崩,去河邊找鬼。 笑死寞钥,一個胖子當(dāng)著我的面吹牛慌申,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播理郑,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼蹄溉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了您炉?” 一聲冷哼從身側(cè)響起柒爵,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎赚爵,沒想到半個月后棉胀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡冀膝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年唁奢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畸写。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖氓扛,靈堂內(nèi)的尸體忽然破棺而出枯芬,到底是詐尸還是另有隱情论笔,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布千所,位于F島的核電站狂魔,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏淫痰。R本人自食惡果不足惜最楷,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望待错。 院中可真熱鬧籽孙,春花似錦、人聲如沸火俄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓜客。三九已至适瓦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谱仪,已是汗流浹背玻熙。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工镀琉, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留蚊逢,地道東北人份企。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓劳坑,卻偏偏與公主長得像恋谭,于是被迫代替她去往敵國和親嫌吠。 傳聞我的和親對象是個殘疾皇子匾竿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容