Lottie - Android 動畫詳解

Lottie 是 Airbnb 開源的火熱動畫庫,讓程序員告別痛苦的動畫。對于曾經(jīng)寫一個大動畫兩三千行代碼的我來說,無疑是一個巨大的福利。
接下來我將逐步介紹Lottie的使用及源碼,以及 Adobe After Effects 和 Bodymovin 的安裝和使用(mac)。 俗話說,不會做動畫的設(shè)計不是好程序員,讓我們開始吧。

相關(guān)文章

Lottie 是什么 ?

Lottie 是在 Android 和 iOS上 原生渲染 的After Effects(AE)動畫,Lottie是 Airbnb 開源的支持Android 和 iOS 的動畫庫,它可以解析 AE 動畫中用Bodymovin 導(dǎo)出的json文件,并在移動設(shè)備上利用原生庫進行渲染 !
本文翻譯于Lottie Git 項目,項目地址:https://github.com/airbnb/lottie-android

Lottie 好處 ?

先上圖 !

image
image

設(shè)計師的動畫可以完全的復(fù)現(xiàn),無需程序員手工重新創(chuàng)建,并且超于設(shè)計師預(yù)期,麻麻再也不用擔(dān)心實現(xiàn)跟設(shè)計有差距。
所有的這些動畫都是在 After Effects 中創(chuàng)建,使用Bodymovin導(dǎo)出,無需額外的工作,Bodymovin 是一個AE 的插件,導(dǎo)出效果文件作為json和一個javascript web 播放器,在其之上,Lottie將它擴展到 Android,iOS和React Native。

Lottie 的使用

1、添加 Gradle 依賴

dependencies {  
  compile 'com.airbnb.android:lottie:1.5.3'
}

2、使用View
Lottie支持Jellybean(API 16)及以上。最簡單的使用方法是LottieAnimationView

< com .airbnb.lottie.LottieAnimationView
         android :id = “ @ + id / animation_view ”
         android :layout_width = “ wrap_content ”
         android :layout_height = “ wrap_content ”
         app :lottie_fileName = “ hello-world.json ”
         app :lottie_loop = “ true “
         app :lottie_autoPlay = ” true “ />
}

或者從 代碼中加載。 從 app / src / main / assets中的json資源:

LottieAnimationView animationView = (LottieAnimationView) findViewById(R.id.animation_view);
animationView.setAnimation("hello-world.json");
animationView.loop(true);

如果你想復(fù)用動畫,比如在列表中的每個項目或者從網(wǎng)絡(luò)請求加載JSONObject

LottieAnimationView animationView = (LottieAnimationView) findViewById(R.id.animation_view);
 ...
 Cancellable compositionCancellable = LottieComposition.Factory.fromJson(getResources(), jsonObject, (composition) -> {
     animationView.setComposition(composition);
     animationView.playAnimation();
 });

然后控制動畫執(zhí)行或者對動畫添加監(jiān)聽

animationView.addAnimatorUpdateListener((animation) -> {
    // Do something.
});
animationView.playAnimation();
...
if (animationView.isAnimating()) {
    // Do something.
}
...
animationView.setProgress(0.5f);
...
// 自定義動畫的速度和持續(xù)時間
ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f)
    .setDuration(500);
animator.addUpdateListener(animation -> {
    animationView.setProgress(animation.getAnimatedValue());
});
animator.start(); // 動畫開始
...
animationView.cancelAnimation(); // 關(guān)閉

支持 After Effects 的功能

關(guān)鍵的插值器
  • Linear Interpolation 線性插值器

  • Bezier Interpolation 貝塞爾插值器

  • Hold Interpolation 保持插值器

  • Rove Across Time

  • Spatial Bezier

固定變換
  • Transform Anchor Point 錨點變換

  • Transform Position 位置變換

  • Transform Scale 伸縮比例變換

  • Transform Rotation 旋轉(zhuǎn)變換

  • Transform Opacity 透明度變換

遮罩 (碉堡了!)
  • Path 路徑

  • Opacity 不透明度

  • Multiple Masks (additive, subtractive, inverted) 多重多樣的遮罩

Track
  • Alpha Matte 透明度遮罩
Parenting
  • Multiple Parenting

  • Nulls

圖層形狀
  • Rectangle (All properties) 矩形

  • Ellipse (All properties) 橢圓

  • Polystar (All properties) 北極星?什么鬼

  • Polygon (All properties. Integer point values only.) 多邊形

  • Path (All properties) 路徑

  • Anchor Point 錨點

  • Position 位置坐標

  • Scale 縮放

  • Rotation 旋轉(zhuǎn)

  • Opacity 不透明

  • Group Transforms (Anchor point, position, scale etc) 合成變換

  • Multiple paths in one group 多路徑合成

沖程(形狀層,外層)
  • Stroke Color 描邊顏色

  • Stroke Opacity 不透明描邊

  • Stroke Width 描邊寬度

  • Line Cap 壓線帽

  • Dashes 破折號

填充
  • Fill Color 填充顏色

  • Fill Opacity 填充不透明度

修剪路徑
  • Trim Paths Start

  • Trim Paths End

  • Trim Paths Offset

性能和內(nèi)存

1、如果組合沒有用到遮罩masks或mattes,那么性能和內(nèi)存開銷應(yīng)該相當(dāng)不錯。沒有創(chuàng)建位圖bitmap,大多數(shù)操作都是簡單的畫布操作。
2、如果組合中有遮罩masks或mattes,將在合成的地方創(chuàng)建2-3個bitmap,當(dāng)動畫師徒添加到view時,bitmap由lotti自動創(chuàng)建,并在View刪除時被回收。所以不建議在RecyclerView中使用帶有遮罩masks或mattes的動畫,可能會造成溢出。(后面看到git又把這一條更新掉了,索性還是貼上來吧)!后來看到Git更新為:如果組合有遮罩或遮罩,將使用屏幕外緩沖區(qū),畫面以外的緩沖區(qū)的使用和性能會有影響了。
3、如果在list中使用,建議在LottieAnimationView.setAnimation(String,CacheStrategy)中使用CacheStrategy,因此動畫不必每次都反序列化。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,119評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,382評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,038評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,853評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,616評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,112評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,192評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,355評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,869評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,727評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,928評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,467評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,165評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,570評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,813評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,585評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,892評論 2 372

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