android静态动画,Android Lottie动画实战踩坑
Lottie简介
Lottie是一个iOS,Android和React Native库,可以实时渲染After Effects动画,允许应用程序像使用静态图像一样轻松使用动画。
为什么使用Lottie?
灵活的After Effects功能
Lottie目前支持实体,形状图层,蒙版,alpha遮罩,修剪路径和虚线图案。Lottie将定期添加新功能。
以更让人喜欢的方式操纵动画
Lottie动画可以前进、后退,并且最重要的是可以对动画进行编程以响应任何交互。
动画文件小
在应用中捆绑矢量动画,而不必担心多个维度或大文件大小。或者可以通过从JSON API加载动画文件来完全将动画文件与应用程序代码分离。
Android引入Lottie
使用准备
Lottie支持多平台,使用同一个JSON动画文件,可在不同平台实现相同的效果。Android 通过Airbnb的开源项目lottie-android实现,最低支持 API 16;
在项目的 build.gradle 文件添加依赖
dependencies {
implementation 'com.airbnb.android:lottie:$lottieVersion'
}
在项目的 build.gradle 文件添加依赖
核心类
LottieAnimationView继承ImageView,是加载Lottie动画的默认和最简单的方法
LottieDrawable与LottieAnimationView具有大多数相同的API,但可以在任何所需View上使用它。
LottieComposition动画json数据的对象模型,通过LottieComposition,实现对动画的分解和序列化。
加载动画
Lottie动画可以从以下几处加载:
存放在src/main/res/raw下的json动画文件
存放在src/main/assets下的json文件
存放在src/main/assets下的zip文件
通过一个url获取到的json或者zip文件
一个json字符串,可以来自于任何地方,包括网络
一个输出json或者zip文件的InputStream
XML方式加载动画
最简单的使用方法是使用LottieAnimationView:
建议使用lottie_rawRes,因为可以通过R使用对动画的静态引用,而不是仅使用字符串名称。
From res/raw (lottie_rawRes) or assets/ (lottie_fileName)
android:id="@+id/animation_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:lottie_rawRes="@raw/hello_world"
// or
app:lottie_fileName="hello_world.json"
// Loop indefinitely
app:lottie_loop="true"
// Start playing as soon as the animation is loaded
app:lottie_autoPlay="true" />
编程方式加载动画
可以查看LottieAnimationView类的API进行编程方式播放动画,具体代码不再赘述
Lottie动画还支持更多特性:动画监听器、动画循环、缩放等此处不再赘述,有需要请参考:http://airbnb.io/lottie/#/android
踩坑(遇到的问题)
动画文件版本问题
UI首次给我物料时立即放到工程里试了一下,发现报错如下:
java.lang.IllegalStateException: Missing values for keyframe.
at com.airbnb.lottie.animation.keyframe.FloatKeyframeAnimation.getValue(FloatKeyframeAnimation.java:16)
at com.airbnb.lottie.animation.keyframe.FloatKeyframeAnimation.getValue(FloatKeyframeAnimation.java:8)
at com.airbnb.lottie.animation.keyframe.BaseKeyframeAnimation.getValue(BaseKeyframeAnimation.java:125)
at com.airbnb.lottie.animation.keyframe.TransformKeyframeAnimation.getMatrix(TransformKeyframeAnimation.java:113)
经过搜索发现了一个官方的issues:https://github.com/airbnb/lottie-android/issues/1177
有一个哥们回复如下:Lottie 3.0和Bodymovin 5.5有一些重要的json优化,可以节省json大小和解析速度的1/3。 但是,必须在3.0以上生效,否则就在bodymovin设置中启用“导出为旧格式”(Bodymovin为AE导出动画的插件)。
看了一下我们的版本果然为3.0一下(2.5.6),于是跟UI说明,重新导出了一份动画物料,问题解决。
zip动画文件多次播放崩溃
UI给我的是一个zip文件,由于Lottie也支持zip所以就直接把zip文件放到assets目录下适使用,第一次进入效果很好,但是退出Activity再次进来就会报错,错误信息如下:
java.lang.IllegalStateException: You must set an images folder before loading an image. Set it with LottieComposition#setImagesFolder or LottieDrawable#setImagesFolder
at com.airbnb.lottie.manager.ImageAssetManager.bitmapForId(ImageAssetManager.java:107)
at com.airbnb.lottie.LottieDrawable.getImageAsset(LottieDrawable.java:839)
at com.airbnb.lottie.model.layer.ImageLayer.getBitmap(ImageLayer.java:68)
at com.airbnb.lottie.model.layer.ImageLayer.drawLayer(ImageLayer.java:32)
at com.airbnb.lottie.model.layer.BaseLayer.draw(BaseLayer.java:201)
at com.airbnb.lottie.model.layer.CompositionLayer.drawLayer(CompositionLayer.java:100)
at com.airbnb.lottie.model.layer.BaseLayer.draw(BaseLayer.java:201)
at com.airbnb.lottie.LottieDrawable.draw(LottieDrawable.java:319)
很幸运的是这个bug我也找到了官方的issueshttps://github.com/airbnb/lottie-android/issues/1009,有一个committer回复在新版本已经修复了这个bug,修复到了3.0版本,看代码提交记录大概是bitmap回收的bug。由于我们的版本是2.5.6因此存在此bug,但是升级Lottie的成本比较大,UI又倾向于使用Lottie,这个问题很难办。抱着试一试的态度把zip解压了,放到assets目录下居然没有问题了。!
android静态动画,Android Lottie动画实战踩坑相关推荐
- android jason动画,Android 动画之Lottie动画使用
Android 动画之Lottie动画使用 一:简介 Lottie是Airbnb开源的一套跨平台的完整解决方案,设计师只需要使用After Effects(简称AE)设计动画之后,使用Lottic提供 ...
- Android 解决XXX Layout leaked 使用Navigation 踩坑 XML内存泄漏
Android 解决XXX Layout leaked 使用Navigation 踩坑 XML内存泄漏 报错日志 排查过程 泄漏原因 解决方案 最近维护一个项目,一个内存泄漏的的原因查了很久,这里记录 ...
- Android获取不到运动步数(踩坑)
Android获取不到运动步数(踩坑) 获取运动步数 某些手机获取不到步数 获取运动步数 使用SensorManager,也就是手机内置的传感器获取运动步数,通过该方法可获取到当前运动步数.开机后总运 ...
- 【问题解决】Android JDK版本不匹配导致崩溃踩坑记录
[问题解决]Android JDK版本不匹配导致崩溃踩坑记录 部分机型反馈崩溃问题 谷歌回复与解决方案 Android打包脱糖操作 对比与排查 总结 前几天同事遇到一个非常诡异的报错,紧急处理后,趁着 ...
- 微信H5支付实战踩坑
准备 需求 需求就是最简单的对接微信H5支付接口 方案心路历程 之前直接用http对接过,不过这次想用官方提供的SDK 一方面SDK提供的接口比较完整,二方面感觉应该使用别人辛苦写下来的封装 百度了一 ...
- 【Android -- 动画】Lottie 动画的基本使用
一.简介 Lottie 是 Airbnb 开源的一个面向 iOS.Android.React Native 的动画库,能分析 Adobe After Effects 导出的动画,并且能让原生 App ...
- Android安卓集成融云推送踩坑
此文档单单接入推送,暂时没有用IM或其他 如果您觉得可以帮助到您,麻烦帮我点个赞. -------------------------------- 写在前面,为什么要用这个,我并不想,实际接入过程中 ...
- zbar android解码错误,Android原生编解码接口 MediaCodec 之——踩坑
关键帧 MediaCodec 有两种方式触发输出关键帧,一是由配置时设置的 KEY_FRAME_RATE和KEY_I_FRAME_INTERVAL参数自动触发,二是运行过程当中经过 setParame ...
- 【Unity游戏开发】Android中如何集成Unity3D项目——入门级踩坑
最近的学习之路真的是波折,先是想学Kotlin,结果赶上了算法比赛,恶补了几天算法,然后回归Kotlin,这周又需要调研一下Unity3D,需要把Unity项目嵌入到我们的Android项目中. 今天 ...
- Android集成阿里云旺即时通讯踩坑历程
下载云旺的demo,将demo中的OneSDK直接拷贝,作为Moudle进行依赖,具体操作就不说了,OneSDK是最新的,一定不要进行修改, 进行依赖后,可能会遇到buildToolsVersion ...
最新文章
- SCOM警报通知新特性:即时消息通知
- ArrayList 解释
- 从新冠疫情出发,漫谈 Gossip 协议
- 可穿戴设备对企业的积极意义
- 01:操作系统(centos,redhat):性能监控和网络命令
- 将request.getParameterMap()转换成可操作的普通Map
- PyTorch的学习笔记
- Koa v2.x 中文文档 上下文(Context)
- 图层重命名快捷键_玩转CAD快捷键(大全),一篇文章就够了
- 【中山市选2009】【BZOJ2463】谁能赢呢?
- 水凝胶 静电纺丝_离子液体/水和静电纺丝条件对聚偏氟乙烯纳米纤维晶体结构的影响...
- js获取ck_JS获取CkEditor在线编辑的内容
- 中英文计算机核心期刊目录
- linux把终端嵌入桌面,在你的Ubuntu Linux桌面上嵌入终端窗口
- linux num_fds文件描述符数量限制 too many openfiles 错误
- MarkDown桌面版使用下载+安装+使用教程(包括全套的使用语法,欢迎大家查看)
- 汇佳学校|多元艺术+探究式思维 领航国际艺术教育新趋势
- 利用Sobel算子,求梯度图像
- xshell 的快捷键 复制是 Ctrl+Insert,粘贴是 ShIft+Insert。刚才发现可以设置成 ctrl+C 和 ctrl+V
- 【matlab系列汇总】matlab学习实战快速进阶之路(持续更新)