Lottie開源動畫庫介紹與使用示例

碉堡的Lottie

Airbnb最近開源了一個名叫Lottie的動畫庫,它能夠同時支持iOS,Android與ReactNative的開發.此消息一出,還在苦于探索自定義控件各種炫酷特效的我,興奮地就像發現的新大陸一般.可以說,Lottie的出現,將極大地解放Android/iOS工程師于無盡的編寫原生自定義動畫的工作中.
當我們的項目中用GIF實現一些復雜的視覺效果的時候,會遇到許多的問題.比如,GIF的文件過于龐大,并且對于不同分辨率設備的適配存在不便,并且Gif格式的色深問題是一個死穴.

比如下面這幾個動畫效果:

http://cdn.trojx.me/blog_pic/Example1.gif

還有這些:

http://cdn.trojx.me/blog_pic/Example2.gif

設計這些動畫效果顯然不是寫代碼的程序員應該負責的事情.那有沒有什么辦法,能讓美工在AE軟件上設計的動畫直接用于移動端呢?
有的,那就是使用Lottie.

http://cdn.trojx.me/blog_pic/lottie_sum.png

如上圖所示,通過安裝在AE上的一款名叫bodymovin的插件,能夠將AE中的動畫工程文件轉換成通用的json格式描述文件,bodymovin插件本身是用于在網頁上呈現各種AE效果的一個開源庫,lottie做的事情就是實現了一個能夠在不同移動端平臺上呈現AE動畫的方式.從而達到動畫文件的一次繪制、一次轉換、隨處可用的效果.
當然,就如Java一次編譯,隨處運行一樣,lottie本身這個動畫播放庫并不是跨平臺的.

上手使用

說了那么多,下面來詳細說說怎樣使用這個碉堡的庫.首先聲明,以下涉及到的軟件可能包含破解版,如果你資金充裕,請支持正版.
以下使用方式與軟件在2017年2月6日都有效.

安裝Adobe After Effects CC 2017

Adobe是個好公司,做了很多牛逼的軟件,但是無一例外都被國人破解了.本例使用的是最新版的AE CC 2017.

http://cdn.trojx.me/blog_pic/AE_CC_2017.png

感謝作者提供軟件.注意此版本只適用于WIN 64位系統,筆者在 Win7 64 位
環境下能夠正常安裝并使用.安裝過程中按照內置說明安裝即可.

安裝bodymovin插件

想了解此插件可以參看該插件的GitHub頁面.

下載bodymovin.zxp插件包

此文件位于工程中的/build/extension/目錄下,如果外網速度慢可以從這里可以下載該插件的最新版本.

安裝插件

項目說明中給出了為AE安裝插件的三種方式:

這三種筆者都試過,最后得出只有第二種(也是看起來最繁瑣的)有效.這里詳細說明一下第二種方法:

  • 先關閉AE;
  • 用WinRAR或類似軟件打開bodymovin.zxp文件,并將解壓后的文件夾直接復制到C:\Program Files (x86)\Common Files\Adobe\CEP\extensions
    或者是C:<username>\AppData\Roaming\Adobe\CEP\extensions下,對于MAC機器路徑是/Library/Application\ Support/Adobe/CEP/extensions/bodymovin
    http://cdn.trojx.me/blog_pic/bodymovin_zxp_extracted.png

    http://cdn.trojx.me/blog_pic/bodymovin_zxp_extracted_copy.png
  • 修改注冊表.對于Windows,打開注冊表修改器,找到HKEY_CURRENT_USER/Software/Adobe/CSXS.6,并在此路徑下添加一個名為PlayerDebugMode的KEY,
    并賦值為1;對于MAC,打開文件~/Library/Preferences/com.adobe.CSXS.6.plist并在末尾添加一行,鍵為PlayerDebugMode,值為1.
  • 設置AE 無論以何種方式安裝bodymovin插件,都需要在AE的編輯->首選項->常規中勾選允許腳本寫入文件和訪問網絡(默認不開啟)
    http://cdn.trojx.me/blog_pic/ae_setting.png

開始制作動畫

由于筆者目前不會使用AE(廢話,軟件都是剛裝的),這里我們打開一個現有的工程文件.
從這里可以找到一些Lottie中演示過的動畫的AE源文件,下載到本地后在AE中打開即可.這里我們選用EmptyState.aep這個實例工程,稍作修改:

http://cdn.trojx.me/blog_pic/empty_page_editting.png

導出json數據

如果上文的bodymovin插件安裝成功的話,在AE中的窗口->拓展中是能夠找到它的.

http://cdn.trojx.me/blog_pic/ae_bodymovin_menu.png

在插件窗口中選擇json數據文件導出的路徑,點擊Render按鈕即可渲染工程并導出.

http://cdn.trojx.me/blog_pic/ae_bodymovin_render.png

使用Lottie庫播放動畫

終于說到主角了,然而關于它的使用方式卻是相對簡單的.Lottie的引入與使用就如其他庫一樣,這里以Android平臺的使用為例.

在項目的build.gradle文件中加入:

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

Lottie支持Jellybean (API 16)及以上的系統,最簡單的使用方式是直接在布局文件中添加:

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

這方法將在后臺線程異步加載數據文件,并在加載完成后開始渲染顯示動畫.
如果你想復用加載的動畫,例如下一個ListView中每一項都需要顯示這個動畫,那么你可以這么做:

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

你還可以通過API控制動畫,并且設置一些監聽:

    animationView.addAnimatorUpdateListener((animation) -> {
        // Do something.
    });
    animationView.playAnimation();
    ...
    if (animationView.isAnimating()) {
        // Do something.
    }
    ...
    animationView.setProgress(0.5f);
    ...
    // 自定義速度與時長
    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對已經加載并轉換好的動畫持有怎樣形式的引用(強引用/弱引用).

補充

lottie在iOS中的使用介紹可以參看陳董DON的文章

分享一個能夠在瀏覽器中預覽json動畫數據的網站

Lottie官方給的Android Demo安裝包使用它能夠查看示例動畫,并能夠載入并播放來自本地存儲或網絡的json動畫數據.

好了,先寫到這里,我去研究AE去了~后續應該會補上一個使用Lottie的Android Demo.
原文地址 http://www.trojx.me/2017/02/06/android-lottie-library/

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

推薦閱讀更多精彩內容