android:layout_weight属性分析

来源:互联网 发布:而知也无涯成语 编辑:程序博客网 时间:2024/04/28 05:47
     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测量过程,从而提高布局性能。






0 0
原创粉丝点击