android:layout_weight属性分析

     LinearLayout支持对其子View设置layout_weight属性,用来给子View分配自身剩余布局空间。此属性的类型为浮点型,默认值为0。
     对于布局剩余空间,结合下面一个简单的例子来进行说明。
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    tools:context=".MainActivity">
 
    <View
        android:id="@+id/view_red"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:background="#FF0000"/>
 
    <View
        android:id="@+id/view_green"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:background="#00FF00"/>
 
    <View
        android:id="@+id/view_blue"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:background="#0000FF"/>
 
</LinearLayout>
     以nexus5为例,屏幕横向显示宽度为360dp,三个view宽度均为100dp,因此剩余宽度为60dp。考虑如下四种情况:
  • 三个view均为默认值0。剩余空间不进行分配
  • 红色view设置为1。此时红色view会占据所有的剩余空间,即最终红色view的宽度为160dp
  • 红色view设置为1,绿色view设置为2。红色和绿色view会按照1:2占据剩余空间,因此红色view宽度为120dp,绿色view宽度为140dp
  • 三个view均设置为1。三个view按照1:1:1占据剩余空间,因此宽度均为100dp + 20dp = 120dp。
     这四种情况的显示效果如下图:

     从上面的分析可以看出,layout_weight属性是指子view占据剩余布局空间的“权重”。其本质是LinearLayout将其指定方向上的剩余布局空间,按照子view所设置的权重值进行再分配。对此有了充分的理解之后,分析一个比较极端的情况,将上面例子中所有view的layout_width更改为160dp,剩余空间为360dp - 160dp*3 = -120dp,依然考虑与上例一样的四种情况:
  • 三个view均为默认值0。剩余空间不进行分配,蓝色view由于宽度限制只显示了40dp
  • 红色view设置为1。此时红色view会占据所有的剩余空间,即最终红色view的宽度为160dp + (-120dp) = 40dp,绿色和蓝色view均为160dp
  • 红色view设置为1,绿色view设置为2。红色和绿色view会按照1:2占据剩余空间,因此红色view宽度为120dp,绿色view宽度为80dp,蓝色view正好显示完全160dp
  • 三个view均设置为1。三个view按照1:1:1占据剩余空间,因此宽度均为160dp - 40dp = 120dp。
     这四种情况的显示效果如下图:

     注意,当layout_width或layout_height设置为"wrap_content"时,会先计算出对应的宽度或高度值,然后再进行layout_weight的计算过程。因此,当需要按比例占据LinearLayout全部布局空间时,将相应的高度或宽度值设置为"0dp"可以减少view测量过程,从而提高布局性能。






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值