前言: 接上一篇如何检查布局多层嵌套、过度绘制等问题,针对这些问题发现后如何处理,做一个整理。
一、Hierarchy Viewer
如何使用
第一种方式:通过命令行输入"hierarchyviewer"(需要配置环境变量);
第二种方式:Android Studio自带工具。
(如有同学发现连接不了的,官方有说明,添加ViewServer,设置环境变量export ANDROID_HVPROTO=ddm。具体细节可单独Google)
如何分析
1.选择要检测的应用包名
2点击顶部工具栏的三色小图标,可以刷新获取该模块布局刷新的时间。
举例:下图即为获取到的部分模块的布局Measure、Layout、Draw的参数。
这里我们主要关注下面的三个圆圈,从左到右依次,代表View的Measure, Layout和Draw的性能,不同颜色代表不同的性能等级:
1) 绿:表示该View的此项性能比该View Tree中超过50%的View都要快;例如,一个绿点的测量时间意味着这个视图的测量时间快于树中的视图对象的50%。
2)黄:表示该View的此项性能比该View Tree中超过50%的View都要慢;例如,一个黄点布局意味着这种观点有较慢的布局时间超过50%的树视图对象。
3)红:表示该View的此项性能是View Tree中最慢的;例如,一个红点的绘制时间意味着花费时间最多的这一观点在树上画所有的视图对象。
分析的结果:
红色的点代笔布局存在隐藏问题。
1)如果子节点或者ViewGroup中存在很少的红色点,此时不用太担心,这种情况应该不会导致应用运行过慢,但是具体是为什么,可以用Systrace或者Traceview工具看下具体信息。
2)如果很多的节点都出现红点,那你要注意了,需要检查下onDraw方法了。
3)如果遇到是根节点的结果是红红黄,不用担心,根节点很常见。
常见的解决方案:
1)没有用的父布局时指没有背景绘制或者没有大小限制的父布局,这样的布局不会对UI效果产生任何影响。我们可以把没有用的父布局,通过标签合并来减少UI的层次;
2)使用线性布局LinearLayout排版导致UI层次变深,如果有这类问题,我们就使用相对布局RelativeLayout代替LinearLayout,减少UI的层次;
3)不常用的UI被设置成GONE,比如异常的错误页面,如果有这类问题,我们需要用标签ViewStup,代替GONE提高UI性能。
二、OverDraw
如何使用
设置 -> 开发者选项 -> 调试GPU过度绘制 -> 显示GPU过度绘制。
再打开我们的系统,设备会自动显示如下图的效果。
没有颜色: 没有overdraw。正常绘制了一次。
蓝色: overdraw x1倍。像素绘制了两次。大量的蓝色还是可以接受的,去除一层绘制。
绿色: overdraw x2倍。像素绘制了三次。中等大小的绿色区域是可以接受的但你应该尝试优化、减少它们。
浅红: overdraw x3倍。像素绘制了四次,小范围可以接受。
暗红: overdraw x4倍。像素绘制了五次或者更多,绝对的警报级的错误,需要修复。
如何避免:
一句话总结:避免不可见元素的重叠绘制。
1)合理选择布局容器,避免重叠布局。
2)去除DecorView默认的背景色。
方案1:在onCreate函数中的setContentView后调用 getWindow().setBackgroundDrawable(null);
方案2:在样式里面添加android:windowbackground="null";
3)同第二点理论,去除多层级间的不可见背景。
4)自定义View(onDraw函数)过度绘制。
通过canvas.clipRect()获取当前可见区域,在这之前可以通过canvas.quickreject()判断是否有相交的绘制,减少canvas.clipRect()调用。
5)ViewStup、Merge标签。
6)灵活使用draw9patch文件。
7)产品设计上注意简单实用,不要在设计上做的过分华丽,给用户带来压迫感。-“OverDesign”
参考资料:http://blog.csdn.net/swordgirl2011/article/details/52887925
http://www.jianshu.com/p/145fc61011cd