一、序

Hi,大家好,我是承香墨影!

Lottie 是 Airbnb 开源的一套跨平台的完整解决方案,设计师只需要使用 After Effectes (之后简称 AE)设计出动画之后,使用 Lottic 提供的 Bodymovin 插件将设计好的动画导出成 JSON 格式,就可以直接运用在 iOS、Android 和 React Native之上,无需关心中间的实现细节。

这样,对于不同的工作角色来说,Lottie 带来的都是更简洁的工作流。开发小哥哥不再担心动画实现困难,设计师小姐姐也不需要担心实现的效果会有偏差。

关于 Lottie 的基本使用,之前也写过一篇文章,不了解的同学可以先看看《聊聊 Airbnb 的 Lottie》。

不过当时的文章有些细节没有讲明白,那就是有时候设计师实现的的动画,其实也是在操作一些图片资源的变换,这样使用 Bodymovin 在 AE 上导出的时候,会同时导出一些图片资源。

那么,如何使用 Lottie 加载一个带图片的动画资源,就是我们今天需要讨论的主题。

二、需要图片资源的动画

今天主要讨论带图片资源的 Lottie 动画。

Lottie 提供的动画资源,其实是可以从很多途径进行加载的,例如你可以放在本地的 assets 目录下,或者放在线上动态下载。

下面我们就分情况来讲解如何加载一个有图片资源的 Lottie 动画,并且最后来说说如何让设计师把图片资源整合到 Lottie 的 JSON 文件中。

2.1 包内资源

有一些不经常变动的动画资源,我们会选择打包在 Apk 中,一般会放在 assets 目录下。

这其实是一种最简单的方式,Lottie 提供了一个 setImageAssetsFolder() 以及 app:imageAssetsFolder 属性,来为我们设置一个 Lottie 动画需要的图片资源在 assets 下的路径。

setImageAssetsFolder() 方法接受一个相对的目录路径,阅读它的文档就知道如何配置了。

接下来我们举个例子来说明问题。

例如,我在 assets 目录下存放了我需要的动画资源,它的目录结构如下。

这个时候,我在布局中写:

<com.airbnb.lottie.LottieAnimationView
android:id="@+id/lottieView"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:imageAssetsFolder="images/"
app:lottie_autoPlay="false"
app:lottie_fileName="question_like.json"
app:lottie_loop="false" />

或者在代码里写(kotlin 示意):

lottieView.imageAssetsFolder = "images/"
lottieView.setAnimation("xinfeng.json")
lottieView.loop(true)
lottieView.playAnimation()

这两种方式都是等效的,最终会去加载我们的动画资源。

在这个动画中有三个图片资源,非常的简单,因为信封图片为白色,所以我将底色调整成了蓝色。

2.2 线上下载资源

最理想的方式是将图片打包在 Apk 中一起发布出去,但是对于一些需要经常变动动画的需求,是无法接受每次发布新版本来替换动画资源的。

这个时候,我们可以选择动态下发动画资源,也就是在需要的时候,提前将动画资源下载到本地的文件系统中。

此时,我们再使用 setImageAssetsFolder() 方法就没有效果了,因为本身图片就已经不在 assets 目录下。

继续在源码中找答案,实际上 Lottie 加载的图片资源,最终会指定到 ImageAssetsManager 的 bitmapForId() 方法,它的实现如下。

关键代码我已经用红框标记出来了,bitmapForId() 接收一个 String 类型的 id,它其实就是我们动画资源中,图片资源的名称。而 Lottie 允许我们在加载 assets 目录资源之前,设置一个代理,通过代理的 fetchBitmap() 方法,来提前加载一个图片资源,供 Lottie 动画使用。这里的图片加载代理,可以使用 setImageAssetDelegate() 方法进行设置。

接下来的步骤就简单了,我们从本地的文件系统中,加载一个动画文件的输入流,然后使用 setImageAssetsDelegate() 方法设置一个代理即可。

val fileInputStream = FileInputStream(File("/sdcard/xinfeng.json"))
LottieComposition.Factory.fromInputStream(this,fileInputStream,{ composition ->
lottieView.setComposition(composition!!)
lottieView.setImageAssetDelegate { asset ->
BitmapFactory.decodeStream(assets.open(asset.dirName + asset.fileName))
}
lottieView.loop(true)
lottieView.playAnimation()
})

动画效果和之前一样,就不再过多展示了。

这种方式其实也有点复杂了,因为需要经历一个文件下载,接下来让我们看看一个对开发来说,最简单的方案。

2.3 将图片资源放入 JSON

到这里,我想说,其实 Lottie 动画所需要的图片资源也是可以集成在动画的 JSON 文件中

如果你能说服设计师,将图片资源整合到动画的 JSON 文件中,那你的工作量就可以节约很多。

接下来我们就来看看如何将图片资源打包到动画的 JSON 文件中。

其实官方文档中,已经给出了非常健全的文档,建议直接把文档发给设计师小姐姐,让她自己体会,开发人员其实也不需要太关心其中的细节。

http://airbnb.io/lottie/after-effects/artwork-to-lottie-walkthrough.html

为了让你能更好的和设计师小姐姐沟通,简单说一下步骤:

  1. 需要先将图片转换成矢量图 SVG 格式,这个设计师一定有办法。
  2. 使用 Illustrator 将 SVG 文件另存为 .ai 文件。
  3. 使用 .ai 文件在 AE 中做动画处理。
  4. 最后通过 Bodymovin 插件,输出动画资源。

这样,输出的 JSON 里面,其实就已经包含了图片的信息。同时,JSON 文件的大小也会增大,你可以理解是把矢量图打包到了 JSON 文件中,不过这也不完全对。整体来看体积还是非常小的,以现在的例子来说,只是从 3kb 增大到了 15kb。

所以这可以算是一个最优的解决方案,强烈推荐你试着说服设计师小姐姐。

三、设计师校验

如果设计师愿意为你制作没有图片资源的动画 JSON,那设计师如何自己检验自己导出的 JSON 文件是否正确呢?

Lottiefiles 网站提供了一个 preview 的页面,如果你的动画只有一个 JSON 文件,那直接拖拽进去就可以进行预览。

https://www.lottiefiles.com/preview

在 Preview 页面可以直接预览,并且右下角还会有一个二维码,可以只用 Lottie 的 Demo App 扫码在手机上预览。

需要注意的是,这种方式,只针对没有图片资源的动画 JSON 才有效。如果是带图片资源的动画,也只能开发自己使用程序实现的方式进行预览!

好了,再遇上 Lottie 动画有图片的时候,知道怎么和设计师沟通了吗?有其他问题欢迎在留言区留言!

今天在公众号后台回复成长『成长』,将会得到我整理的一些学习资料,也能回复『加群』,一起学习进步。

推荐阅读:

Lottie 动画里有图片怎么办?设计师小姐姐也能帮你减少开发量!的更多相关文章

  1. 程序员也想改 Lottie 动画?是的!

    一.前言 Hi,大家好,我是承香墨影! Lottie 是 Airbnb 开源的一套跨平台的完整的动画效果解决方案,用过都说好.完全解耦开发人员和设计师,让设计师设计的动画,在程序中无缝还原,真是一旦拿 ...

  2. 小I的小姐姐

    小 I 的小姐姐 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 小 I 去天津玩啦,一路上,他跟他的同学发生了许多有趣 ...

  3. 【译】css动画里的steps()用法详解

    原文地址:http://designmodo.com/steps-c... 原文作者:Joni Trythall 我想你在css 动画里使用steps()会和我一样有很多困惑.一开始我不清楚怎样使用它 ...

  4. 微信小程序里碰到的坑和小知识

    本文作者:dongtao   来自:授权地址 本人低级程序员,以下bug不能确保在其它地方可以以相同的原因复现.同时, 出现很多bug的原因是小程序的基本知识还有编码的基本功不到位造成 路还很长,共勉 ...

  5. zoom动画,实现图片点击预览效果

    参考:https://developer.android.google.cn/training/animation/zoom.html 1.创建Views 下面的布局包括了你想要zoom的大版本和小版 ...

  6. Android之Lottie动画详解

    文章大纲 一.Lottie介绍二.Lottie实战三.项目源码下载四.参考文章   一.Lottie介绍 1. 什么是Lottie   Lottie是Android和iOS的移动库,用于解析Adobe ...

  7. [UWP]缓存Lottie动画帧

    在上一篇博文<[UWP]在UWP平台中使用Lottie动画>中我简单介绍了一下LottieUWP项目以及如何使用它呈现Lottie动画,这篇文章里我们来讲点进阶的东西--缓存Lottie动 ...

  8. APP爬虫(2)把小姐姐的图片down下来

    APP爬虫(1)想学新语言,又没有动力,怎么办? 书接上文.使用appium在帖子列表界面模拟上划动作,捕捉不到列表的规律.上划结束后,列表只能获取到屏幕呈现的部分,而且下标还是从0开始的. 根据酸奶 ...

  9. 使用 jQuery 中的淡入淡出动画,实现图片的轮播效果,每隔 2 秒钟切换一张图片,共 6 张图片

    查看本章节 查看作业目录 需求说明: 使用 jQuery 中的淡入淡出动画,实现图片的轮播效果,每隔 2 秒钟切换一张图片,共 6 张图片,切换到第 6 张后从头开始切换,在图片的下方显示 6 个小圆 ...

随机推荐

  1. [数据结构] 希尔排序 C语言程序

    //由小到大 //希尔排序 void shellSort( long int array[], int length) { int i; int j; int k; int gap; //gap是分组 ...

  2. scrapy递归解析和post请求

    递归解析 递归爬取解析多页页面数据 每一个页面对应一个url,则scrapy工程需要对每一个页码对应的url依次发起请求,然后通过对应的解析方法进行作者和段子内容的解析. 实现方案: 1.将每一个页码 ...

  3. 【C语言编程练习】新娘与新郎

    1. 题目要求 新郎A,B,C与新娘 X,Y,Z.有人不知道她们谁和谁结婚了,询问了6位新人中的三位,A说他将和X结婚,X说她的未婚夫是C,C说她会和Z结婚,一听就知道是全是假话,请编程找出谁和谁结婚 ...

  4. Spiring系列__03IOC补充

    这篇文章是对前一篇的一些补充: 1.SpringIOC容器可以管理Bean的声明周期: 通过构造器或工厂方法创建bean的实例: 为bean属性设置值或者引入其他bean: 调用bean的初始化方法, ...

  5. C# 中传参中的OUT 和 ref 区别 笔记

    //out传参前需要对参数进行赋值处理,ref则不需要.//out.ref 传参都可以对值进行改变 1 static void Main(string[] args) { ; //int J = 10 ...

  6. 移动端h5 实现多个音频播放

    前一段时间做到一个项目,其中用到很多之前没用过的东西,其中一个就是h5的多音频实现,背景音频和说话同时播放,其中出现了很多问题,不过总算找到了解决方案. 平时做H5如果只有一个音乐的话就直接在页面里面 ...

  7. js原型与继承

    demofunction Fun(){}
var foo = new Fun();foo.__proto__ === Fun.prototype 摘要 1.js本身不提供类实现,es6引入了class ...

  8. powerdesigner 不能自动生成注释的解决方法(三步解决)

    解决power designer 不能自动生成注释的解决办法只需要3步: 一.快捷键 Ctrl+Shift+X 打开脚本编辑器:(快捷键不能执行的话可以从这个路径执行:Tools --> Exc ...

  9. Array.from();Object.keys();Array.map()

    Array.from():方法从一个类似数组或可迭代对象创建一个新的数组形式: const bar = ["a", "b", "c"]; A ...

  10. Linux常用服务器搭建

    1.Linux常用服务器构建-ftp服务器 ftp服务器 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为“文传协议”. 用于Internet上的控制文件 ...