分類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履因。
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
它主要有有以下幾種特征:
- SVG 用來定義用于網(wǎng)絡(luò)的基于矢量的圖形
- SVG 使用 XML 格式定義圖形
- SVG 圖像在放大或改變尺寸的情況下其圖形質(zhì)量不會有所損失
- SVG 是萬維網(wǎng)聯(lián)盟的標(biāo)準(zhǔn)
- 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