一、序
Hi,大家好,我是承香墨影!
Lottie 是 Airbnb 開源的一套跨平臺的完整解決方案,設計師只需要使用 After Effectes (之後簡稱 AE)設計出動畫之後,使用 Lottic 提供的 Bodymovin 外掛將設計好的動畫匯出成 JSON 格式,就可以直接運用在 iOS、Android 和 React Native之上,無需關心中間的實現細節。
這樣,對於不同的工作角色來說,Lottie 帶來的都是更簡潔的工作流。開發小哥哥不再擔心動畫實現困難,設計師小姐姐也不需要擔心實現的效果會有偏差。
關於 Lottie 的基本使用,之前也寫過一篇文章,不瞭解的同學可以先看看《聊聊 Airbnb 的 Lottie》。
不過當時的文章有些細節沒有講明白,那就是有時候設計師實現的的動畫,其實也是在操作一些圖片資源的變換,這樣使用 Bodymovin 在 AE 上匯出的時候,會同時匯出一些圖片資源。
那麼,如何使用 Lottie 載入一個帶圖片的動畫資源,就是我們今天需要討論的主題。
二、需要圖片資源的動畫
今天主要討論帶圖片資源的 Lottie 動畫。
Lottie 提供的動畫資源,其實是可以從很多途徑進行載入的,例如你可以放在本地的 assets
目錄下,或者放線上上動態下載。
下面我們就分情況來講解如何載入一個有圖片資源的 Lottie 動畫,並且最後來說說如何讓設計師把圖片資源整合到 Lottie 的 JSON 檔案中。
2.1 包內資源
有一些不經常變動的動畫資源,我們會選擇打包在 Apk 中,一般會放在 assets
目錄下。
這其實是一種最簡單的方式,Lottie 提供了一個 setImageAssetsFolder()
以及 app:imageAssetsFolder
屬性,來為我們設定一個 Lottie 動畫需要的圖片資源在 assets
下的路徑。
setImageAssetsFolder()
方法接受一個相對的目錄路徑,閱讀它的文件就知道如何配置了。
接下來我們舉個例子來說明問題。
例如,我在 assets 目錄下存放了我需要的動畫資源,它的目錄結構如下。
這個時候,我在佈局中寫:
<com.airbnb.lottie.LottieAnimationView
android:id="@+id/lottieView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:imageAssetsFolder="images/"
app:lottie_autoPlay="false"
app:lottie_fileName="question_like.json"
app:lottie_loop="false" />
複製程式碼
或者在程式碼裡寫(kotlin 示意):
lottieView.imageAssetsFolder = "images/"
lottieView.setAnimation("xinfeng.json")
lottieView.loop(true)
lottieView.playAnimation()
複製程式碼
這兩種方式都是等效的,最終會去載入我們的動畫資源。
在這個動畫中有三個圖片資源,非常的簡單,因為信封圖片為白色,所以我將底色調整成了藍色。
2.2 線上下載資源
最理想的方式是將圖片打包在 Apk 中一起釋出出去,但是對於一些需要經常變動動畫的需求,是無法接受每次釋出新版本來替換動畫資源的。
這個時候,我們可以選擇動態下發動畫資源,也就是在需要的時候,提前將動畫資源下載到本地的檔案系統中。
此時,我們再使用 setImageAssetsFolder()
方法就沒有效果了,因為本身圖片就已經不在 assets
目錄下。
繼續在原始碼中找答案,實際上 Lottie 載入的圖片資源,最終會指定到 ImageAssetsManager 的 bitmapForId()
方法,它的實現如下。
關鍵程式碼我已經用紅框標記出來了,bitmapForId(
) 接收一個 String 型別的 id,它其實就是我們動畫資源中,圖片資源的名稱。而 Lottie 允許我們在載入 assets 目錄資源之前,設定一個代理,通過代理的 fetchBitmap()
方法,來提前載入一個圖片資源,供 Lottie 動畫使用。這裡的圖片載入代理,可以使用 setImageAssetDelegate()
方法進行設定。
接下來的步驟就簡單了,我們從本地的檔案系統中,載入一個動畫檔案的輸入流,然後使用 setImageAssetsDelegate()
方法設定一個代理即可。
val fileInputStream = FileInputStream(File("/sdcard/xinfeng.json"))
LottieComposition.Factory.fromInputStream(this,fileInputStream,{ composition ->
lottieView.setComposition(composition!!)
lottieView.setImageAssetDelegate { asset ->
BitmapFactory.decodeStream(assets.open(asset.dirName + asset.fileName))
}
lottieView.loop(true)
lottieView.playAnimation()
})
複製程式碼
動畫效果和之前一樣,就不再過多展示了。
這種方式其實也有點複雜了,因為需要經歷一個檔案下載,接下來讓我們看看一個對開發來說,最簡單的方案。
2.3 將圖片資源放入 JSON
到這裡,我想說,其實 Lottie 動畫所需要的圖片資源也是可以整合在動畫的 JSON 檔案中。
如果你能說服設計師,將圖片資源整合到動畫的 JSON 檔案中,那你的工作量就可以節約很多。
接下來我們就來看看如何將圖片資源打包到動畫的 JSON 檔案中。
其實官方文件中,已經給出了非常健全的文件,建議直接把文件發給設計師小姐姐,讓她自己體會,開發人員其實也不需要太關心其中的細節。
http://airbnb.io/lottie/after-effects/artwork-to-lottie-walkthrough.html
為了讓你能更好的和設計師小姐姐溝通,簡單說一下步驟:
- 需要先將圖片轉換成向量圖 SVG 格式,這個設計師一定有辦法。
- 使用 Illustrator 將 SVG 檔案另存為 .ai 檔案。
- 使用 .ai 檔案在 AE 中做動畫處理。
- 最後通過 Bodymovin 外掛,輸出動畫資源。
這樣,輸出的 JSON 裡面,其實就已經包含了圖片的資訊。同時,JSON 檔案的大小也會增大,你可以理解是把向量圖打包到了 JSON 檔案中,不過這也不完全對。整體來看體積還是非常小的,以現在的例子來說,只是從 3kb 增大到了 15kb。
所以這可以算是一個最優的解決方案,強烈推薦你試著說服設計師小姐姐。
三、設計師校驗
如果設計師願意為你製作沒有圖片資源的動畫 JSON,那設計師如何自己檢驗自己匯出的 JSON 檔案是否正確呢?
Lottiefiles 網站提供了一個 preview 的頁面,如果你的動畫只有一個 JSON 檔案,那直接拖拽進去就可以進行預覽。
https://www.lottiefiles.com/preview
在 Preview 頁面可以直接預覽,並且右下角還會有一個二維碼,可以只用 Lottie 的 Demo App 掃碼在手機上預覽。
需要注意的是,這種方式,只針對沒有圖片資源的動畫 JSON 才有效。如果是帶圖片資源的動畫,也只能開發自己使用程式實現的方式進行預覽!
好了,再遇上 Lottie 動畫有圖片的時候,知道怎麼和設計師溝通了嗎?有其他問題歡迎在留言區留言!
今天在公眾號後臺回覆成長『成長』,將會得到我整理的一些學習資料,也能回覆『加群』,一起學習進步。
推薦閱讀: