剖析Android 线性布局中的权重(layout_weight)

http://bbs.itcast.cn/thread-32205-1-1.html

什么是权重(layout_weight

通俗地讲,权重( layout_weight 就是对线性布局指定方向(水平或垂直)上剩余空间分配的一个规则。

案例分析
为了便于大家更好地理解权重(layout_weight ),接下来,通过几个案例来分析如何使用权重(layout_weight )对线性布局中水平方向的剩余空间进行分配。
注:以下案例中的测试手机分辨率为480*320,屏幕像素密度为mdpi,即1dp = 1px;

案例一
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:orientation="horizontal"
  6.     tools:context=".MainActivity" >
  7.    <!--内部控件水平排列-->
  8.    <TextView
  9.         android:layout_width="0dp"
  10.         android:layout_height="120dp"
  11.         android:layout_weight="3"
  12.         android:background="@android:color/black"/>
  13.     <TextView
  14.         android:layout_width="0dp"
  15.         android:layout_height="120dp"
  16.         android:layout_weight="1"
  17.         android:background="@android:color/holo_green_dark"/>
  18. </LinearLayout>
复制代码
        当前布局效果如图1-1所示。
 
                   图1-1           布局效果
          从图1-1可以看出,黑色部分的宽度是240像素,绿色部分的宽度是80像素,这两部分所占区域宽度的计算方式如下所示:
  1. 当前屏幕横屏宽度:320dp
  2. 第一个子控件未分配权重前所占宽度:0dp 
  3. 第二个子控件未分配权重前所占宽度:0dp 
  4. 当前屏幕剩余空间总数:320dp-0dp-0dp = 320dp,将当前320dp按权重分配给两个子控件,子控件一分配到四分之三,子控件二分配到四分之一

  5. 第一个子控件分配权重后宽度:0dp+((320dp-0dp-0dp)*3)/4 = 240dp
  6. 第二个子控件分配权重后宽度:0dp+(320dp-0dp-0dp)/4 = 80dp
复制代码

案例二
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:orientation="horizontal"
  6.     tools:context=".MainActivity" >
  7.    <TextView
  8.         android:layout_width="60dp"
  9.         android:layout_height="120dp"
  10.         android:layout_weight="3"
  11.         android:background="@android:color/black"/>
  12.     <TextView
  13.         android:layout_width="60dp"
  14.         android:layout_height="120dp"
  15.         android:layout_weight="1"
  16.         android:background="@android:color/holo_green_dark"/>
  17. </LinearLayout>
复制代码
          当前布局效果如图1-2所示。
 
图1-2  布局效果
         从图1-2可以看出,黑色部分的宽度是210像素,绿色部分的宽度是110像素,这两部分所占区域宽度的计算方式如下所示:
  1. 当前屏幕横屏宽度:320dp
  2. 第一个子控件未分配权重前所占宽度:60dp 
  3. 第二个子控件未分配权重前所占宽度:60dp 
  4. 当前屏幕剩余空间总数:320dp-60dp-60dp = 200dp,将当前200dp按权重分配给两个子控件,子控件一分配到四分之三,子控件二分配到四分之一

  5. 第一个子控件分配权重后宽度:60dp+((320dp-60dp-60dp)*3)/4 = 210dp
  6. 第二个子控件分配权重后宽度:60dp+(320dp-60dp-60dp)/4 = 110dp
复制代码
案例三
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:orientation="horizontal"
  6.     tools:context=".MainActivity" >
  7.    <TextView
  8.         android:layout_width="260dp"
  9.         android:layout_height="120dp"
  10.         android:layout_weight="3"
  11.         android:background="@android:color/black"/>
  12.     <TextView
  13.         android:layout_width="260dp"
  14.         android:layout_height="120dp"
  15.         android:layout_weight="1"
  16.         android:background="@android:color/holo_green_dark"/>
  17. </LinearLayout>
复制代码
        当前布局效果如图1-3所示。

图1-3           布局效果
         从图1-3可以看出,黑色部分的宽度是110像素,绿色部分的宽度是210像素,这两部分所占区域宽度的计算方式如下所示:
  1. 当前屏幕横屏宽度:320dp
  2. 第一个子控件未分配权重前所占宽度:260dp 
  3. 第二个子控件未分配权重前所占宽度:260dp 
  4. 当前屏幕剩余空间总数:320dp-260dp-260dp = -200dp,将当前-200dp按权重分配给两个子控件,子控件一分配到四分之三,子控件二分配到四分之一

  5. 第一个子控件分配权重后宽度:260dp+((320dp-260dp-260dp)*3)/4 = 110dp
  6. 第二个子控件分配权重后宽度:260dp+(320dp-260dp-260dp)/4 = 210dp
复制代码
案例四
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2.     xmlns:tools="http://schemas.android.com/tools"
  3.     android:layout_width="match_parent"
  4.     android:layout_height="match_parent"
  5.     android:orientation="horizontal"
  6.     tools:context=".MainActivity" >
  7.    <TextView
  8.         android:layout_width="fill_parent"
  9.         android:layout_height="120dp"
  10.         android:layout_weight="3"
  11.         android:background="@android:color/black"/>
  12.     <TextView
  13.         android:layout_width="fill_parent"
  14.         android:layout_height="120dp"
  15.         android:layout_weight="1"
  16.         android:background="@android:color/holo_green_dark"/>
  17. </LinearLayout>
复制代码
       当前布局效果如图1-4所示。
 
图1-4  布局效果
       从图1-4可以看出,黑色部分的宽度是80像素,绿色部分的宽度是240像素,这两部分所占区域宽度的计算方式如下所示:
  1. 当前屏幕横屏宽度:320dp
  2. 第一个子控件未分配权重前所占宽度:fill_parent 即为充满横屏
  3. 第二个子控件未分配权重前所占宽度:fill_parent 即为充满横屏 
  4. 当前屏幕剩余空间总数:320dp-320dp-320dp = -320dp,将当前-320dp按权重分配给两个子控件,子控件一分配到四分之三,子控件二分配到四分之一

  5. 第一个子控件分配权重后宽度:320dp+((320dp-320dp-320dp)*3)/4 = 80dp
  6. 第二个子控件分配权重后宽度:320dp+(320dp-320dp-320dp)/4 = 240dp
复制代码
案例总结
       从上述案例可以看出,如果对线性布局中的控件设置了权重(layout_weight),那么控件占用的空间大小是可以计算出来的,计算公式如下:
  1. 线性布局中子控件最终占用宽度 = 原有宽度+剩余空间分配量
复制代码
    例如, 在水平方向上的线性布局LinearLayout控件L中,包含两个水平占用空间的控件A,B 其中   
  1.           L控件:L控件宽度layout_width = width_l
  2.           A控件:A控件宽度layout_width = width_a   A控件权重layout_weight = weight_a
  3.           B控件:B控件宽度layout_width = width_b   B控件权重layout_weight = weight_b
复制代码
       L中子控件最终占用宽度 = 原有宽度(width_a)+剩余空间分配量
  1. A所占宽度 = width_a + (width_l-width_a-width_b)*weight_a/(weight_a+weight_b)
  2. 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)比例的值越大,当前控件所占空间越大。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值