在我们开发APP时不仅要在代码实现上,做到对App的优化,而在我们的界面布局也有许多要优化的地方,如果布局写的很low的话,系统加载布局的速度会十分的慢,使得用户的体验非常的不好,这篇文章主要是从我平时对布局的优化方面总结一下,我认为经常可以用到的布局优化方面的一些技巧和手段。
1.减少布局的嵌套,这一点也是最重要的
搞android的都知道,android的整个UI布局文件最后也是要一层一层的解析成View对象的,如果层次太深的话,对导致递归的层次太深而极大的影响解析速度,所以,我们一定不能让布局文件的层次太深,要想做到布局文件的层次不深,通常用到的手段有:1)使用RelativeLayout代替LinearLayout。2)编写完布局文件时,可以使用HieracyView工具检查是否有多余的无用布局,如果有,则一定要去掉无用的布局。
2.布局重用。
一些可以公用的布局我们不必要每次都重写一遍,可以将其写为一个独立的布局文件,最后使用include标签将布局引用即可,然而,严格上来讲,布局重用只是减少了我们代码的编写量,并不能达到对应用的优化作用,而且,在使用include时会很容易产生第一点中的无用父布局,如下图:
如何去除使用include代来的负作用,下面会有方案。
3.使用merge标签去消除include标签所引入的无用布局
使用merge时要注意,merge标签只能是根布局,结合2,3两点看一个示例用法:
首先,创建一个merge标签的根布局,代码如下:
?xml version="1.0" encoding="utf-8"?> <merge xmlns:android="http://schemas.android.com/apk/res/android"> <Button android:id="@+id/ok" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:text="OK" /> <Button android:id="@+id/cancel" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_marginRight="20dp" android:layout_marginTop="10dp" android:text="Cancel" /> </merge>接着,使用include引入布局:
<include layout="@layout/ok_cancel_layout"/>
4.利用 ViewStub延迟加载一些用不到的布局,在一些场合取代android:visibility="gone"的用法,因为被gone掉的布局不断是会同时创建对象的。那为什么使用ViewStub就高效呢,拿源码来说话,先看一下ViewStub源码:
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(0, 0); }<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
<p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Monaco; color: rgb(119, 119, 119);"><span style="color: rgb(0, 0, 0);"> </span>@Override</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Monaco;"> <span style="color: #931a68">public</span> <span style="color: #931a68">void</span> draw(Canvas <span style="color: #7e504f">canvas</span>) {</p><p style="margin-top: 0px; margin-bottom: 0px; font-size: 11px; font-family: Monaco;"> }</p>
由onMeasure()方法和draw()方法可以看出, ViewStub的初始宽高都是零,所以他开始不会占用空间,其次draw()方法也没有执行任何的绘制,由这两个方法就可以看出,ViewStub的确很高效。
在代码中要操纵ViewStub的时候,要首先使用viewstub.inflate()方法,将其所拥有的View初始化进去。否则会报空指针错误。
5.减少不同层间的背景重绘,例如,如果某个view父布局的背景已经设置为了白色,则不需要再为此view设置背景色,通过这个简单的小技巧,可以非常多的提升速度。
6.如果整个App都使用了自定义的Title和background,则我们可以使用自定义的style,永久的去掉系统默认为我们的Activity所添加的title和background,也可以提高Activity的渲染速度。
原文地址:http://blog.csdn.net/lcq5211314123/article/details/46664923