过度绘制就是在同一个区域中叠加了多个控件,也就是说一个像素点上会出现多个像素的叠加,实际上呈现在我们眼前的只是最上面的一个,往往造成这种现象的原因是产品或者视觉过多繁琐的建议和交互,或者是开发人员自己不注意造成的。
(一)过度绘制查看:
通过打开开发者选项中的 显示GPU过度绘制(设置—更多设置–开发者选项–调试GPU过渡绘制— 显示过渡绘制区域.)来进行测试(PS:每个手机可能不一样,但是一定是有“调试GPU过渡绘制”选项 ,目前只有android4.2及以上的版本才具备此功能)
一. 颜色标识: 从好到差:蓝-绿-淡红-红
1. 蓝色1x过度绘制
2. 绿色2x过度绘制
3. 淡红色3x过度绘制
4. 红色超过4x过度绘制
二. 验收标准:
1. 控制过度绘制为2x
2. 不允许存在4x过度绘制
3. 不允许存在面积超过屏幕1/4区域的3x过度绘制(淡红色区域)
处理前: 处理后:
(二)处理方案:
1.减少多余的background,这个最重要,基本上都是因为这个原因造成的。解决好背景基本上就等于解决了大多数。
比如:
2.可复用组建使用include或者style的方式减少大量代码.(这个感觉在优化代码上用的多)
3.viewStub的引入减少不长用的布局View的添加,比较重要,在xml文件预加载的时候他的标识只是说明一个占位符号而已,(这个感觉在代码性能上有所提升)
4,减少层级,可以使用sdk提供的工具Hierarchy Viewer进行层级查看具体使用:
5.注意一些层级布局比如:layer-list,
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
<item>
<shape>
<stroke android:color="#cbcbcb"
android:width="1dp"
/>
<solid android:color="@color/color1" />
</shape>
</item>
<item android:bottom="1px">
<shape>
<solid android:color="@color/color2" />
</shape>
</item>
</layer-list>
这种一定要小心,他可能也会引入多一层级,尽量可以用一层完成的就用一层的思路去完成。
6.使用Selector当背景的Layout,会使用Selector来标记点击,选择等不同的状态,可以将normal状态的color设置为”@android:color/transparent”,来解决对应的问题,但是这个前提的使用效果要求你的Iten以下的背景颜色值和你normal的颜色值一样.
7.this.getWindow().setBackgroundDrawable(null);的方式去设置背景,这个要谨慎使用,在低端机上的使用可能会造成闪屏的情况,
窗口背景的优化
视图有背景,每个窗口也是有背景的。每一Activity是一个窗口,每一个Activity都有不同得背景。界面的绘画顺序如下:窗口——跟视图 ——子视图。当我们的跟视图已经覆盖了整个窗口的时候 ,程序还是会画一个透明的窗口的背景,而这个背景用户是看不到的。我们就需要想办法让程序在这样的情况下去掉窗口背景,节约画窗口背景的时间提高效率。
第一种:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 删除窗口背景
getWindow().setBackgroundDrawable(null);
}
第二种:
首先在res/values/style.xml 文件中定义如下:
<resources>
<style name="NoBackgroundTheme" parent="android:Theme">
<item name="android:windowBackground">@null</item>
</style>
</resources>