Lottie加载的一些坑
Lottie是一个非常强大的动画库,可以渲染一些非常绚丽的动画。然而在使用的过程中,会遇到一些诡异的问题。通常,这不是使用方式上有什么问题,大都是UE产出的lottie本身存在问题。本来之前的UE小哥还不错的,跳槽后来了个UE小姐姐,实在是一言难尽。。。那么,既然UE经常搞事情,我们如何辅助UE去定位lottei的问题呢?本篇记录lottie加载遇到的一些坑或问题。
之前,我写过一篇非常详细的博客来总结Lottie在Android端的使用,如果是使用lottie,可以参考我这边文章,非常详细https://zhaojun.blog.csdn.net/article/details/115773156https://zhaojun.blog.csdn.net/article/details/115773156
目录
一、Lottie加载本地zip包的诡异问题
二、iOS单端崩溃问题
三、Android加载不显示问题
四、Android单端崩溃问题
一、Lottie加载本地zip包的诡异问题
看下面的一个例子,好端端的一个lottie,加载不出来,也没有崩溃走到Exception回调中。于是我添加FailureListener,去看下到底报了什么错。
private void loadLottieWithLocalZip() {
try {
LottieCompositionFactory.fromZipStream(new ZipInputStream(
new FileInputStream("/sdcard/test.zip")), null)
.addListener(new LottieListener<LottieComposition>() {
@Override
public void onResult(final LottieComposition lottieComposition) {
if (lottieComposition != null) {
mLottieView.setComposition(lottieComposition);
mLottieView.playAnimation();
}
}
})
.addFailureListener(new LottieListener<Throwable>() {
@Override
public void onResult(Throwable result) {
Log.d("TTTT", "result:" + result.getMessage());
}
});
} catch (Exception e) {
Log.d("TTTT", "e:" + e.getMessage());
}
}
可以看到,走到了Failure回调,异常如下,看上去像是缺少了某个image:
然而对lottie的zip文件解压后,其实里面有img_3.jpg:
因此,并不是缺少了Img_3.jpg这个文件。那接下来如何分析呢?我们查看下lottie里面的data.json文件:
图片是jpg,但是下面这个cl是png,不懂lottie的cl字段是啥,怀疑可能有问题:
UE小姐姐重新出了一个所谓的"兼容lottie",抱着试了一下,还是加载不出来,一样的报错。咋办?只能去看lottie源码:
1、首先,看下抛出这个异常的代码:
拿不到这个bitmap,所以抛出了异常。
2、顺着这里往上看:
找到了,判断png或者webp的,才会加载bitmap,否则给close了。那么,我们基本确定,是因为UE给的lottie包里面的图片有jpg的,而通过zip包加载不支持jpg(不知道lottie为什么有这个限制)。
于是,我强制把jpg后缀改为png,并修改了data.json里面的jpg,尝试加载,成功了!当然,实际上我们肯定不能这么去修改后缀和json,还是反馈给UE去出一版png的lottie,毕竟在生产lottie这方面人家还是专业的。。
二、iOS单端崩溃问题
再来看这么一个例子,也是好好的lottie,在Android加载没问题非常完美,但是同事说在iOS直接崩溃了。调试半天发现json的某个layer缺了ind这个属性:
三、Android加载不显示问题
再来一个例子,UE小姐姐产出的lottie在iOS加载成功了,但是Android没加载出来,也没有crash。然后又开始甩锅给我Android了,直接去看下是不是在json里面直接使用base64编码的图片:
Android的Lottie不能像上面那么直接使用base64的图片,得使用路径和文件名的形式:
四、Android单端崩溃问题
很早之前遇到过一个lottie,在iOS加载没问题,但是Android稳定的崩溃,通过调试发现是lottie内部使用了iOS的某种字体,而该字体在Android系统不存在。因此,建议UE不要再lottie中使用系统字体。
以上是lottie使用过程中常遇到的一些诡异问题,如开篇所说,这都是UE做lottie时产生的问题,而RD通过调试可以很快的发现问题。但如果我们把这些问题整理下来,可能不用调试看下文件内容就知道了,希望对你有所帮助。