Lottie在iOS的可用性調(diào)研

Lottie是什么婶熬?

用影片制作軟件adobe after effects cc可以設(shè)計(jì)一個(gè)在app上顯示的動(dòng)畫效果,安裝bodymovin插件后可以用其導(dǎo)出一份該動(dòng)畫的json丛肮。Lottie實(shí)現(xiàn)了Android/iOS/React Native 三個(gè)平臺(tái)對(duì)該 json 文件的解析和渲染梆造。

通過(guò)插件導(dǎo)出的文件如下
<img src="http://upload-images.jianshu.io/upload_images/1840221-759f1c1aee3ebc0a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width=400>

  • demo.html可以直接運(yùn)行看到動(dòng)畫效果
  • images和templateCards.json直接放到bundle里供lottie調(diào)用顯示動(dòng)畫

性能

1. 內(nèi)存
方法:找了兩個(gè)動(dòng)畫json作為測(cè)試對(duì)象片酝,一個(gè)是球形下拉動(dòng)畫欧瘪,一個(gè)是多張圖片變換成字母A的動(dòng)畫眷射。分別查看結(jié)束時(shí)的內(nèi)存情況。



結(jié)果:從圖片上看內(nèi)存占用分別是佛掖,21k左右和43k左右妖碉,內(nèi)存占用還是非常小的。

2. 幀率
方法:進(jìn)入目標(biāo)工程內(nèi)芥被,待內(nèi)存和幀率平穩(wěn)后播放動(dòng)畫欧宜,查看幀率。
結(jié)果:幀率保持在59和60

從以上兩個(gè)動(dòng)畫的json效果看拴魄,lottie的性能表現(xiàn)非常好冗茸。
查看了一下官方說(shuō)明席镀,在以下情況下會(huì)對(duì)性能有影響

  1. 如果沒(méi)有mask和mattes,那么性能和內(nèi)存非常好夏漱,沒(méi)有bitmap創(chuàng)建豪诲,大部分操作都是簡(jiǎn)單的cavas繪制。
  2. 如果存在mattes麻蹋,將會(huì)創(chuàng)建2~3個(gè)bitmap跛溉。bitmap在動(dòng)畫加載到window時(shí)被創(chuàng)建焊切,被window刪除時(shí)回收扮授。所以不宜在RecyclerView中使用包涵mattes或者mask的動(dòng)畫,否則會(huì)引起bitmap抖動(dòng)专肪。除了內(nèi)存抖動(dòng)刹勃,mattes和mask中必要的bitmap.eraseColor()和canvas.drawBitmap()也會(huì)降低動(dòng)畫性能。對(duì)于簡(jiǎn)單的動(dòng)畫嚎尤,在實(shí)際使用時(shí)性能不太明顯荔仁。
  3. 如果在列表中使用動(dòng)畫,推薦使用緩存LottieAnimationView.setAnimation(String, CacheStrategy) 芽死。

功能支持

動(dòng)畫效果的支持范圍乏梁,對(duì)業(yè)務(wù)有比較大的意義,查看發(fā)現(xiàn)一般的功能都可以滿足关贵。目前雖然支持圖片圖層遇骑,但不支持遠(yuǎn)程圖片下載,在使用時(shí)這個(gè)功能是肯定要做進(jìn)去的揖曾。漸變色也是很常用的落萎,但目前尚未支持。

目前支持的AE特性

  • Keyframe Interpolation 關(guān)鍵幀插值
    Linear Interpolation 線性(關(guān)鍵幀)插值
    Bezier Interpolation 貝塞爾插值
    Hold Interpolation 定格插值
    Rove Across Time 漂浮插值(漂浮穿梭時(shí)間 )
    Spatial Bezier 空間插值

  • Solids 固態(tài)層
    Transform Anchor Point 描點(diǎn)變換
    Transform Position 位置變換
    Transform Scale 縮放變換
    Transform Rotation 旋轉(zhuǎn)變換
    Transform Opacity 透明度變換

  • Masks 蒙版
    Path 路徑
    Opacity 透明度
    Multiple Masks (additive) 多個(gè)蒙版(疊加模式)

  • Track Mattes 遮罩模式
    Alpha Matte 帶alaha通道的遮罩

  • Parenting 父子關(guān)系
    Multiple Parenting 多級(jí)父子層
    Nulls 空對(duì)象

  • Shape Layers 形狀層
    Anchor Point 描點(diǎn)
    Position 位置
    Scale 縮放
    Rotation 旋轉(zhuǎn)
    Opacity 透明度
    Path 路徑
    Group Transforms (Anchor point, position, scale etc) 組變換
    Rectangle (All properties) 矩形路徑(所有屬性)
    Ellipse (All properties) 橢圓路徑(所有屬性)
    Multiple paths in one group 一個(gè)組里的多個(gè)路徑

  • Stroke (shape layer) 描邊(形狀層)
    Stroke Color 描邊顏色
    Stroke Opacity 描邊透明度
    Stroke Width 描邊寬度
    Line Cap 描邊端點(diǎn)(圓頭炭剪,平頭)
    Dashes 描邊斷點(diǎn)

  • Fill (shape layer) 填充(形狀層)
    Fill Color 填充顏色
    Fill Opacity 填充透明度

  • Trim Paths (shape layer) 修剪路徑(形狀層)
    Trim Paths Start 修剪路徑起點(diǎn)
    Trim Paths End 修剪路徑終點(diǎn)
    Trim Paths Offset 修剪路徑偏移

  • Layer Features圖層特征
    Precomps 預(yù)合成(幾個(gè)圖層打包在一起控制)
    Image Layers 圖片層
    Shape Layers 形狀層
    Null Layers 空層
    Solid Layers 固態(tài)層
    Parenting Layers 父子層
    Alpha Matte Layers 帶alaha通道的遮罩層

未來(lái)計(jì)劃支持的AE特性

  • Even-Odd winding paths 判斷點(diǎn)在圖形內(nèi)的一種算法
  • Merge Shapes 合并圖層
  • Trim Shapes Individually feature of Trim Paths 修剪路徑
  • Expressions 表達(dá)式
  • 3d Layer support 3d層
  • Gradients 漸變
  • Polystar shapes (Can convert to vector path as a workaround) 多邊形
  • Alpha inverted mask 反相alpha蒙版

配置分析

  • assetes 資源
  • layers
    • ip 開(kāi)始幀
    • op 結(jié)束幀
    • fr 幀速率(ip练链,op,fr計(jì)算出動(dòng)畫時(shí)間)
    • w 寬度
    • h 高度
    • layer

| 名稱 | 定義 |
| ------| ------ | ------ |
| nm | layer的名稱奴拦,唯一|
| ind | layer的Id媒鼓,唯一 |
| ty | layer的類型,可以是數(shù)字從0開(kāi)始代表percomp错妖、solid隶糕、image、null等在LOTLayer有定義 |
| refId | 和素材資源有關(guān) |
| parentID | 父層的id |
| ip | inframe |
| op | outframe |
| h站玄,w | 搞和寬枚驻,嵌套層有使用 |
| sw,sh | 固態(tài)層的寬高 |
| sc | 固態(tài)層顏色 |
| tt | 遮罩類型 |
| masksProperties | 蒙版的數(shù)組 |
| shapes | 形狀數(shù)組株旷,有g(shù)r(形狀),st(描邊),fl(填充),tr(固態(tài)變換),sh(路徑),等等 在LOTShapeGroup內(nèi)可以找到再登,和支持的功能項(xiàng)意義對(duì)應(yīng) |

不難發(fā)現(xiàn)尔邓,json的結(jié)構(gòu)和支持功能是意義對(duì)應(yīng)的,推測(cè)在對(duì)應(yīng)實(shí)現(xiàn)的layer上也是一一對(duì)應(yīng)的锉矢。

原理分析

實(shí)現(xiàn)基于QuartzCore對(duì)layer的繪圖梯嗽,通過(guò)在一個(gè)根layer上遍歷配置數(shù)據(jù)添加子layer來(lái)實(shí)現(xiàn)動(dòng)畫的合并。用Core Animation做矢量動(dòng)畫實(shí)現(xiàn)沽损。

  1. 讀取json配置灯节,創(chuàng)建LOTAnimationView
  2. 分析json,生成LOTComposition類型的model
  3. 分析model內(nèi)的子動(dòng)畫model绵估,生成對(duì)應(yīng)的LOTCompositionLayer類型layer
  4. 同時(shí)按照層級(jí)關(guān)系添加layer到根layer上
  5. 播放動(dòng)畫

以前我們要在各個(gè)端實(shí)現(xiàn)一遍動(dòng)畫炎疆,使用lottie可以很大程度提高開(kāi)發(fā)效率,并增加app支持動(dòng)態(tài)下發(fā)動(dòng)效的能力国裳。iOS基于layer實(shí)現(xiàn)形入,對(duì)性能消耗很小,在存儲(chǔ)上json文件占用的空間也不多缝左。但接入后仍需要做一些事情亿遂,比如不支持漸變、文字渺杉、在移動(dòng)端無(wú)法編輯蛇数,這些都需要我們修改bodymuvin插件來(lái)支持。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末是越,一起剝皮案震驚了整個(gè)濱河市耳舅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌英妓,老刑警劉巖挽放,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蔓纠,居然都是意外死亡辑畦,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門腿倚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)纯出,“玉大人,你說(shuō)我怎么就攤上這事敷燎≡蒹荩” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵硬贯,是天一觀的道長(zhǎng)焕襟。 經(jīng)常有香客問(wèn)我,道長(zhǎng)饭豹,這世上最難降的妖魔是什么鸵赖? 我笑而不...
    開(kāi)封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任务漩,我火速辦了婚禮,結(jié)果婚禮上它褪,老公的妹妹穿的比我還像新娘饵骨。我一直安慰自己,他們只是感情好茫打,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布居触。 她就那樣靜靜地躺著,像睡著了一般老赤。 火紅的嫁衣襯著肌膚如雪轮洋。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天诗越,我揣著相機(jī)與錄音砖瞧,去河邊找鬼息堂。 笑死嚷狞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的荣堰。 我是一名探鬼主播床未,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼振坚!你這毒婦竟也來(lái)了薇搁?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤渡八,失蹤者是張志新(化名)和其女友劉穎啃洋,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體屎鳍,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宏娄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逮壁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孵坚。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖窥淆,靈堂內(nèi)的尸體忽然破棺而出卖宠,到底是詐尸還是另有隱情,我是刑警寧澤忧饭,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布扛伍,位于F島的核電站,受9級(jí)特大地震影響词裤,放射性物質(zhì)發(fā)生泄漏刺洒。R本人自食惡果不足惜汁咏,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望作媚。 院中可真熱鬧攘滩,春花似錦、人聲如沸纸泡。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)女揭。三九已至蚤假,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吧兔,已是汗流浹背磷仰。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留境蔼,地道東北人灶平。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像箍土,于是被迫代替她去往敵國(guó)和親逢享。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

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

  • Lottie 應(yīng)用于iOS吴藻、MacOS(以及Android 和React Native) 本文由CRAnimati...
    好尼桑閱讀 7,599評(píng)論 19 40
  • 版本記錄 前言 app中好的炫的動(dòng)畫可以讓用戶耳目一新瞒爬,為產(chǎn)品增色不少,關(guān)于動(dòng)畫的實(shí)現(xiàn)我們可以用基本動(dòng)畫沟堡、關(guān)鍵幀動(dòng)...
    刀客傳奇閱讀 3,238評(píng)論 0 1
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果侧但,實(shí)現(xiàn)這些動(dòng)畫的過(guò)程并不復(fù)雜,今天將帶大家一窺ios動(dòng)畫全貌航罗。在這里你可以看...
    每天刷兩次牙閱讀 8,471評(píng)論 6 30
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果禀横,實(shí)現(xiàn)這些動(dòng)畫的過(guò)程并不復(fù)雜,今天將帶大家一窺iOS動(dòng)畫全貌伤哺。在這里你可以看...
    F麥子閱讀 5,104評(píng)論 5 13
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,871評(píng)論 25 707