性能优化之过度绘制
过度绘制监测:
打开开发者选项的 显示过度绘制
- 原色:没有过度绘制
- 蓝色:1 次过度绘制
- 绿色:2 次过度绘制
- 粉色:3 次过度绘制
- 红色:4 次及以上过度绘制
优化策略:
1 若你的界面有自己的背景覆盖了全屏,则可以去除Activity自带的背景色
<style name="AppTheme" parent="android:Theme.Light.NoTitleBar">
<item name="android:windowBackground">@null</item>
</style>
或者
getWindow().setBackgroundDrawable(null);
2 ImageView的background和imageDrawable重叠
ImageView的background设置了默认背景图
而 加载图片时 仍然会绘制这个背景图
解决: 把背景图和真正加载的图片都通过imageDrawable方法进行设置
3 限制 view的绘制区域
通过clipRect和clipPath方法 限制view的绘制区域
避免不必要的区域的绘制
4 使用 merge、include、ViewStub 标签进行布局优化
include设置layout=“xxx”进行布局设置
可以设置 长宽
ViewStub是惰性加载 用到的时候才加载布局
注意:要使用viewStub中的控件
不是用 viewStub.findxxx
而是直接 findxxx 并且要在 ViewStub加载后才可以
因为 ViewStub 加载了 ViewStub会移除自身 用相应的布局代替
所有的控件已经放到了 父布局里面了
使用 merge标签作根布局去除界面的多余层级
如 使用了 include标签 则可以用merge标签作根布局
实践: setVisibility会不会绘制
无论是 View.INVISIBLE 还是 View.GONE 都是不绘制的 也是不能被点击
但是 会调用 invalidate 因此
动态地inflation view性能要比SetVisiblity性能要好,当然ViewStub是最好的选择