1、RelativeLayout,ConstrantLayout,LinearLayout的选择
尽量选用RelativeLayout,ConstrantLayout,LinearLayout,并发挥它们的特性使布局扁平化。同等扁平的情况下,选用LinearLayout性能更佳。
2、利用系统提供View的特殊属性
比如TextView的drawableStart属性等设置icon,就没有必要再增加一个ImageView。
3、用merge减少布局深度
include一个layout时,可以考虑使用merge标签,如果布局的最外层和它所在的父容器控件相同,那么使用merge可以减少一个嵌套层级。
4、用ViewStub高效占位符
当某个布局的显现需要条件时,比如断网,获取数据失败等显示的UI,可以考虑使用ViewStub。其本质是一个宽高为0的View,非常轻量级,当需要显示时再inflate或者visible=true才会加载其布局。
5、LinearLayout的divider属性
使用LinearLayout自带的divider属性实现分割线,而不是在布局中手动添加一个额外的View作为分割线。
6、Space控件
使用Space控件(而非View,LinearLayout等)进行合理的占位。其本质是一个onDraw实现为空的View,因此它只占位置,而不去渲染,使用它来进行占位填充比其它控件更加高效。
7、android:clipToPadding 和 android:paddingTop 的妙用:
//www.greatytc.com/p/621516fe25b3
8、去掉window的默认背景
当我们使用了Android自带的一些主题时,window会被默认添加一个纯色的背景,这个背景是被DecorView持有的。当我们的自定义布局时又添加了一张背景图或者设置背景色,那么DecorView的background此时对我们来说是无用的,但是它会产生一次Overdraw,带来绘制性能损耗。去掉window的背景可以在onCreate()中setContentView()之后调用getWindow().setBackgroundDrawable(null); 或者在theme中添加android:windowbackground="@null";
9、去掉其他不必要的背景
有时候为了方便会先给Layout设置一个整体的背景,再给子View设置背景,这里也会造成重叠,如果子View宽度mach_parent,可以看到完全覆盖了Layout的一部分,这里就可以通过分别设置背景来减少重绘。再比如如果采用的是selector的背景,将normal状态的color设置为“@android:color/transparent",也同样可以解决问题。这里只简单举两个例子,我们在开发过程中的一些习惯性思维定式会带来不经意的Overdraw,所以开发过程中我们为某个View或者ViewGroup设置背景的时候,先思考下是否真的有必要,或者思考下这个背景能不能分段设置在子View上,而不是图方便直接设置在根View上。
10、善用draw9patch
给ImageView加一个边框,你肯定遇到过这种需求,通常在ImageView后面设置一张背景图,露出边框便完美解决问题,此时这个ImageView,设置了两层drawable,底下一层仅仅是为了作为图片的边框而已。但是两层drawable的重叠区域去绘制了两次,导致overdraw。优化方案: 将背景drawable制作成draw9patch,并且将和前景重叠的部分设置为透明。由于Android的2D渲染器会优化draw9patch中的透明区域,从而优化了这次overdraw。 但是背景图片必须制作成draw9patch才行,因为Android 2D渲染器只对draw9patch有这个优化,否则,一张普通的Png,就算你把中间的部分设置成透明,也不会减少这次overdraw。
持续更新...