Android的weight、lanyout_weight属性

    官方正统的解释:LinearLayout也支持子元素的权重(layout_weight)。权重属性为子元素指定了一个“重要程度”,并允许子元素填充父元素的剩余空间(注意,所谓剩余空间,参看下面的示例)。权重值是一个整数,各个子元素根据权重值按比例分配父元素的剩余空间。默认的权重值为0,表示子元素仅占用适合于该子元素内容的空间。

    LinearLayout.weight表示元素额外空间的大小。如果无需拉伸,设置为0。

    示例:假设有元素abc,宽度分别为SaSbSc,layout_weight分别为WaWbWc;总宽度为S。则:被abc分配的剩余空间为Sr=S-Sa-Sb-Sc;分配给它们的额外空间分别为:Ea=Sr*Wa/(Wa+Wb+Wc)、Eb=Sr*Wb/(Wa+Wb+Wc)、Ec=Sr*Wc/(Wa+Wb+Wc);它们的最终大小分别为:Fa=Sa+EaFb=Sb+EbFc=Sc+Ec

    注意,即使Sr小于0,仍然会发生额外空间的分配!

    具体点,假设有三个按钮,宽度分别为102030,layout_weight分别为321;总宽度为150。则:被三个按钮分配的剩余空间为150-10-20-30=90;分配给它们的额外空间分别为:90*3/(3+2+1)=4590*2/(3+2+1)=3090*1/(3+2+1)=15;它们的最终大小分别为:10+45=5520+30=5030+15=45

    如果想让三个按钮最终大小比例为3:2:1,则应当设置原始宽度为0。

    网上有一些对权重的解释,不少都是错误的,下面对其中的某篇给出正确的解释(具体来源就不说了):

    布局文件如下:

<?xmlversion="1.0" encoding="utf-8"?>

<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"

   android:orientation="horizontal"

   android:layout_width="fill_parent" android:layout_height="fill_parent">

 

 <Buttonandroid:layout_width="fill_parent" android:layout_height="wrap_content"

     android:layout_weight="1" android:text="Button1" />

 

 <Buttonandroid:layout_width="fill_parent" android:layout_height="wrap_content"

     android:layout_weight="2" android:text="Button2" />

 

</LinearLayout>

    Button1的layout_weight=1,Buttong2的layout_weight=2,运行效果为:


   我们看到,Button1占了2/3,Button2占了1/3。如果此时把button2的weight设置成2000,不是说Button2就消失了,而是Button1的宽度几乎占满了屏幕宽度,而屏幕最后一丝细条则是留给Button2的,已近非常小了,没有显示出来。截图如下:

    得出结论:在layout_width设置为fill_parent的时候,layout_weight代表的是你的控件要优先尽可能的大,但尽可能大是有限度的,即fill_parent。

    ……

    当然,上面的结论是错误的。

    对于Button1和Button2,它们的layout_width都是fill_parent(顺便说一句,现在该值已被match_parent替代),也就是说,它们的原始宽度就是整个父容器的宽度(下面以屏幕替代)。在默认情况下,既然Button1占满了整个屏幕,Button2将不会被显示。但是,因为设置了Button1和Button2的layout_weight属性,且不会0,因此需要进行额外空间的计算。此时,额外空间是一个负值,大小恰好是整个屏幕的宽度。

   Sbutton1=屏幕宽度

   Sbutton2=屏幕宽度

   Sr=屏幕宽度-Sbutton1- Sbutton2=-屏幕宽度(注意负号)

    layout_weight_Button1=1

    layout_weight_Button2=2

   Ebutton1= Sr*1/(1+2)=负三分之一屏幕宽度

   Ebutton1= Sr*2/(1+2)=负三分之二屏幕宽度

    最终宽度:

    Fbutton1=Sbutton1+Ebutton1=屏幕宽度+负三分之一屏幕宽度=三分之二屏幕宽度

    Fbutton2=Sbutton2+Ebutton2=屏幕宽度+负三分之二屏幕宽度=三分之一屏幕宽度

    Fbutton1和Fbutton2的比例恰好是layout_weight属性值的反比,只是一个巧合。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值