浅析LinearLayout的weight属性

引言

LinearLayout作为常用的四大布局之一在开发过程中扮演着重要的角色,而weight属性则是线性布局中所特有的。


weight的使用

首先先说明下控件尺寸的计算公式(以宽度为例):

finalWidth=baseWidth+remianWidth*prop---------------(a)
其中:
    finalWidth:最终控件的宽度;
    baseWidth:xml中android:layout_width的值
    prop:该控件所占的比例

关于weight属性的使用,官方的建议是一致使用“0dp”,但在实际开发中或许会看到一些使用“wrap-content”和“march-content”的情况。
线上布局文件代码(其中XXX未明确,留着后面分析):

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <TextView
        android:layout_width="XXX"
        android:layout_height="wrap_content"
        android:layout_weight="2"/>

    <TextView
        android:layout_width="XXX"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>

    <TextView
        android:layout_width="XXX"
        android:layout_height="wrap_content"
        android:layout_weight="2"/>
</LinearLayout>

下面来计算下各个情况下的weight分配。
假设该LinearLayout的宽度为x

android:layout-width=”0dp”

按照公式(a),容易得到3个TextView的宽度分别为;

wid_tv01=0+(2/5)*x=2x/5;
wid_tv02=0+(1/5)*x=x/5;
wid_tv03=0+(2/5)*x=2x/5;
则对应的宽度分配为2:1:2。

效果图如下:

此时TextView中设置text属性也是不影响的, 因为baseWidth此时已经设置为0dp了。

android:layout-width=”march-content”

首先计算下剩余宽度remianWidth为:

remainWidth=width_01-width_02;-------------------------(b)
其中:
    width_01为实际的最大宽度,即x;
    width_02为理论的所需宽度,即3x(3个控件,每个控件一个x);

按照公式(b)可以计算现在的remianWidth=-2x。

按照公式(a),容易得到3个TextView的宽度分别为;

wid_tv01=x+(2/5)*(-2x)=x/5;
wid_tv02=x+(1/5)*(-2x)=3x/5;
wid_tv03=x+(2/5)*(-2x)=x/5;
则对应的宽度分配为1:3:1。

效果图如下:

同样的,现在在TextView中设置text也是没影响的。

android:layout-width=”wrap-content”

第一种未设置text属性,即baseWidth=0;情况同 android:layout_width=”0dp”。
第二种设置了text属性,此时的baseWidth则不为0,假设3个TextView的text宽度分别为均为270dp,LinearLayout的宽度x为360。(数据仅仅为了演示整倍数,无实际意义) 、

按照公式(b),计算得

remianWidth=360-3*270=-450;

按照公式(a),容易得到3个TextView的宽度分别为;

wid_tv01=270+(2/5)*(-450)=90;
wid_tv02=270+(1/5)*(-450)=180;
wid_tv03=270+(2/5)*(-450)=90;
则对应的宽度分配为1:2:1。

效果图如下:

小结

其实控件尺寸weight的分配,只要牢记公式(a)即可,只不过有时候在计算剩余宽度时需要留心下。当然最好还是都按照谷歌建议的统一设置为”0dp”最好。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值