Android之权重

什么是权重(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>
当前布局效果如图1-1所示。
图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>
当前布局效果如图1-2所示。
图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>
当前布局效果如图1-3所示。
图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>
当前布局效果如图1-4所示。
图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/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值