一、序

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. Random Erasing Augmentation(REA)

    为了增强模型的泛化的性能,一般的手段有数据增强和正则化方法(如dropout,BN),而用于数据增强的一般方法有:随机裁剪.随机水平翻转.平移.旋转.增加噪音和生成网络方法等(前两个方法用的最多,也最 ...

  2. 基于Emgucv,C#的图片旋转方式

    /// <summary> /// 图片旋转 --百度 旋转仿射 /// </summary> /// <param name="modelImage" ...

  3. 运用SqlSugar框架+Axios写的增删查案例

    使用SqlSugar框架需要引用NuGet程序包否则会出现报错. 前台页面创建代码: @{    ViewBag.Title = "Index";}<h2>Index& ...

  4. [Python]Python中的包(Package)

    参考官方文档中的Module和Glosssary中的描述.Module: https://docs.python.org/3/tutorial/modules.html#packagesGlossar ...

  5. connector for python实验

    MySQL 是最流行的关系型数据库管理系统,如果你不熟悉 MySQL,可以阅读 MySQL 教程. 下面为大家介绍使用 mysql-connector 来连接使用 MySQL, mysql-conne ...

  6. h5适配的解决方案

    一. 流程 设计师以750pt×1334pt尺寸进行设计(当然高度随内容变化),最后用该尺寸的设计稿进行标注.切图,前端采用淘宝的开源方案flexible进行适配. 二. flexible使用方法 F ...

  7. 2019中山大学程序设计竞赛-Monitor

    题目地址 题目大意:给你一个n*m的矩形,在这个矩形内告诉你p个矩形(左下角和右上角坐标),问你q个问题,每次也是给你一个矩形(左下角和右上角坐标),问你每个矩形是否可以被开始给的p个矩形完全覆盖. ...

  8. 为bootstrap+angularJs打造的表格代码生成器

    private void btnCreateCode_Click(object sender, EventArgs e) { string objName = txtObjName.Text; if ...

  9. 最新鲜最详细的Android SDK下载安装及配置教程

    //来源: http://www.cnblogs.com/summary-2017/p/8073225.html 最近Neo突发神经,想要将学过的一些计算机视觉.机器学习中的算法都放到移动设备上去跑跑 ...

  10. Lua学习----零碎知识点

    Jit(just in time) 动态即时编译,边运行时边编译---->lua (主要是面向进程) Aot(ahead of time) 静态提前编译,运行前编译---->C#(主要是面 ...