ae导出json_Lottie动画json文件解析

2023-05-16

导读:Lottie 是一个很好的动画库,不同于FaceBook 的 POP,Lottie 主要是重现由AE(Adobe After Effects)实现的动画,具体方法是AE 导出一个json,Lottie 读取json 进行较为炫酷的动画。本文主要讲述从AE的bodymovin插件导出的JSON文件到Objective-c的LOTCompisition实体对象的过程。JSON文件包含做动画的一切信息,包括帧率、动画形态、图层、字体等等。

4ac49e6faad41cc192444de025b741d7.png

JSON字段解读

一级属性

JSON最外一层的数据,包括一个动画的基础数据:动画帧率、起始/结束关键帧,动画的宽高等,还有子图层的信息和关联的资源信息,如图片,矢量图等。

```JSON
{
"v": "5.6.10", // bodymovin插件版本
"fr": 25, // 帧率
"ip": 0, // 起始关键帧
"op": 277, // 结束关键帧
"w": 110, // 视图宽度
"h": 110, // 视图高度
"nm": "cloud", // 动画名称 
"ddd": 0, // 是否是3D
"assets": [...] // 资源集合
"layers": [...] // 图层集合
}
```

assets 资源集合

assets是一个数组,资源信息包含的是矢量图信息,如形状,大小等等,也包含位图;还可能是预合成层,即对已存在的某些图层进行分组,把它们放置到新的合成中,作为新的一个资源对象,这儿layers的对象结构是上面一级属性中的layers图层集合是一样的

"assets": [
{
"id": "image_0", // 图片唯一识别的id,图层获取图片的标识
"w": 167, // 图片的宽度
"h": 165, // 图片的高度
"u": "images/", // 图片的路径
"p": "img_0.png", // 图片的名称
"layers": [] // 预合成层
}
]

layers 图层信息

layers对象也是一个数组,数组中的每个元素对应一个图层,图层信息包括的图层的位置,大小,形状,起始关键帧,结束关键帧等,一个个图层叠加起来构成最终的动画效果。

"layers": [
{
"ddd": 0, // 是否是3D图层
"ind": 1, // 在AE里的图层标序号
"ty": 4, // 图层类型
"nm": "形状图层 1", // 在AE下的命名
"ks": {}, // 动画属性值,下面有进一步拆解
"shapes": {}, // 矢量图形图层信息,下面有进一步拆解
"ip": 0, // 起始关键帧
"op": 750, // 结束关键帧
"refId: 0, // 引用资源ID
"parent": 0, // 父图层的id,默认都添加到根图层上,如果指定了id不为0会寻找父图层并添加到上面,
"masksProperties":[], // 蒙版的数组
"w": 100, // 预合成层:宽度
"h": 100, // 预合成层:图层高度
"sw": 0, // 固态层:宽度
"sh": 0, // 固态层:图层高度
"sc": 0 , // 固态层:颜色
}
]

图层中类型属性ty

图层有6种类型,不同类型的图层获取宽高的方式不同,如图片层需要从关联的refId获取asset,从而获取到图片资源的宽高来作为该图层的宽高等,具体如下

  • 0 代表 预合成层:从属性值w和h获取

  • 1 代表 固态层:从属性值w和h获取

  • 2 代表 图片层:从图片资源属性获取

  • 3 代表 空层:从根图层获取

  • 4 代表 形状层:从根图层获取

  • 5 代表 位置层:从根图层获取

图层中类型属性ks

  • 解读ks属性:这是一个比较关键的属性,包含图层变换transform的信息,包含透明度、位置、锚点、缩放、旋转等。格式如下

"ks": {
"o": { // 透明度
"k": 100
},
"p": { // 位置
"k": [
126.5,
963,
0
]
}
}
  • 属性对应的值主要通过K值获取, 如上面的例子中透明度o为100, 位置p为(126.5,963,0)

  • k对应的值有如下几种情况:

    • 数字或3个数字组成的数组:不带动画。表示对应属性的值。比如透明度100, 位置(126.5,963,0)等。

    • 数组类型并且数字第一个对象的t有值:带帧动画。第一个对象表示动画开始的属性,第二个对象表示动画结束的属性。通过以下参数可以拼装出关键帧的属性值,关键帧时间点,关键帧之间的时间函数,t表示开始/结束帧,s和e表示开始/结束属性值,i和o决定动画的时间函数。

  • 举个例子:比如下面的动画,是有个矩形从上往下的动画。

aec05db942ef74e4718d296f208520b0.png

  • 从导出的JSON文件截取以下片段:

    ```JSON
    "ks": {
    ...
    "p": { // 位置信息
    "a": 1,
    "k": [ // 数组类型并且数字第一个对象的t有值
    {
    "t": 0, // 起始关键帧
    "s": [
    300,
    700,
    0
    ],
    },
    {
    "t": 49, // 结束关键帧
    "s": [
    250,
    1800,
    0
    ]
    }
    ],
    "ix": 2
    }
    },
    ```

    从以上片段中我们读到位置p的k值是一个数组,并且是带有t的元素, 即为帧动画。从内容我们可以读出关键帧帧为0时,位置信息为(300,700,0) , 变换到关键帧为49时,位置信息变为(250,1800,0)。

图层中类型属性shapes

shape是一个形状图层的数组,对应AE中图层的内容中的形状设置,描述形状的特征,通过描边信息、颜色填充等信息的组合形成一个个矢量图。

"shapes": {
"ty": "gr", // 形状的类型
"it": [
{
"ty": "rc",
"d": 1,
"s": { // 形状的大小
"k": [
450.094,
140.297
]
},
"p": {
"k": [
0,
0
]
},
"nm": "矩形路径 1"
}
]
}
  • 类型属性ty

ty为形状的类型,对应的类型值如下:

gr(ShapeGroup): 图形组合
st(ShapeStroke): 图形描边
fl(ShapeFill): 图形填充
tr(ShapeTransform): 图形变换
sh(ShapePath): 图形路径
rc(RectPath): 矩形路径
el(EllipsePath): 椭圆路径
tm(trimPath): 裁剪路径

生成OC实体对象

LOTComposition类

cb75adfb20d23a4b5299af021464d4ca.png

LOTComposition类是记录动画信息的类,继承 NSObject, 作为整个json文件内容的映射,用于记录所有动画信息的类。在这个类中我们可以看到动画的基础信息,包含创建AE文件时的设置:合成名称、宽高、帧速率(帧/秒),也是JSON文件中一级属性的映射。以下是一个LOTComposition的实例信息:

8fcd95701b224aa6e0e3fe9756ff2a66.png

LOTLayerGroup 和 LOTLayer

从上图我们可以看到两个集合类,LOTLayerGroup记录图层信息的数组,对应JSON对象中layers数组,由一个个LOTLayer组成。一个LOTLayer是一个图层,是一个动画被拆解的最小单位个体。

例如以下云朵动画

b8084f3698b8ad3bd995c75b3a9cc503.png

可以看出云朵的运动速度是不一样的,因此可以判断他们并不是在一个图层中,而是由多个图层的动画叠加起来的效果,即每个云朵为一个图层, LOTLayer就是记录一个图层单位的信息

cb95930b4c3fc2e04f416d4ef5720b37.png

以下是一个LOTLayer携带的信息

5139f48017bb145e836d0052ec6dc0df.png

LOTAssetsGroup 和 LOTAsset

LOTAssetsGroup是记录资源信息,对应JSON对象中的assets数组,若图层需要依赖资源,可以通过自身信息refId关联到对应的资源ID寻找资源。如以上云朵动画,每个云朵即为一个资源,LOTAsset为记录一个资源的信息。

4e97db182d9416d133bfd6423ad51ee1.png

总结:以上讲述的是从AE导出JSON文件到OC读取后转成modal的过程,了解JSON的内容有助于我们理解一个动画的内部结构,可方便后续理解整个动画的运作,也对于我们实践开发中遇到的缺陷或者性能问题的排查定位有极大的帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ae导出json_Lottie动画json文件解析 的相关文章

  • DbGeography 多边形到 JSON

    我将 DbGeography 多边形存储在数据库中 我的控制器从数据库获取多边形 我需要将它们转换为 JSON var polygons db Areas Where x gt x Type type Select x gt new Vie
  • JSON 中的哈希到底是什么?

    我正在学习 JSON 但我发现你也可以将所谓的 哈希 放入 JSON 中 我在哪里可以找到什么是哈希 或者你能向我解释一下什么是哈希吗 另外 什么是哈希图 我有 C 和 C 经验 正在学习 JS Jquery 和 JSON 哈希是一个稀疏数
  • 使用 Express.js 和 NodeJS,您可以通过响应正文中的重定向发送 JSON

    我正在尝试通过 302 重定向发送 JSON 在 ExpressJS 中这可能吗 API 声明可以添加主体res json 例如 res json 302 name larry 在接收端 重定向的目的地 主体是空的 这是一些示例代码 发送应
  • 用于检查 Apache Camel XML 中字符串的 JSONPath 表达式

    假设我有一个简单的 json 文件 如下所示 log host blah severity INFO system 1 我正在使用 Apache Camel 它是 Spring XML 来处理和路由 json 文件 我的路由代码看起来像这样
  • 如何在 Firebase 远程配置中从 JSON 获取值

    我是 Android 应用开发和 Firebase 的新手 我想知道如何获取存储在 Firebase 远程配置中的 JSONArray 文件中的值 String 和 Int 我使用 Firebase Remote Config 的最终目标是
  • Postgres JSON 数据类型 Rails 查询

    我正在使用 Postgres 的 json 数据类型 但想要使用嵌套在 json 中的数据进行查询 排序 我想在 json 数据类型上使用 where 进行订购或查询 例如 我想查询关注者数量 gt 500 的用户 或者我想按关注者或关注数
  • 处理 fanart.tv Web 服务响应 JSON 和 C#

    我正在尝试使用 fanart tv Webservice API 但有几个问题 我正在使用 Json Net Newtonsoft Json 并通过其他 Web 服务将 JSON 响应直接反序列化为 C 对象 这里的问题是元素名称正在更改
  • 如何在 ASP.NET MVC 3 的 Razor 视图中编码嵌入的 javascript?

    如何在以下上下文中正确编码 JavaScript 我的 JSON 对象中的值是由应用程序管理员设置的 因此我假设它们需要正确编码 对于 HTML 和 JavaScript 都是如此 我在用着System Web Script Seriali
  • Postgres JSONB:数组数组的 where 子句

    postgres 中有 v 9 5 如果有的话 create table json test id varchar NOT NULL data jsonb NOT NULL PRIMARY KEY id 其中 data 是 json 并且包
  • 使用 NewtonSoft 在一行中生成 JSON 对象

    我正在使用 JSON 库牛顿软件 http nuget org packages newtonsoft json生成 JSON 字符串 JObject out JObject FromObject new typ photos return
  • 全局传递 xhr onload 函数的值

    在我正在创建的应用程序中 我有以下 XMLHttpRequest 并且我正在尝试传递结果data在 的里面xhr onload 到在同一父函数中创建的数组中 var url http api soundcloud com resolve j
  • jq:将对象数组转换为对象

    我收到了来自curl的回复 格式如下 list value 1 id 12 value 15 id 13 value 4 id 14 给定 id 之间的映射 如下所示 12 newId1 13 newId2 14 newId3 我想做这个
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 在 ASP.NET Core 2.0 Web Api 中返回“原始”json

    AFAIK 在 ASP NET Core Web Api 中返回数据的标准方法是使用IActionResult并提供例如一个OkObject结果 这对于对象来说效果很好 但是如果我以某种方式获得了一个 JSON 字符串 并且我只想将该 JS
  • Oracle 中的 Json_object 返回 ORA-00907: 缺少右括号

    我正在尝试将 Oracle 表数据转换为 JSON 文件 我有三个数据库 下面的代码在一个数据库中以 JSON 文件形式提供输出 但其他两个数据库抛出ORA 00907 missing right parenthesis error 从语法
  • Haskell Data.Decimal 作为 Aeson 类型

    是否可以解析一个数据 十进制 https hackage haskell org package Decimal 0 4 2 docs Data Decimal html使用 Aeson 包从 JSON 获取 假设我有以下 JSON foo
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item
  • 通过标识引用对象的标准方法(例如循环引用)?

    JSON 中是否有通过身份引用对象的标准方法 例如 具有大量 可能是循环 引用的图形和其他数据结构可以被合理地序列化 加载吗 Edit 我知道做一次性解决方案很容易 列出图中所有节点的列表 然后 我想知道是否有一个标准的 通用的解决方案来解
  • Hive:如何分解嵌入 CSV 文件中的 JSON 列?

    从 CSV 文件 带有标题和管道分隔符 中 我得到了以下两个内容 其中包含一个 JSON 列 内部有一个集合 如下所示 第一种情况 使用没有名称的 JSON 集合 ProductId IngestTime ProductOrders 918
  • 从 Twitter API 2.0 获取 user.fields 时出现问题

    我想从 Twitter API 2 0 端点加载推文 并尝试获取标准字段 作者 文本 和一些扩展字段 尤其是 用户 字段 端点和参数的定义工作没有错误 在生成的 json 中 我只找到标准字段 但没有找到所需的 user fields 用户

随机推荐