最近做了不少动效,免不了要和Lottie打交道,然后UI同学更新了一版本Lottie,当图片放在压缩包中时ios无法展示,当图片压缩成base64码放入data.json文件时android无法展示了,android端加载本地zip lottie使用的是LottieCompositionFactory.fromZipStreamSync() 。
通过源码得知,首先通过流读取zip中文件,主要是
1、读取data.json 动效数据解析成Composition,
2、 png等类型图片等放入Map
3、接着将Map中的bitmap设置给Compostion中的imageAsset
4、检查Compostion中的imageAsset都已经设置了bitmap
所以将图片转成base64直接在data.json中使用,然后压缩成zip下发是无法展示Lottie动效的,因为fromZipStreamSync() 方法内部只读zip包中的图片。在进行第4步时发现Compostion中的imageAsset没有bitmap数据就直接结束了
后来又想到,同时也在zip包中放png图片就可以解决了,但是源码中解析data.json的时候,如果图片是base64会将那串很长的base64作为图片的名字,所以在对对比zip包中图片名字和Compostion中的imageAsset.fileName,我将图片命名为那串base64时失败了,应该是里面的特殊字符导致,还有那串base64很长很长。
所以建议分端下发 ios可以用含有base64的zip,android则使用不含有base64的; 活着android端判断下如果只有data.json则解压后直接加载json文件
网友评论