一、概述:
布局优化的方式有很多,使用抽象布局标签(include、ViewStub、merge)、去除不必要的嵌套和View节点、减少不必要的inflate及其他Layout方面可调有点,顺带提及布局调优相关工具(hierarchy viewer和lint)
二、抽象布局标签
<include>标签
- include标签常用于将布局中的公共部分提取出来供其他layout共用,以实现布局模块化,这在布局编写方面提供了大大的便利;
- 标签唯一需要的属性是layout属性,指定需要包含的布局文件。也可以覆盖引入布局根节点的对应属性。
<viewstub>标签
- viewstub标签同include标签一样可以用来引入一个外部布局,不同的是,viewstub引入的布局默认不会扩张,既不会占用显示也不会占用位置,从而在解析layout时节省cpu和内存。
- viewstub常用来引入那些默认不会显示,只在特殊情况下显示的布局,如进度条、网络失败显示的刷新布局、信息出错的提示布局等。
- 将一个view设置为GONE不会被解析,从而提高layout解析速度,而VISIBLE和INVISIBLE这两个可见性属性会被正常解析。
<merge>标签
在使用了include后可能导致布局嵌套过多,多余不必要的layout节点,从而导致解析变慢,不必要的节点和嵌套可以通过hierarchy viewer来查看。
该标签可用于以下两种典型情况:
- 布局顶节点是FrameLayout且不需要设置background或padding等属性,可以用merge代替,因为Activity内容视图的parent view就是个FrameLayout,所以可以用merge消除一个;
- 某布局作为子布局被其他布局include时,使用merge当作该布局的顶节点,这样引入时顶节点会被自动忽略,而子节点全部合并到主布局中。
去除不必要的嵌套和View节点
- 首次不需要使用的View可以设置GONE或者用ViewStub代替
- 使用RelativeLayout代替LinearLayout,前者性能更好。
三、减少不必要的inflate
- 对于inflate的布局可以直接缓存,用全局变量代替局部变量,避免下次需要再次infllate
- 如listView提供的item缓存,adapter里的getView中convertView的优化写法,如图:
四、其他点
1.用SurfaceView或TextureView代替普通View
SurfaceView或TextureView可以通过将绘图操作移动到另一个单独线程上提高性能。它们的绘图操作发生在UI线程之外的另一个线程上。但SurfaceView在常规视图系统之外,所以无法像常规视图那样移动、缩放或旋转。TextureView除了与SurfaceView一样在单独线程绘制外,还可以像常规视图一样被改变。
2.使用RenderJavaScript
这是一种在3.0时引进的用来在Android上写高性能代码的语言,语法基于C语言的C99标准,他的结构是独立的,所以不需要为不同的CPU或GPU定制代码。
3.使用OpenGL绘图
Android支持使用OpenGL API的高性能绘图,是Android可用的最高级别的绘图机制。
4.尽量为所有分辨率创建资源
减少不必要的硬件缩放,这回降低UI的绘制速度。