Android布局优化
为什么优化?
移动设备的内存和cpu的性能都收到了一定的限制,程序不可能无限地使用内存和cpu资源,
过多使用内存会导致程序内存溢出,即OOM。这是因为Android分配给每个应用程序的内存
空间大小是有限的。
布局优化的思路?
其实布局优化就是__减少布局文件的层级。__因为布局中的层级少了,那么Android绘制
时的工作量就少了,程序的性能就提高了。
如何优化?
1.删除布局中无用的控件和层级
2.选择使用性能较低的ViewGroup
比如__RelativeLayout__。如果布局中既可以使用LinearLayout也可以使用RelativeLayout
,那么就采用__LinearLayout__,因为RelativeLayout的布局绘画过程花费的时间更多。具体可以
参考这篇文章LineraLayout和RelativeLayout有详细的讲解
它们之间的差距。FrameLayout和LinearLayout一样都是简单高效的ViewGroup。
但是如果需要通过布局嵌套的方式来实现产品效果,那么建议采用RelativeLayout,毕竟布局嵌套
相当于增加了层级,会降低程序的性能。
3.采用merge标签和ViewStub
merge标签
由于merge是一个标签,并不是一个View,因此不能使用findViewById()方法来找该标签,使用
了merge标签的Layout在inflate的时候,遇到这个tag的时候,就会跳过,并自动合并两个层级,
以此来减少层级的嵌套。merge标签一般配合include标签使用。如何使用可以参考文章merge标签使用详解
ViewStub
ViewStub是一个不可见的,零大小的视图,可用于在运行时延迟扩展布局资源。当ViewStub可见时,
或者调用inflate()时,布局资源会被填充。然后,ViewStub会在其父级中使用填充的视图或视图替
换自身。因此,ViewStub存在于视图层次结构中,直到调用setVisibility(int)或inflate()。
使用ViewStub的布局参数将填充的视图添加到ViewStub的父级。同样,您可以使用ViewStub的
inflatedId属性来定义/覆盖inflate View的id。
<ViewStub android:id="@+id/stub"
android:inflatedId="@+id/subTree"
android:layout="@layout/mySubTree"
android:layout_width="120dip"
android:layout_height="40dip" />
可以使用id“stub”找到定义的ViewStub。在布局资源文件“mySubTree”填充之后,ViewStub将从其
父级中删除。通过填充的布局资源“mySubTree”创建的视图可以使用由inflatedId属性指定的
id“subTree”找到。最终为填充的视图指定宽度为120dip,高度为40dip。执行布局资源填充的首选
方法如下:
ViewStub stub = findViewById(R.id.stub);
View inflated = stub.inflate();
或者
findViewById(R.id.stub).setVisibility(View.VISIBLE);
总结来说,ViewStub的作用就是按需加载。当通过setVisibility或者inflate方法加载后,ViewStub
就会被它内部的布局替换掉,这时候ViewStub不再是整个布局结构中的一部分。此外,ViewStub不支持
merge标签。
ViewStub的使用可以参考这篇文章ViewStub使用