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 位置坐標(biāo)

  • 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)系作者
  • 序言:七十年代末邀摆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子伍茄,更是在濱河造成了極大的恐慌栋盹,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件敷矫,死亡現(xiàn)場離奇詭異例获,居然都是意外死亡汉额,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門榨汤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蠕搜,“玉大人,你說我怎么就攤上這事收壕〖斯啵” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵蜜宪,是天一觀的道長虫埂。 經(jīng)常有香客問我,道長圃验,這世上最難降的妖魔是什么掉伏? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮澳窑,結(jié)果婚禮上斧散,老公的妹妹穿的比我還像新娘。我一直安慰自己摊聋,他們只是感情好鸡捐,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著栗精,像睡著了一般闯参。 火紅的嫁衣襯著肌膚如雪瞻鹏。 梳的紋絲不亂的頭發(fā)上悲立,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機與錄音新博,去河邊找鬼薪夕。 笑死,一個胖子當(dāng)著我的面吹牛赫悄,可吹牛的內(nèi)容都是我干的原献。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼埂淮,長吁一口氣:“原來是場噩夢啊……” “哼姑隅!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起倔撞,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤讲仰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后痪蝇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鄙陡,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡冕房,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了趁矾。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耙册。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖毫捣,靈堂內(nèi)的尸體忽然破棺而出详拙,到底是詐尸還是另有隱情,我是刑警寧澤蔓同,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布溪厘,位于F島的核電站,受9級特大地震影響牌柄,放射性物質(zhì)發(fā)生泄漏畸悬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一珊佣、第九天 我趴在偏房一處隱蔽的房頂上張望蹋宦。 院中可真熱鬧,春花似錦咒锻、人聲如沸冷冗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蒿辙。三九已至,卻和暖如春滨巴,著一層夾襖步出監(jiān)牢的瞬間思灌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工恭取, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泰偿,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓蜈垮,卻偏偏與公主長得像耗跛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子攒发,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355

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