原标题:【实战总结】帧动画调优实践
原文链接:https://www.zybuluo.com/avenwu/note/876161
APP架构师整理发布,转载请联系作者获得授权。
1.背景
在做动画的时候我们有很多选择方案。
最常见的是Android原生的帧动画,位移动画,旋转动画,属性动画等等,具体根据动画效果选择实现方案;
针对那些有规律,不太复杂的矢量动画我们往往也采取自定义View来实现,比如各种狂拽炫酷的loading动画;
如果自定义实现成本比较大,或者难以达到Android/iOS多端统一,也经常采用帧动画,由UE提供帧动画素材;
如果项目支持,也可以使用Airbnb出品的Lottie[1],这是一个非常牛x的动画解析库,不过对sdk版本有要求,具体可以自行查验下.
目前最优方案是使用Lottie动画库,在无法使用Lottie的情况下,我们就需要手动来具体帧动画的调优了。
本文主要谈谈做帧动画的一些优化策略以避免OutOfMemoryError问题。
2. 帧动画有什么问题?
我们都知道原生的Android帧动画在加载序列帧时,是一次性将所有序列帧的图片编码到内存当中的,所以执行帧数较多的动画时很容易发生内存不足,抛出OutOfMemoryError。
所以呢,你就需要解决内存问题,基本上可以从以下几方面入手;
降帧
在保证UI效果和视觉流畅度的情况下尽可能减少帧数,比如UE输出的序列帧可能默认有有4,5十张图片,减帧后可能只有20张;这里一定要注意的是,必须经过UE来减帧,RD不允许私自调整,避免效果不达标;
压缩尺寸
根据在手机上的展示大小,缩放到一致的高宽,避免屏幕上展示100x100,你用一个500x500的资源;
压缩体积
采用无损或者可接受的有损压缩图片质量,这个也无需多说,老司机都懂得。打个广告,推荐笔者写的IntelliJ插件 http://avenwu.net/biu/;
重写帧动画的编码逻辑
这里的一个思路是动态编码图片,不再一次性加载所有图片,通过懒加载的方式,图片对内存的要求会大幅降低;
3. 手工实现帧动画
3.1 帧动画分析
下面主要针对重写帧动画的编码逻辑这个维度来聊聊具体的实现策略。
既然要重写帧动画,首先就要知道Android原生帧动画的实现逻辑;通过阅读相关源码,笔者绘制了如下简化示意图,基本涵盖了帧动画的构造和执行过程;
可以看到帧动画在首次inflate的时候会解析xml,并将每一个item节点解析为drawable对象实例,然后加入到数组当中;后续动画过程就是轮询绘制&#