Lottie动画:从制作到播放
Lottie 是由 Airbnb 开源,适用于 iOS、Android 和 React Native 的移动库。它解析 Adobe After Effects 动画,使用 Bodymovin 将这些动画导出为 json,并在移动设备上本地渲染它们!这里主要介绍如何制作 lottie 动画,通过脚本动态修改动画内容。
基本流程
Bodymovin插件的安装与使用
- 关闭AE
- 下载并安装ZXP installer
https://aescripts.com/learn/zxp-installer/ - 下载最新版bodymovin插件
https://github.com/airbnb/lottie-web/blob/master/build/extension/bodymovin.zxp - 把下载好的bodymovin.zxp拖到ZXP installer
- 启动AE(以2020为例),在菜单 编辑->首选项->常规->脚本和表达式 中勾选:允许脚本写入文件和访问网络(否则输出JSON文件时会失败)
动画的制作与导出
新建合成
合成名称最好是英文或简拼,调整宽高、帧率(越大越流畅,最大建议60)、持续时间
增加关键帧
导入图片或视频资源,右键资源添加效果,增加关键帧并调整交换或效果
导出动画
打开菜单 窗口->拓展->Bodymovin,勾选要输出的动画,并设置输出文件目录,点击render,这时候我们得到JSON文件和资源文件夹
JSON 字段含义
字段都是简称,我们只需搞清楚文本和资源如何修改,不必全部了解。
例如:
assets[0].p 表示图片资源
assets[1].nm 表示文本信息
1 |
|
动画可控制
通过API控制动画开始和暂停,指定动画执行范围(playSegments)
详情见文档:
https://github.com/airbnb/lottie-web#lottie-has-several-global-methods-that-will-affect-all-animations
1 |
|
动画可交互
由于 Lottie 的 JSON 内描述了动画的各种细节如关键帧、位移轨迹等等,因此如果在动画播放时,根据用户的交互去动态改变这些参数,就可以实现可交互的动画,比如下面这个著名的变色龙吃鼠标的 Lottie,眼睛会随着鼠标而移动,并且不时会吐出舌头「吃掉」鼠标
其它示例:
https://lottiefiles.com/search?q=Frog&category=animations
用 async/await 优雅地控制 Lottie 播放
三段动画分别控制执行
025帧 掷骰子35帧 骰子旋转
26
36~36
1 |
|
动态替换文本
修改 lottie.json
1 |
|
修改 JS 对象
通过 getKeyPath 获取元素,comp1 指合成名称,textnode 指的是文本节点
1 |
|
修改 svg 元素
如果设计师在 AE 图层命名时尾部加入 #xxx ,那么生成的 svg 元素就会有一个 id 属性为 xxx
于是根据这个黑科技,我们可以这么写
1 |
|
在导出 json 时抽取字体库中的字形(Glyphs)路径放入文件,canvas 模式下通过路径绘图来画出文本
所以上述方案中的 C 肯定无法支持 canvas 模式,而 A/B 要支持则依赖于导出 JSON 时,要替换的文本字形是否已经存在于 JSON 中,因此从实际出发,一般 canvas 模式下就比较难实现替换文本了
另外根据上面的原理,上面所有例子中,从 AE 导出 lottie 时都记得去掉「Glyphs」这个选项,并且指定具体的 font family,记得把这件事告诉你的设计师小伙伴
综合比较三种方式,我更喜欢修改 JS 对象,因为基于中间产物的修改方式扩展性是最强的,比如能够支持运行期,还可以修改大小、颜色、替换指定关键帧等等
动态替换图片
assets 中资源 p 可以是 dataURL、图片相对路径、远端地址
修改 lottie.json
1 |
|
修改 JS 对象
相比修改文本,要修改图片略麻烦一些,主要是 lottie-web 本身并没有直接提供类似 updateDocumentData 这样的方法,不过只要知道实现原理,找到解法并不难
通过阅读 lottie-web 源码,可以发现 svg 和 canvas 模式下,图片的实现不一样(svg, canvas),所以我们的修改方案也需要判断先判断 renderer 模式
示例代码
1 |
|
修改 svg 元素
与文本同理,仅限于 svg 渲染模式,只需要设计师在图层命名时,尾部加入 #xxx 即可,这样生成的 svg 元素就会有一个 id 属性为 xxx,比如
那么通过 DOM API 找到元素修改属性即可
1 |
|
动态修改 lottie 中的图片,与动态修改文本大同小异,只是 JSON 结构的属性、JS 对象的 API 有所不同,另外图片不像文本,在 canvas 模式下可以正常使用,lottie 导出时也没有特殊的要求
动画转视频
- 使用 canvas.captureStream 将 canvas 转为 stream
- 使用 MediaRecorder 录制 stream 并转 blob
- 使用 ffmpeg.wasm 将 mp3 音频与视频 blob 混合并输出 mp4
源码如下:
1 |
|