一. 布局显示过程
1 inflate:
将xml格式的layout文件实例化为相应的View对象
2 measure:
从根节点开始计算所有View的尺寸,会调用每个·View的measure方法
3 layout
从根节点开始计算所有View的位置
Measure和layout都是递归获取View的大小和位置,都是以深度为优先级,可以看出层级越深元素越多,耗时也就越长;
4 draw
绘制View
二. 影响UI效率的因素
- View太多:
更多的inflate,计算更多更复杂,draw时间长 - 布局太深:
更多的Measure和layout - 图片&背景:
图片资源过大,缩放耗时
过渡绘制 - 频繁刷新UI:
占用Cpu资源
界面卡顿,交互反应慢,甚至造成ANR
三. 优化实践
1.减少View
尽可能减少控件的使用,例如
2.使用ViewStub标签
对于不需要立即显示的视图,可以使用/</ViewStub/>标签按需加载
3.使用include标签
将公共布局抽取到单独文件,并通过include标签引用,以减少视图层级和代码复用
过度绘制:
多次绘制或覆盖屏幕的同一像素
场景:通常发生在布局层叠和视图透明度设置不当时
问题:导致应用性能降低,消耗更多的CPU资源,从而影响体验
解决手段:
1.减少不必要的嵌套和重叠
2.避免在视图上使用不透明或半透明背景,如果某个视图需要背景色,可以考虑使用完全不透明的颜色
使用android:windowBackground属性:主题中设置颜色,可以避免每个布局都设置背景,造成重复;如果每个页面背景不同,window应该设置为透明
检查过度渲染的方法
连接实机进入开发者选项
在开发者选项中找到 -调试GPU过度绘制,会出现如下的画面:
其中的颜色就代表渲染程度:
- 真彩色:无过度绘制
- 蓝色:过度绘制一次
- 绿色:过度绘制两次
- 粉色:过度绘制3次
- 红色: 过度绘制4次及更多