什么是权重(layout_weight)
通俗地讲, 权重(layout_weight) 就是对线性布局指定方向(水平或垂直)上剩余空间分配的一个规则。案例分析
为了便于大家更好地理解权重(layout_weight),接下来,通过几个案例来分析如何使用权重(layout_weight)对线性布局中水平方向的剩余空间进行分配。注:以下案例中的测试手机分辨率为480*320,屏幕像素密度为mdpi,即1dp = 1px;
案例一
<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" >
<!--
内部控件水平排列
-->
<TextView
android:layout_width="0dp"
android:layout_height="120dp"
android:layout_weight="3"
android:background="@android:color/black"/>
<TextView
android:layout_width="0dp"
android:layout_height="120dp"
android:layout_weight="1"
android:background="@android:color/holo_green_dark"/>
</LinearLayout>
![](https://i-blog.csdnimg.cn/blog_migrate/ffd78c4f154eb7718a84b956dc45422c.png)
图1-1 布局效果
从图1-1可以看出,黑色部分的宽度是240像素,绿色部分的宽度是80像素,这两部分所占区域宽度的计算方式如下所示:
当前屏幕横屏宽度:
320dp
第一个子控件未分配权重前所占宽度:
0dp
第二个子控件未分配权重前所占宽度:
0dp
当前屏幕剩余空间总数:
320dp-0dp-0dp = 320dp
,将当前
320dp
按权重分配给两个子控件,子控件一分配到四分之三,子控件二分配到四分之一
第一个子控件分配权重后宽度:
0dp+
((
320dp-0dp-0dp
)
*3
)
/4 = 240dp
第二个子控件分配权重后宽度:
0dp+
(
320dp-0dp-0dp
)
/4 = 80dp
案例二
<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" >
<TextView
android:layout_width="60dp"
android:layout_height="120dp"
android:layout_weight="3"
android:background="@android:color/black"/>
<TextView
android:layout_width="60dp"
android:layout_height="120dp"
android:layout_weight="1"
android:background="@android:color/holo_green_dark"/>
</LinearLayout>
![](https://i-blog.csdnimg.cn/blog_migrate/473c3fab404e506d1ba3977d9d1f46b0.jpeg)
图1-2 布局效果
从图1-2可以看出,黑色部分的宽度是210像素,绿色部分的宽度是110像素,这两部分所占区域宽度的计算方式如下所示:
当前屏幕横屏宽度:
320dp
第一个子控件未分配权重前所占宽度:
60dp
第二个子控件未分配权重前所占宽度:
60dp
当前屏幕剩余空间总数:
320dp-60dp-60dp = 200dp
,将当前
200dp
按权重分配给两个子控件,子控件一分配到四分之三,子控件二分配到四分之一
第一个子控件分配权重后宽度:
60dp+
((
320dp-60dp-60dp
)
*3
)
/4 = 210dp
第二个子控件分配权重后宽度:
60dp+
(
320dp-60dp-60dp
)
/4 = 110dp
案例三
<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" >
<TextView
android:layout_width="260dp"
android:layout_height="120dp"
android:layout_weight="3"
android:background="@android:color/black"/>
<TextView
android:layout_width="260dp"
android:layout_height="120dp"
android:layout_weight="1"
android:background="@android:color/holo_green_dark"/>
</LinearLayout>
![](https://i-blog.csdnimg.cn/blog_migrate/1cdb8bc97be0056829a1fbc34cfa2cef.png)
图1-3 布局效果
从图1-3可以看出,黑色部分的宽度是110像素,绿色部分的宽度是210像素,这两部分所占区域宽度的计算方式如下所示:
当前屏幕横屏宽度:
320dp
第一个子控件未分配权重前所占宽度:
260dp
第二个子控件未分配权重前所占宽度:
260dp
当前屏幕剩余空间总数:
320dp-260dp-260dp = -200dp
,将当前
-200dp
按权重分配给两个子控件,子控件一分配到四分之三,子控件二分配到四分之一
第一个子控件分配权重后宽度:
260dp+
((
320dp-260dp-260dp
)
*3
)
/4 = 110dp
第二个子控件分配权重后宽度:
260dp+
(
320dp-260dp-260dp
)
/4 = 210dp
案例四
<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" >
<TextView
android:layout_width="fill_parent"
android:layout_height="120dp"
android:layout_weight="3"
android:background="@android:color/black"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="120dp"
android:layout_weight="1"
android:background="@android:color/holo_green_dark"/>
</LinearLayout>
![](https://i-blog.csdnimg.cn/blog_migrate/4f9f07e680cc994d3c1148d829b2efc1.png)
图1-4 布局效果
从图1-4可以看出,黑色部分的宽度是80像素,绿色部分的宽度是240像素,这两部分所占区域宽度的计算方式如下所示:
当前屏幕横屏宽度:
320dp
第一个子控件未分配权重前所占宽度:
fill_parent
即为充满横屏
第二个子控件未分配权重前所占宽度:
fill_parent
即为充满横屏
当前屏幕剩余空间总数:
320dp-320dp-320dp = -320dp
,将当前
-320dp
按权重分配给两个子控件,子控件一分配到四分之三,子控件二分配到四分之一
第一个子控件分配权重后宽度:
320dp+
((
320dp-320dp-320dp
)
*3
)
/4 = 80dp
第二个子控件分配权重后宽度:
320dp+
(
320dp-320dp-320dp
)
/4 = 240dp
案例总结
从上述案例可以看出
,
如果对线性布局中的控件设置了权重
(
layout_weight
),那么控件占用的空间大小是可以计算出来的,计算公式如下:
线性布局中子控件最终占用宽度
=
原有宽度
+
剩余空间分配量
例如,
在水平方向上的线性布局
LinearLayout
控件
L
中,包含两个水平占用空间的控件
A,B
,
其中
:
L
控件:
L
控件宽度
layout_width = width_l
A
控件:
A
控件宽度
layout_width = width_a A
控件权重
layout_weight = weight_a
B
控件:
B
控件宽度
layout_width = width_b B
控件权重
layout_weight = weight_b
L
中子控件最终占用宽度
=
原有宽度
(width_a)+
剩余空间分配量
A
所占宽度
= width_a + (width_l-width_a-width_b)*weight_a/(weight_a+weight_b)
B
所占宽度
= width_b + (width_l-width_a-width_b)*weight_b/(weight_a+weight_b)
由此
可以推断,当使用权
重
(
layout_weight
)时,会遇到下列两种情况:
情况
1
:当
L
中内部子控件
(A,B)
的宽度之和大于
L
的总宽度时,即
(width_l-width_a-width_b)<0
时,
weight_a/(weight_a+weight_b)
比例的值越大,当前控件所占空间越小。
情况
2
:当
L
中内部子控件
(A,B)
的宽度之和小于
L
的总宽度时,即
(width_l-width_a-width_b)>0
时,
weight_a/(weight_a+weight_b)
比例的值越大,当前控件所占空间越大。
本文版权归传智播客Android培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:传智播客Android培训学院
首发:http://www.itcast.cn/android/