本文主要介绍动画开源库 Lottie 在 Android 中的使用。

前言

在日常APP开发中,为了提升用户感官舒适度等原因,我们会在APP中加入适量动画。
而传统手写动画方式往往存在诸多问题:

  • 动画复杂而实现困难

  • 图片素材占用体积过大

  • 不同Native平台都需各自实现,开发成本高

  • 不同Native平台实现的最终效果不一致

  • 后期视觉联调差异化大

难道就没有一种简便且高效的方案来减缓或解决上述问题吗?

答: 有的,那就是本文要介绍的主角 Lottie

一、Lottie 是什么?

Lottie是Airbnb开源的一个面向IOS、Android、React Native的动画库,可以解析用 Adobe After Effects 制作动画后通过 Bodymovin 插件导出的 Json 数据文件并在移动端原生渲染。

通俗点说,它是一款动画开源库,通过解析特定的Json文件或Json文本,可直接在移动端上渲染出复杂的动画效果。

参考图释

二、Lottie 能干什么?

它可以简便高效的实现复杂动画,替代传统低效的手写动画方式。

动画展示:

上方的动画是通过Lottie直接实现的。

如果我们使用手写代码方式实现,可以说是很难!

而通过 Lottie 实现时,需要的仅是一个Json文件或一段Json文本,并通过简洁的代码集成即可。

集成代码可能精简到如下模样:

1
2
3
4
5
6
7
<com.airbnb.lottie.LottieAnimationViewandroid:id="@+id/animation_view"android:layout_width="wrap_content"android:layout_height="wrap_content"  app:lottie_rawRes="@raw/anim_lottie"app:lottie_loop="true"app:lottie_autoPlay="true" />

三、为什么使用 Lottie?

  • 简便,开发成本低
    相对于传统方式,动画不再是全部手写,所需做得只是嵌入XML并配置动画属性,集成快,开发时间少,开发成本低。

  • 不同 Native 平台效果基本一致
    渲染交由Lottie引擎内部实现,无需开发者处理平台差异,多平台共用同一个动画配置文件,效果一致性高。

  • 占用包体积小
    Lottie配置文件由Json文本串构成,相对于图片,占用体积更小。

  • 动画效果不失真
    传统图片拉伸或压缩导致失真,而Lottie为矢量图展示,不会出现失真情况。

  • 动画效果可以云端控制
    由于Lottie动画基于Json文件或文本解析,因此可以实现云端下发,实现动态加载,动态控制动画样式。

四、如何使用 Lottie?

Lottie 仅支持用 Gradle 构建配置,最低支持安卓版本 16。

1. 添加依赖到 build.gradle

1
2
3
4
5
6
7
dependencies {implementation 'com.airbnb.android:lottie:2.5.4'
}
或
dependencies {implementation "com.airbnb.android:lottie:${全局版本变量}"
}

2. 添加 Adobe After Effects 导出的动画 Json 文件

通常由视觉工程师确认动效后通过AE导出, 我们只需将该Json文件保存至 /raw 或 /assets文件夹下。

3. XML中嵌入基本布局

1
2
3
4
<com.airbnb.lottie.LottieAnimationViewandroid:id="@+id/animation_view"android:layout_width="wrap_content"android:layout_height="wrap_content"/>

4. 加载播放动画,两类方式可选

① XML中静态配置, 举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
<com.airbnb.lottie.LottieAnimationViewandroid:id="@+id/animation_view"android:layout_width="wrap_content"android:layout_height="wrap_content"  //加载方式如下2种任选其一app:lottie_rawRes="@raw/hello_world"app:lottie_fileName="hello_world.json"//循环播放app:lottie_loop="true"//加载完毕后自动播放app:lottie_autoPlay="true" />

② 代码动态配置, 举例:

如下代码会在后台异步加载动画文件,并在加载完成后开始渲染动画。

1
2
3
4
LottieAnimationView animationView = ...;
animationView.setAnimation(R.raw.hello_world);
animationView.loop(true);
animationView.playAnimation();

五、其他拓展使用

1. 直接解析Json文本串加载动画

1
2
3
4
5
6
7
8
9
10
JsonReader jsonReader = new JsonReader(new StringReader(jsonStr));
lottieView.setAnimation(jsonReader);
lottieView.playAnimation();
或
Cancellable cancellable = LottieComposition.Factory.fromJsonString(jsonStr, composition -> {lottieView.setComposition(composition);lottieView.playAnimation();});
//必要时取消进行中的异步操作
cancellable.cancel();

2. 配合网络下载,实现下载Json配置并动态加载

1
2
3
4
5
6
7
8
9
10
11
12
13
Call<ResponseBody> call = RetrofitComponent.fetchLottieConfig();//伪代码
call.enqueue(new Callback<ResponseBody>() {@Overridepublic void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {//String json = response.body().string();//交由Lottie处理...}@Overridepublic void onFailure(Call<ResponseBody> call, Throwable t) {//do something.}});

3. 动画加载监听器

根据业务需要进行动画过程监听:

1
2
3
4
5
6
7
8
9
10
11
animationView.addAnimatorUpdateListener((animation) -> {// do something.
});
animationView.playAnimation();
...
if (animationView.isAnimating()) {// do something.
}
...
animationView.setProgress(0.5f);
...

4. LottieDrawable 的使用

1
2
3
4
5
6
7
8
LottieDrawable drawable = new LottieDrawable();
LottieComposition.Factory.fromAssetFileName(getApplicationContext(), "lottie_pin_jump.json", composition -> {drawable.setComposition(composition);//目前显示为静态图ivLottie.setImageDrawable(drawable);//调用start()开始播放动画drawable.start();});

5. 更多使用可参考文末官方链接

六、需要考虑的问题

  1. 由于是依赖于AE做的动画,估计以后不只是要求视觉设计师精通AE,连前端开发都需要了解AE
  2. Lottie 对 Json 文件的支持待完善,目前存在部分AE导出成 Json 文件无法渲染或渲染不佳
  3. 支持的功能存在限制,可参考 功能支持列表。

七、总结

尽管Lottie还存在诸多小问题,但它所带来的效率提升绝对是传统开发方式无法比拟的。我们要做的是正确善用它。

参考资料

官网网址
Github地址
测试用Json文件
项目中文翻译版 (略有差异)

动画库 Lottie 的使用相关推荐

  1. AE 动画直接变原生代码:Airbnb 发布开源动画库 Lottie

    原文 Airbnb 发布的 Lottie 是一个面向 iOS.Android 和 React Native 的开源动画库. 简单来说,就是可以直接利用 AE 导出的 JSON 动画文件,将其解析为原生 ...

  2. 用Android打出马奔跑的动画,一款非常好用的动画库Lottie

    简介 Lottie是Android和iOS的移动图书馆,用于解析Adobe After Effects动画,并以Bodymovin作为json导出,并在手机和网络上本机呈现. 该项目在GitHub已经 ...

  3. android动画制作工具,一款非常好用的动画库Lottie

    简介 Lottie是Android和iOS的移动图书馆,用于解析Adobe After Effects动画,并以Bodymovin作为json导出,并在手机和网络上本机呈现. 该项目在GitHub已经 ...

  4. lottie android 源码,Lottie动画库 Android 端源码浅析

    惊艳的Lottie 前段时间airbnb开源的动画库Lottie得到了不错的反响,旨在解决Android.IOS.RN 上面开发动画成本高.表现不一致的问题,可以说降低了三端动画的开发成本. 先上几个 ...

  5. Lottie开源动画库

    为什么80%的码农都做不了架构师?>>>    一款Lottie的动画库,效果挺好,查了一下发现这款动画库可以支持H5.它能够同时支持iOS.Android.ReactNative和 ...

  6. SwiftUI3.0封装Lottie动画库

    SwiftUI3.0封装Lottie动画库 动画的json文件从阿里有个设计图片自己去下载,或者从github找 import SwiftUI import Lottie//SwiftUI 不能直接 ...

  7. 如何在微信小程序里使用Lottie动画库

    先看效果图: 前言: 微信小程序的lottie动画库是按照lottie-web动画库改造而来.参考lottie-web:https://github.com/airbnb/lottie-web,以及官 ...

  8. Lottie安卓开源动画库使用

    碉堡的Lottie Airbnb最近开源了一个名叫Lottie的动画库,它能够同时支持iOS,Android与ReactNative的开发.此消息一出,还在苦于探索自定义控件各种炫酷特效的我,兴奋地就 ...

  9. 全面兼容各端的动画库PAG,对标Lottie

    感谢Tencent 开源了PAG库,终于有了国人自己的动画库了,该库兼容:移动端,桌面端,,WEB端,还有小程序端,真可谓用心了,而且PAG库相对其他库,使用的pag文件更小,更流畅,而且PAG还兼容 ...

最新文章

  1. mysql left join的深入探讨
  2. 根据BAPI_PO_CREATE1创建采购订单
  3. Oracle EM 12c
  4. mysql 快照能否恢复某个表_mysql全库备份恢复某个表
  5. aws python lambda_python – AWS Lambda发送HTTP请求
  6. hive参数配置使用
  7. 我和小美的撸码日记(1)之软件也需靠脸吃饭,带您做张明星脸(附后台经典框架 DEMO 下载)...
  8. QQ通讯录VS360通讯录对新建信息界面中草稿的处理
  9. linux pt 客户端,下载工具系列——rTorrent (轻量级优秀BT/PT客户端)
  10. IntelliJ IDEA如何创建Source Folder和导入jar包
  11. 计算机毕业设计ssm小区宠物管理系统k8n96系统+程序+源码+lw+远程部署
  12. std::cout彩色输出
  13. SAP ABAP EXCEL导出多个SHEET页签
  14. 多重背包的二进制拆分法
  15. DNS提示错误无法上网怎么办?苹果电脑如何修改DNS?
  16. iOS如何避免图像解压缩的时间开销
  17. 计算机网络安全(1)
  18. win10恢复经典开始菜单_怎么将win10界面切换成win7界面
  19. 4G LTE频带划分和国内运行商资源分配
  20. 51单片机真的过时了吗?单片机、ARM、DSP、FPGA/CPLD

热门文章

  1. 10.QML Qt Quick Controls 2之imagine style
  2. 产生任意区间内的均匀分布的随机整数序列
  3. redis 内存不足 排查_redis莫名数据被清问题排查记录
  4. P4491 [HAOI2018]染色
  5. DB2 runstats、reorgchk、reorg 命令【转载】
  6. Ubuntu架设FTP
  7. 《Groovy语言规范》-语法
  8. ubuntu时钟不显示的解决方法
  9. 使用Linq读取资源文件
  10. php的数组与字符串的转换函数整理