将AE制作的动画导出为json数据并在web端播放2019-04-29

2018.03.19 更新bodymovin5.1.8 zxp插件汉化版

https://github.com/bigxixi/bodymovin_cn

安装方式1(推荐):

  • 打包为zip下载整个项目到本地。
  • 解压缩并从 '/build/extension' 找到 bodymovin.zxp 文件
  • 使用aescripts.com出品的 ZXP安装器 进行安装。

安装方式2:

  • 关闭After Effects

  • 打包为zip下载整个项目到本地并解压 build/extension/bodymovin.zxp 文件到 Adobe CEP 文件夹(CEP插件扩展平台):
    WINDOWS:
    C:\Program Files (x86)\Common Files\Adobe\CEP\extensions 或者
    C:<用户名>\AppData\Roaming\Adobe\CEP\extensions
    MAC:
    /Library/Application\ Support/Adobe/CEP/extensions/bodymovin
    (你可以在终端中输入:
    cp -R 你解压后的目录/extension /Library/Application\ Support/Adobe/CEP/extensions/bodymovin
    然后输入:
    ls /Library/Application\ Support/Adobe/CEP/extensions/bodymovin
    来保证正确复制了文件)

  • 编辑注册表:
    WINDOWS:
    找到注册表键值 HKEY_CURRENT_USER/Software/Adobe/CSXS.6 增加一个键值名为 PlayerDebugMode, 类型为字符串(String), 值为 1。
    MAC:
    打开文件 ~/Library/Preferences/com.adobe.CSXS.6.plist(com.adobe.CSXS.???.plist其中问号根据AE版本不同会有不同) 新加一行,键(key)为PlayerDebugMode, 类型为字符串(String), 值为 1。

安装方式3:

按照官方手册的指导安装zxp插件,地址如下(英文): https://helpx.adobe.com/x-productkb/global/installingextensionsandaddons.html
直接跳到 "Install third-party extensions"

安装完成后

在AE里勾选 编辑 > 首选项 > 常规 > 允许脚本写入文件和访问网络(Mac 下为 After Effects > 首选项 > 常规 > 允许脚本写入文件和访问网络)。

如何使用

在After Effects中

  • 运行AE程序,选择bodymovin插件,位置是 窗口 > 扩展 > bodymovin [Window > Extensions > bodymovin]
  • 此时将弹出一个面板,列出了项目中的所有合成。
  • 在面板上点击刷新[Refresh]。
  • 选择你想要导出的合成。
  • 选择要导出到的地址[Destination Folder]。
  • 点击渲染[Render]。
  • 找到导出的json文件 (如果动画中有图片资源或者AI图层, 将会同时生成一个images文件夹存放这些图片资源)。

设置:

分段: 分段导出你的动画。 如果你的动画有很多层,可以选择分段导出,这样就不会一次性全部加载。 导出工具将会根据图层开始时间进行分段。
快照: 保存一张svg格式的快照作为动画的封面。渲染完动画后, 你可以截取任意一帧快照并保存到硬盘上。 我建议优化这张svg快照,可以利用一些工具比如 https://jakearchibald.github.io/svgomg/ 并好好设置一番。

用于HTML

查看demo,有不同的动画加载方式:

  • 从build/player/获取最新 bodymovin.js 文件
  • 在你的html文件中包含 bodymovin.js (发布时可以gzip压缩一下减少体积)
<script src="js/bodymovin.js" type="text/javascript"></script>

你可以调用 bodymovin.loadAnimation() 来开始动画。 可以用一个对象传递这些参数:

  • animationData: 包含导出的动画数据的对象。
  • path: 动画数据文件的相对路径。 (animationData 和 path 参数是互斥的)
  • loop: 循环设置,值为true / false / number(循环/不循环/循环n次(n为输入值))
  • autoplay: 自动播放设置。true为准备就绪后自动播放,false为不自动播放。
  • name: 动画名,用于后续引用。
  • renderer: 选择渲染器,值为'svg' / 'canvas' / 'html' 。
  • container: 需要渲染动画的dom元素。

返回一个动画对象,你可以控制它播放、暂停、设置速度。。。。

bodymovin.loadAnimation({
  container: element, // 渲染动画的dom元素
  renderer: 'svg',
  loop: true,
  autoplay: true,
  animationData: JSON.parse(animationData) // 动画数据
});
  • 如果想用已有的canvas画布来绘制, 可以额外传递一个对象: 'renderer' 并按参考如下配置:
bodymovin.loadAnimation({
  container: element, // 渲染动画的dom元素
  renderer: 'svg',
  loop: true,
  autoplay: true,
  animationData: animationData, // 动画数据
  rendererSettings: {
    context: canvasContext, // canvas画布上下文
    scaleMode: 'noScale',
    clearCanvas: false
  }
});

如果你这么做了, 必须在每一帧渲染后清除画布。
另一个加载动画的办法是为dom元素加上特定的属性。 你需要包含一个div元素,并设置他的class为bodymovin。 如果你在页面加载前这么做了,它将自动检测页面上所有class标签值为"bodymovin"的元素。 或者你可以在页面加载完成后调用bodymovin.searchAnimations(),同样会检测页面上所有class标签值为"bodymovin"的元素。

步骤:

  • 将data.json文件放到html文件同级的一个文件夹中。

  • 创建一个将要包含动画的div元素。

必要属性
一个名为"bodymovin"的class
一个 "data-animation-path" 属性,值为 data.json 的相对路径。
可选属性
一个 "data-anim-loop" 属性,控制循环。
一个 "data-name" 属性,用于指定一个名字作为播放控制的控制目标。

示例

 <div style="width:1067px;height:600px" 
      class="bodymovin" 
      data-animation-path="animation/" 
      data-anim-loop="true" 
      data-name="ninja"></div>

用法

动画实例可用的方法如下:
anim.play()
anim.stop()
anim.pause()
anim.setSpeed(speed) -- 播放速度 ,1 为正常速度。
anim.goToAndStop(value, isFrame) 跳转到某一时间(或帧)并停在那。第一个参数(value)是数值。第二个参数是布尔值,"true"则第一个参数表示“帧”,“false”则表示“时间”。
anim.goToAndPlay(value, isFrame) 跳转到某一时间(或帧)并播放。第一个参数(value)是数值。第二个参数是布尔值,"true"则第一个参数表示“帧”,“false”则表示“时间”。
anim.setDirection(direction) -- 播放方向,正数和0为正常播放,负数为倒放。
anim.playSegments(segments, forceFlag) -- 播放指定段落。第一个参数是一个数组,形式为[(a,b),(c,d),(e,f)...]则播放第a帧到b帧,然后第c帧到d帧,e到f…… ,第二个参数为布尔值,“true”则立刻播放参数一中的片段,“false”则播放完当前动画后再开始播放片段。
anim.destroy()

bodymovin有8个方法:
bodymovin.play() -- 播放指定动画,1个参数动画名
bodymovin.stop() -- 停止播放指定动画,1个参数动画名
bodymovin.setSpeed() -- 第一个参数设置动画速度 (1为正常速度),第二个参数动画名可选。
bodymovin.setDirection() -- f播放方向,正数和0为正常播放,负数为倒放,第二个参数动画名可选。
bodymovin.searchAnimations() -- 检测class值为"bodymovin"的元素。
bodymovin.loadAnimation() -- 前面已有介绍, 返回一个可单独控制的动画实例。
bodymovin.destroy() --销毁和释放资源。 DOM 元素将会被清空。
bodymovin.registerAnimation() -- 你可以直接用registerAnimation来注册一个自定义元素,它必须包含"data-animation-path"属性并指向data.json的地址。
bodymovin.setQuality() -- 画质设置,调整动画播放器性能。默认为高画质(high), 可选值为'high'、'medium'、'low', 或者大于1的数字。对于有的动画这些设置差别不大。

事件

  • onComplete
  • onLoopComplete
  • onEnterFrame
  • onSegmentStart

或者你可以对以下事件设置监听(addEventListener):

  • complete
  • loopComplete
  • enterFrame
  • segmentStart

查看demo文件夹中的例子,或者访问 http://codepen.io/airnan/ 可以看到精彩的演示动画

一些建议

文件

如果你使用了图片资源或者未转成形状图层的Adobe Illustrator文件图层, 将会同时生成一个images文件夹存放这些图片资源。(我建议将ai图层转换为形状图层,这样他们会被导出为矢量数据,只需在AE中导入的ai图层上右键 > 从矢量图层创建形状) 注意,如果不同的带图片资源的动画导出到同一地址,images文件夹将会被覆盖。

性能

Bodymovin的动画都是实时渲染的。 虽然经过了大量优化,最好还是控制AE工程文件体积在一个必要的值。
更多的优化也正在进行中,但请避免这种情况:绘制了一个巨大的形状图层,但是只通过遮罩使用其中一小部分。
过多的节点同样会影响性能。

帮助

如果你有动画导出失败或者想让我帮你导出, 不要犹豫请告诉我。
我很乐意能找到这个插件的不足之处。
我的邮箱是 hernantorrisi@gmail.com

演示

访问codepen查看动画演示

支持的AE特性

  • 插件支持预合成、形状图层、固态层、图片、空对象以及文字图层。
  • 支持遮罩和反向遮罩。也许别的模式也会支持,但是会对性能造成巨大影响。
  • 支持时间重映射(是的没错!)。
  • 支持形状图层的形状、矩形、椭圆和星形。
  • 目前只支持滑块效果。
  • 支持部分表达式。更多介绍可以查看这里(英文)
  • 不支持: 图像序列、视频和音频 (也许未来会支持)。
  • 不要伸缩图层!不知为何,伸缩图层会破坏导出的数据,所以不要做这个操作。

其他说明

  • 如果你想修改或者解析动画播放器,有一些 gulp 命令可以简化这个操作。
  • 看看这些codepen上的优秀作品 访问codepen作品集
  • gzip压缩一下动画json数据文件和播放器js文件可以有效减少文件体积。如果你用在项目里,我建议你这么做。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,219评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,363评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,933评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,020评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,400评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,640评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,896评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,597评论 0 199
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,327评论 1 244
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,581评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,072评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,399评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,054评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,083评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,849评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,672评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,585评论 2 270

推荐阅读更多精彩内容