Android布局优化

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使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值