碉堡的Lottie
Airbnb最近開源了一個名叫Lottie的動畫庫,它能夠同時支持iOS,Android與ReactNative的開發.此消息一出,還在苦于探索自定義控件各種炫酷特效的我,興奮地就像發現的新大陸一般.可以說,Lottie的出現,將極大地解放Android/iOS工程師于無盡的編寫原生自定義動畫的工作中.
當我們的項目中用GIF實現一些復雜的視覺效果的時候,會遇到許多的問題.比如,GIF的文件過于龐大,并且對于不同分辨率設備的適配存在不便,并且Gif格式的色深問題是一個死穴.
比如下面這幾個動畫效果:
還有這些:
設計這些動畫效果顯然不是寫代碼的程序員應該負責的事情.那有沒有什么辦法,能讓美工在AE軟件上設計的動畫直接用于移動端呢?
有的,那就是使用Lottie.
如上圖所示,通過安裝在AE上的一款名叫bodymovin的插件,能夠將AE中的動畫工程文件轉換成通用的json格式描述文件,bodymovin插件本身是用于在網頁上呈現各種AE效果的一個開源庫,lottie做的事情就是實現了一個能夠在不同移動端平臺上呈現AE動畫的方式.從而達到動畫文件的一次繪制、一次轉換、隨處可用的效果.
當然,就如Java一次編譯,隨處運行
一樣,lottie
本身這個動畫播放庫并不是跨平臺的.
上手使用
說了那么多,下面來詳細說說怎樣使用這個碉堡的庫.首先聲明,以下涉及到的軟件可能包含破解版,如果你資金充裕,請支持正版.
以下使用方式與軟件在2017年2月6日都有效.
安裝Adobe After Effects CC 2017
Adobe是個好公司,做了很多牛逼的軟件,但是無一例外都被國人破解了.本例使用的是最新版的AE CC 2017.
感謝作者提供軟件.注意此版本只適用于WIN 64位系統,筆者在 Win7 64 位
環境下能夠正常安裝并使用.安裝過程中按照內置說明安裝即可.
安裝bodymovin插件
想了解此插件可以參看該插件的GitHub頁面.
下載bodymovin.zxp
插件包
此文件位于工程中的/build/extension/
目錄下,如果外網速度慢可以從這里可以下載該插件的最新版本.
安裝插件
項目說明中給出了為AE安裝插件的三種方式:
- 通過第三方軟件ZXP Installer安裝;
- 手動安裝;
- 使用Adobe官方插件安裝器安裝.
這三種筆者都試過,最后得出只有第二種(也是看起來最繁瑣的)有效.這里詳細說明一下第二種方法:
- 先關閉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
這個實例工程,稍作修改:
導出json數據
如果上文的bodymovin
插件安裝成功的話,在AE中的窗口->拓展
中是能夠找到它的.
在插件窗口中選擇json數據文件導出的路徑,點擊Render
按鈕即可渲染工程并導出.
-
原始工程動畫效果:
http://cdn.trojx.me/blog_pic/empty_state_origin.gif 原始工程導出的json文件:http://cdn.trojx.me/blog_raw/lottie_data_origin.json
-
修改后工程動畫效果:
http://cdn.trojx.me/blog_pic/empty_state_edit.gif 修改后工程導出的json文件:http://cdn.trojx.me/blog_raw/lottie_data_edit.json
使用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/