Lottie在iOS的可用性调研

Lottie是什么?

用影片制作软件adobe after effects cc可以设计一个在app上显示的动画效果,安装bodymovin插件后可以用其导出一份该动画的json。Lottie实现了Android/iOS/React Native 三个平台对该 json 文件的解析和渲染。

通过插件导出的文件如下
<img src="http://upload-images.jianshu.io/upload_images/1840221-759f1c1aee3ebc0a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" width=400>

  • demo.html可以直接运行看到动画效果
  • images和templateCards.json直接放到bundle里供lottie调用显示动画

性能

1. 内存
方法:找了两个动画json作为测试对象,一个是球形下拉动画,一个是多张图片变换成字母A的动画。分别查看结束时的内存情况。



结果:从图片上看内存占用分别是,21k左右和43k左右,内存占用还是非常小的。

2. 帧率
方法:进入目标工程内,待内存和帧率平稳后播放动画,查看帧率。
结果:帧率保持在59和60

从以上两个动画的json效果看,lottie的性能表现非常好。
查看了一下官方说明,在以下情况下会对性能有影响

  1. 如果没有mask和mattes,那么性能和内存非常好,没有bitmap创建,大部分操作都是简单的cavas绘制。
  2. 如果存在mattes,将会创建2~3个bitmap。bitmap在动画加载到window时被创建,被window删除时回收。所以不宜在RecyclerView中使用包涵mattes或者mask的动画,否则会引起bitmap抖动。除了内存抖动,mattes和mask中必要的bitmap.eraseColor()和canvas.drawBitmap()也会降低动画性能。对于简单的动画,在实际使用时性能不太明显。
  3. 如果在列表中使用动画,推荐使用缓存LottieAnimationView.setAnimation(String, CacheStrategy) 。

功能支持

动画效果的支持范围,对业务有比较大的意义,查看发现一般的功能都可以满足。目前虽然支持图片图层,但不支持远程图片下载,在使用时这个功能是肯定要做进去的。渐变色也是很常用的,但目前尚未支持。

目前支持的AE特性

  • Keyframe Interpolation 关键帧插值
    Linear Interpolation 线性(关键帧)插值
    Bezier Interpolation 贝塞尔插值
    Hold Interpolation 定格插值
    Rove Across Time 漂浮插值(漂浮穿梭时间 )
    Spatial Bezier 空间插值

  • Solids 固态层
    Transform Anchor Point 描点变换
    Transform Position 位置变换
    Transform Scale 缩放变换
    Transform Rotation 旋转变换
    Transform Opacity 透明度变换

  • Masks 蒙版
    Path 路径
    Opacity 透明度
    Multiple Masks (additive) 多个蒙版(叠加模式)

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

  • Parenting 父子关系
    Multiple Parenting 多级父子层
    Nulls 空对象

  • Shape Layers 形状层
    Anchor Point 描点
    Position 位置
    Scale 缩放
    Rotation 旋转
    Opacity 透明度
    Path 路径
    Group Transforms (Anchor point, position, scale etc) 组变换
    Rectangle (All properties) 矩形路径(所有属性)
    Ellipse (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 修剪路径偏移

  • Layer Features图层特征
    Precomps 预合成(几个图层打包在一起控制)
    Image Layers 图片层
    Shape Layers 形状层
    Null Layers 空层
    Solid Layers 固态层
    Parenting Layers 父子层
    Alpha Matte Layers 带alaha通道的遮罩层

未来计划支持的AE特性

  • Even-Odd winding paths 判断点在图形内的一种算法
  • Merge Shapes 合并图层
  • Trim Shapes Individually feature of Trim Paths 修剪路径
  • Expressions 表达式
  • 3d Layer support 3d层
  • Gradients 渐变
  • Polystar shapes (Can convert to vector path as a workaround) 多边形
  • Alpha inverted mask 反相alpha蒙版

配置分析

  • assetes 资源
  • layers
    • ip 开始帧
    • op 结束帧
    • fr 帧速率(ip,op,fr计算出动画时间)
    • w 宽度
    • h 高度
    • layer

| 名称 | 定义 |
| ------| ------ | ------ |
| nm | layer的名称,唯一|
| ind | layer的Id,唯一 |
| ty | layer的类型,可以是数字从0开始代表percomp、solid、image、null等在LOTLayer有定义 |
| refId | 和素材资源有关 |
| parentID | 父层的id |
| ip | inframe |
| op | outframe |
| h,w | 搞和宽,嵌套层有使用 |
| sw,sh | 固态层的宽高 |
| sc | 固态层颜色 |
| tt | 遮罩类型 |
| masksProperties | 蒙版的数组 |
| shapes | 形状数组,有gr(形状),st(描边),fl(填充),tr(固态变换),sh(路径),等等 在LOTShapeGroup内可以找到,和支持的功能项意义对应 |

不难发现,json的结构和支持功能是意义对应的,推测在对应实现的layer上也是一一对应的。

原理分析

实现基于QuartzCore对layer的绘图,通过在一个根layer上遍历配置数据添加子layer来实现动画的合并。用Core Animation做矢量动画实现。

  1. 读取json配置,创建LOTAnimationView
  2. 分析json,生成LOTComposition类型的model
  3. 分析model内的子动画model,生成对应的LOTCompositionLayer类型layer
  4. 同时按照层级关系添加layer到根layer上
  5. 播放动画

以前我们要在各个端实现一遍动画,使用lottie可以很大程度提高开发效率,并增加app支持动态下发动效的能力。iOS基于layer实现,对性能消耗很小,在存储上json文件占用的空间也不多。但接入后仍需要做一些事情,比如不支持渐变、文字、在移动端无法编辑,这些都需要我们修改bodymuvin插件来支持。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容