LinearLayout和RelativeLayout属性和性能详解


一、前期基础知识储备

上,官方文档

 


 

 

由上面的官方文档,我们可以看出,两个布局方式的相同,都是继承自View.Group,是一种容器控件,LinearLayout的布局层次比较简单,方向和位置都比较容易控制,而相对布局RelativeLayout 对于其内子控件提供了更加丰富的布局层次和布局位置。

二、两者在属性上的异同点
共有属性:
java代码中通过btn1关联次控件
android:id="@+id/btn1"

控件宽度
控件高度
控件排布

控件间距
android:layout_marginLeft="5dip" //距离左边
android:paddingLeft="5dip"


控件显示位置
android:gravity="center" //left,right, top, bottom
android:gravity="center_horizontal"
android:gravity是本元素所有子元素的重力方向。
android:layout_gravity属性则设置控件本身相对于父控件的显示位置

TextView中文本字体

定义控件是否可见

定义背景图片
android:background="@drawable/img_bg" //img_bg为drawable下的一张图片

seekbar控件背景图片及最大值
android:progressDrawable="@drawable/seekbar_img" 
android:thumb="@drawable/thumb"     
android:max = "60"
android:layout_alignWithParentIfMissing="true"

仅仅在RelativeLayout中有效:
在父亲布局的相对位置
android:layout_alignParentLeft="true" //在布局左边

在某个控件的相对位置
android:layout_toRightOf="@id/button1" //在控件button1的右边,不仅仅是紧靠着

定义和某控件对齐
android:layout_alignTop=”@id/button1” //和控件button1上对齐

android:layout_centerHorizontal="true"   //水平居中

仅仅在LinearLayout中有效
设置控件在一排或一列中所占比例值
android:layout_weight="1"

注:android:gravity 和 android:layout_gravity 的区别

android:gravity 是设置该view里面的内容相对于该view的位置,例如设置button里面的text相对于view的靠左,居中等位置。(也可以在Layout布局属性中添加,设置Layout中组件的位置)。

android:layout_gravity 是用来设置该view相对与父view的位置,例如设置button在layout里面的相对位置:屏幕居中,水平居中等。

android:gravity用于设置View中内容相对于View组件的对齐方式,而android:layout_gravity用于设置View组件相对于Container的对齐方式。说的再直白点,就是android:gravity只对该控件内的东西有效,android:layout_gravity只对控件自身有效。

三、两者在性能上的对比

通过网上的很多实验结果我们得之,两者绘制同样的界面时layout和draw的过程时间消耗相差无几,关键在于measure过程RelativeLayout比LinearLayout了一些。我们知道ViewGroup是没有onMeasure方法的,这个方法是交给子类自己实现的。因为不同的ViewGroup子类布局都不一样,那么onMeasure索性就全部交给他们自己实现好了。

1) RelativeLayout慢于LinearLayout是因为它会让子View调用2次measure过程,而后者只需一次,但是有weight属性存在时,后者同样会进行两次measure。

2) RelativeLayout的子View如果高度RelativeLayout不同,会引发效率问题,可以使用padding代替margin以优化此问题。

3) 在不响应层级深度的情况下,使用Linearlayout而不是RelativeLayout。

据此,说明两个常见的,暂时没有引起注意的事情:

①作为顶级View的DecorView却是个垂直方向的LinearLayout,上面是标题栏,下面是内容栏,我们常用的setContentView()方法就是给内容栏设置布局。采用RelativeLayout并不会降低层级深度,因此这种情况下使用LinearLayout效率更高。

②为开发者默认新建RelativeLayout是希望开发者能采用尽量少的View层级,很多效果是需要多层LinearLayout的嵌套,这必然不如一层的RelativeLayout性能更好。因此我们应该尽量减少布局嵌套,减少层级结构,使用比如viewStub,include等技巧。可以进行较大的布局优化。


  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值