android:layout_weight属性分析
2015-03-23 21:41
330 查看
LinearLayout支持对其子View设置layout_weight属性,用来给子View分配自身剩余布局空间。此属性的类型为浮点型,默认值为0。
对于布局剩余空间,结合下面一个简单的例子来进行说明。
以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测量过程,从而提高布局性能。
对于布局剩余空间,结合下面一个简单的例子来进行说明。
<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测量过程,从而提高布局性能。
相关文章推荐
- android中layout_weight属性分析
- 对android LinearLayout中layout_weight属性使用初探
- 对android的layout_weight属性的理解
- layout_weight 属性分析
- 关于Android UI组件LinearLayout属性layout_weight与layout_width/height的问题
- android:layout_weight属性详解
- Android中 android:layout_weight 属性
- android中如何在代码中直接设置View的layout_weight属性
- Android源码分析之WindowManager.LayoutParams属性更新过程
- [转载]对android LinearLayout中layout_weight属性使用初探
- android中如何在代码中直接设置View的layout_weight属性
- Android中 android:layout_weight 属性 完美解释
- android layout_weight 属性
- Android的layout_weight属性释疑(全面讲解)
- Android视图控件属性layout_weight的作用
- Android中关于android:layout_weight的分析与巧妙应用一
- 关于android:layout_weight属性使用注意事项
- Android手机开发:android:layout_weight属性的使用
- 对android LinearLayout中layout_weight属性使用
- android:layout_weight属性的使用