优化重于泰山
对于同样机器环境上的应用来说,抛去受CPU、屏幕和系统GUI系统的固有时间消耗外,要实现流畅的动画的核心也就是减少视图Draw的时间。
这里有几点经验可以跟大家分享一下:
- 尽量不要在刷新时做耗时操作,必须准备数据,创建图片,图片变换等,数据和图片都应该在之间就加载到内存中,图片变换用canvas的变换来实现。
- 同一个界面中多个动画重叠出现时,尽量将动画的刷新过程统一进行刷新,避免频繁的invalidate,尤其是多个动画有时序上的关系时更应该统一。
- 尽量使用带有参数的invalidate来刷新,这样可以减少很多运算量。
- 合理的环境下使用surfaceview来操作,比如播放视频等,这种刷新耗时比较大的情况。
开启硬件加速,硬件加速由于采用了显示列表的概念,所以刷新过程也有很大的优化,但是会增加额外的8M内存占用。
Animation流畅度
动画线程中,少做动画外的事情(比如拖动的时候同时做了图片加载,或进度转圈),或用子线程去做这一件事;多个View做动画,变成一个View做多个动画,从而减少View Tree递归调用;
消失的或不在屏幕中的bg,view不绘制,减小绘制面积(bg绘制前用clipRect控制),减小缓存尺寸;不要用requestLayout实现动画,用矩阵变换代替,少用clipPath剪切图片;
不要设置listview的selector;
动画时间控制在400ms以内;
利用好硬件加速;
动画用nineoldandroid或者在实现的时候尽量把动画的绘制都放到一个消息循环里面;
Layout加载速度
简化动画布局(包括view层级和数量),不用的布局可以用viewstub包住在用的时候inflate;
提前将布局inflate传入,记得处理static引用;