Airbnb 動畫庫Lottie

在Android和iOS上機器上渲染After Effects動畫的工具

Lottie 支持Android, iOSReact Native,本片文章介紹在Android中使用Lottie。

例子apk下載

Lottie 是一個可以解析AE( Adobe After Effects )上的插件Bodymovin導出的json文件并且能在移動設備上渲染的一個android和ios動畫庫。

首先設計師能創建出美麗的動畫,而不需要工程師用代碼手寫創建它。這樣效率可以大大的提升。

所有這些動畫都是在After Effects中創建的,使用Bodymovin導出,并且無需額外的工程師工作即可完成原生渲染。

Bodymovin是一個又Hernan Torrisi 創建的After Effects插件,導出文件格式為json和包括一個javascript網絡播放器。 我們建立在他的肩上將其使用擴展到Android,iOS和React Native平臺上。

了解更多請訪問我們的博客

示例App

你能自己創建例子app和從playstore下載。例子app包括一些基本的動畫但也允許你使用本地存儲的和網絡現在的json文件。

下載

Gradle是唯一支持的構建配置方式,因此只需將依賴項添加到項目build.gradle文件中即可:

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

使用Lottie

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);

接下來這種方法將加載文件放在后臺異步解析動畫json文件,并在完成后呈現動畫。

如果你想重用一個從列表中選擇的或者網絡請求的JSONObject 你可以這樣

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

然后你還可以自己控制這個動畫或者添加監聽器:

animationView.addAnimatorUpdateListener((animation) -> {
// Do something.
});
animationView.playAnimation();
...
if (animationView.isAnimating()) {
// Do something.
}
...
animationView.setProgress(0.5f);
...

// Custom animation speed or duration.
ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f)
.setDuration(500);
animator.addUpdateListener(animation -> {
animationView.setProgress(animation.getAnimatedValue());
});
animator.start();
...
animationView.cancelAnimation();

其實在這個庫中LottieAnimationView 通過LottieDrawable來渲染動畫的。如果你需要你可以直接使用drawable形式:

LottieDrawable drawable = new LottieDrawable();
LottieComposition.fromAssetFileName(getContext(), "hello-world.json", (composition) -> {
drawable.setComposition(composition);
});

如果你的動畫將被頻繁重用,LottieAnimationView有一個可選的緩存策略內置。使用#LottieAnimationView#setAnimation(String,CacheStrategy)。 CacheStrategy可以是Strong,Weak或None三種形式來讓LottieAnimationView對加載和解析動畫的使用強或弱引用的方式。

支持的After Effects功能

Keyframe Interpolation

  1. Linear Interpolation
  2. Bezier Interpolation
  3. Hold Interpolation
  4. Rove Across Time
  5. Spatial Bezier

Solids

  1. Transform Anchor Point
  2. Transform Position
  3. Transform Scale
  4. Transform Rotation
  5. Transform Opacity

Masks

  1. Path
  2. Opacity
  3. Multiple Masks (additive)

Track Mattes

Alpha Matte

Parenting

  1. Multiple Parenting
  2. Nulls

Shape Layers

Anchor Point
Position
Scale
Rotation
Opacity
Path
Group Transforms (Anchor point, position, scale etc)
Rectangle (All properties)
Elipse (All properties)
Multiple paths in one group

Stroke (shape layer)

Stroke Color
Stroke Opacity
Stroke Width
Line Cap
Dashes

Fill (shape layer)

Fill Color
Fill Opacity

Trim Paths (shape layer)

Trim Paths Start
Trim Paths End
Trim Paths Offset

性能和內存

如果LottieAnimationView 的composition 沒有masks或mattes,那么性能和內存開銷應該相當不大。沒有創建位圖,大多數操作都是簡單的畫布操作。
如果合成具有遮罩,則將在合成大小處創建2-3個位圖。當動畫視圖添加到窗口時,位圖由lottie自動創建,并在從窗口中刪除時重新生成。因此,不建議在RecyclerView中使用帶有masks或mattes的動畫,因為它會導致顯著的位圖流失。除了內存流失之外,額外的bitmap.eraseColor()和canvas.drawBitmap()調用對于masks和mattes是必要的,這將降低動畫的性能。對于簡單動畫,性能命中不應該大到足以在實際使用時明顯。如果您在列表中使用動畫,建議在LottieAnimationView.setAnimation(String,CacheStrategy)中使用CacheStrategy,因此動畫不必每次都反序列化。

試試看

clone此庫并運行LottieSample模塊以查看一堆示例動畫。 它們的JSON文件位于LottieSample / src / main / assets中,而orignal After Effects文件位于/ After Effects示例中

示例應用程序還可以在給定的URL或您設備上的本地加載json文件(如從網絡下載或您本地的sdcard)。

社區貢獻

Xamarin bindings
NativeScript bindings

備擇方案

  1. 手動構建動畫。 手動構建動畫是Android和iOS設計和工程的巨大時間承諾。 經常很難,甚至不可能證明花費這么多時間來獲得動畫是正確的。
  2. Facebook Keyframes 。 Keyframes 是一個來自于Facebook美妙的的新動畫庫。 但是Keyframes 不支持的一些功能如面具,遮罩,修剪路徑,虛線模式等但是Lottie可以。
  3. Gifs。 Gif是一個bodymovin JSON的大小的兩倍,并且以固定的大小呈現,不能按比例放大以匹配大和高密度屏幕。
  4. Png幀動畫。 這種比gif更糟糕,因為它們的文件大小通常是bodymovin json的大小的30-50倍,也不能放大。

為什么叫Lottie

Lottie以德國一個剪輯電影最出名的導演命名。 她最著名的電影是“Achmed王子的冒險”(1926年) - 最古老的feature-length動畫電影,在Walt Disney's的feature-length白雪公主和七個小矮人(1937)之前十多年里的 The art of Lotte Reineger

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

推薦閱讀更多精彩內容