Lottie 动画里有图片怎么办?设计师小姐姐也能帮你减少开发量!
一、序
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
为了让你能更好的和设计师小姐姐沟通,简单说一下步骤:
- 需要先将图片转换成矢量图 SVG 格式,这个设计师一定有办法。
 - 使用 Illustrator 将 SVG 文件另存为 .ai 文件。
 - 使用 .ai 文件在 AE 中做动画处理。
 - 最后通过 Bodymovin 插件,输出动画资源。
 
这样,输出的 JSON 里面,其实就已经包含了图片的信息。同时,JSON 文件的大小也会增大,你可以理解是把矢量图打包到了 JSON 文件中,不过这也不完全对。整体来看体积还是非常小的,以现在的例子来说,只是从 3kb 增大到了 15kb。
所以这可以算是一个最优的解决方案,强烈推荐你试着说服设计师小姐姐。
三、设计师校验
如果设计师愿意为你制作没有图片资源的动画 JSON,那设计师如何自己检验自己导出的 JSON 文件是否正确呢?
Lottiefiles 网站提供了一个 preview 的页面,如果你的动画只有一个 JSON 文件,那直接拖拽进去就可以进行预览。
在 Preview 页面可以直接预览,并且右下角还会有一个二维码,可以只用 Lottie 的 Demo App 扫码在手机上预览。
需要注意的是,这种方式,只针对没有图片资源的动画 JSON 才有效。如果是带图片资源的动画,也只能开发自己使用程序实现的方式进行预览!
好了,再遇上 Lottie 动画有图片的时候,知道怎么和设计师沟通了吗?有其他问题欢迎在留言区留言!
今天在公众号后台回复成长『成长』,将会得到我整理的一些学习资料,也能回复『加群』,一起学习进步。
推荐阅读:
- 漫画:程序员,你能“管理”好你的产品经理吗?
 - 官方新出的 Kotlin 扩展库 KTX
 - 不懂批判性思维,可能正在限制你的程序员生涯
 - Android 开发,遇上 Emoji 头疼吗?
 - Andorid 签名和多渠道打包方案 | VasDolly
 
Lottie 动画里有图片怎么办?设计师小姐姐也能帮你减少开发量!的更多相关文章
- 程序员也想改 Lottie 动画?是的!
		
一.前言 Hi,大家好,我是承香墨影! Lottie 是 Airbnb 开源的一套跨平台的完整的动画效果解决方案,用过都说好.完全解耦开发人员和设计师,让设计师设计的动画,在程序中无缝还原,真是一旦拿 ...
 - 小I的小姐姐
		
小 I 的小姐姐 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 小 I 去天津玩啦,一路上,他跟他的同学发生了许多有趣 ...
 - 【译】css动画里的steps()用法详解
		
原文地址:http://designmodo.com/steps-c... 原文作者:Joni Trythall 我想你在css 动画里使用steps()会和我一样有很多困惑.一开始我不清楚怎样使用它 ...
 - 微信小程序里碰到的坑和小知识
		
本文作者:dongtao 来自:授权地址 本人低级程序员,以下bug不能确保在其它地方可以以相同的原因复现.同时, 出现很多bug的原因是小程序的基本知识还有编码的基本功不到位造成 路还很长,共勉 ...
 - zoom动画,实现图片点击预览效果
		
参考:https://developer.android.google.cn/training/animation/zoom.html 1.创建Views 下面的布局包括了你想要zoom的大版本和小版 ...
 - Android之Lottie动画详解
		
文章大纲 一.Lottie介绍二.Lottie实战三.项目源码下载四.参考文章 一.Lottie介绍 1. 什么是Lottie Lottie是Android和iOS的移动库,用于解析Adobe ...
 - [UWP]缓存Lottie动画帧
		
在上一篇博文<[UWP]在UWP平台中使用Lottie动画>中我简单介绍了一下LottieUWP项目以及如何使用它呈现Lottie动画,这篇文章里我们来讲点进阶的东西--缓存Lottie动 ...
 - APP爬虫(2)把小姐姐的图片down下来
		
APP爬虫(1)想学新语言,又没有动力,怎么办? 书接上文.使用appium在帖子列表界面模拟上划动作,捕捉不到列表的规律.上划结束后,列表只能获取到屏幕呈现的部分,而且下标还是从0开始的. 根据酸奶 ...
 - 使用 jQuery 中的淡入淡出动画,实现图片的轮播效果,每隔 2 秒钟切换一张图片,共 6 张图片
		
查看本章节 查看作业目录 需求说明: 使用 jQuery 中的淡入淡出动画,实现图片的轮播效果,每隔 2 秒钟切换一张图片,共 6 张图片,切换到第 6 张后从头开始切换,在图片的下方显示 6 个小圆 ...
 
随机推荐
- Map接口下的集合和泛型理解
			
一.Map接口 1. Map接口就是最顶层了,上面没有继承了.Map是一个容器接口,它与前面学的List.Set容器不同的是前面学的这些容器,一次只能传入一个元素,但是Map容器一次可以传入一对元素( ...
 - Set接口下的集合
			
一.集合(定义字段的时候统一使用包装类) 1.集合大类分为List.Set.Map三种,其中,List集合是有序可重复的,并且可以使用普通for循环.增强for循环.正向迭代器.双向迭代器:Set集合 ...
 - centos docker-ce安装
			
懂得自然懂 https://yeasy.gitbooks.io/docker_practice/content/install/centos.html
 - Python入门经典. 以解决计算问题为导向的Python编程实践
			
Python入门经典. 以解决计算问题为导向的Python编程实践(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1juLsew8UiOErRheQPOuTaw 提取 ...
 - ZOJ4043 : Virtual Singers
			
将所有$A$和$B$混在一起排序,那么每个$B$要匹配一个$A$,从左往右依次考虑每个数: 如果是一个$B$: 如果左边没有多余的$A$,那么将其放入堆$q_C$中,表示这个$B$还未匹配. 否则选择 ...
 - JavaScript模板引擎Handlebars
			
Handlebars模板库简单介绍 Handlebars是JavaScript一个语义模板库,通过对view(模板)和data(ajax请求的数据,一般是json)的分离来快速构建Web模板.它采用& ...
 - vbs脚本实现qq定时发消息(初级)
			
vbs脚本实现QQ消息定时发送 目标 批处理又称为批处理脚本,强大的强大功能可以高效得实现很多功能,例如批量更改文件格式,批量进行文件读写,今天我们的目标是用vbs脚本编写可以发送qq消息的脚本,并利 ...
 - [LeetCode] Prime Palindrome 质数回文数
			
Find the smallest prime palindrome greater than or equal to N. Recall that a number is prime if it's ...
 - cf 1142 C
			
忽然觉得这个题很有必要写题解. 移项 y-x^2 = bx+c 那么其实就是找有多少条直线上方没有点 所以就是一个上凸壳有多少条直线/点. 绝妙啊!!!! 太妙了啊!!!! 神乎其技卧槽!!! (我是 ...
 - 【高并发架构】Redis缓存高并发之-主从架构
			
Redis主从架构 到目前为止,Redis Cluster 能实现很好的性能,但如果只是缓存几个G的数据,那么单机Redis就足够了,但缓存主要用来读的,单机的QPS有一定的极限,一两万QPS一台应该 ...