透析Android 中 权重使用及分配规则(layout_weight)

(转载注明:http://blog.csdn.net/itermeng/article/details/52159997:) 看到好多大牛博客开头都有这个,我也来写一个,嘿嘿


平常我们在使用线性布局LinearLayout的时候,会用到权重layout_weight,将控件的宽度(或高度)设为0,再设置它的权重即可,控件呈现呈现出的大小与权重比例相吻合。方法简单,自是没有什么好说的,可是你们有想过将控件的宽和高全部设置,再去设置权重,这个呈现出的比例是怎样?权重的分配规则又是如何? 下面通过几个例子来了解一下:


权重(layout_weight):即为当前线性布局指定方向(水平、竖直)上剩余空间的一个分配规则。

(注:以下事例皆为水平方向上剩余空间分析,手机模拟器分辨率为480*320)


一. 案例一


1. 布局:

<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>


2. 当前布局显示效果:
这里写图片描述


3. 权重分配分析:
以上这个例子是我们平时用的最多的情况,由图可见,黑色部分占用屏幕的四分之三,绿色部分占屏幕的四分之一

【计算方式】:【最后控件的宽度 = 控件本身宽度 + 权重比例分配宽度 】

当前屏幕横屏宽度:320dp
第一个子控件未分配权重前所占宽度:0dp 
第二个子控件未分配权重前所占宽度:0dp 
当前屏幕剩余空间总数:320dp-0dp-0dp = 320dp  将当前320dp按权重分配给两个子控件,子控件一分配到四分之三,子控件二分配到四分之一

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

二. 案例二


1. 布局:

<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>


2. 当前布局显示效果:
这里写图片描述


3. 权重分配分析:
到这里,明显就出来了,不同于案例一,我将这里两个控件都设置了宽度同时使用了权重,你如果还以为是黑色占四分之三,那就错了,权重分配的规则也显现出来了。在分配宽度时,不仅会考虑你设置的权重比例,还会考虑你设置的控件宽度首要考虑)!

【计算方式】:【最后控件的宽度 = 控件本身宽度 + 权重比例分配宽度 】

当前屏幕横屏宽度:320dp
第一个子控件未分配权重前所占宽度:60dp 
第二个子控件未分配权重前所占宽度:60dp 
当前屏幕剩余空间总数:320dp-60dp-60dp = 200dp,将当前200dp按权重分配给两个子控件,子控件一分配到四分之三,子控件二分配到四分之一

第一个子控件分配权重后宽度:60dp+((320dp-60dp-60dp)*3)/4 = 210dp
第二个子控件分配权重后宽度:60dp+(320dp-60dp-60dp)/4 = 110dp

三. 案例三


1. 布局:

<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>


2. 当前布局显示效果:
这里写图片描述


3. 权重分配分析:
看完案例二,你也许会恍然大悟,当我们同时设置了控件宽度和权重,屏幕分配比例时会先减去所有控件设置的宽度,再来按照权重分配剩下空间比例。总共两个步骤,但是你有想过如果控件宽度设置过大,步骤一中屏幕宽度减去所有控件宽度后为负值,怎么办?
答案是即使为负值,将步骤一计算后的负值(即剩下的空间),照样继续按照步骤二将负值按照权重分配!所以这也是为什么黑色权重值虽然为3,所占比例却少于绿色了。

【计算方式】:【最后控件的宽度 = 控件本身宽度 + 权重比例分配宽度 】

当前屏幕横屏宽度:320dp
第一个子控件未分配权重前所占宽度:260dp 
第二个子控件未分配权重前所占宽度:260dp 
当前屏幕剩余空间总数:320dp-260dp-260dp = -200dp,将当前-200dp按权重分配给两个子控件,子控件一分配到四分之三,子控件二分配到四分之一

第一个子控件分配权重后宽度:260dp+((320dp-260dp-260dp)*3)/4 = 110dp
第二个子控件分配权重后宽度:260dp+(320dp-260dp-260dp)/4 = 210dp

四. 案例四


1. 布局:

<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="match_parent"
        android:layout_height="120dp"
        android:layout_weight="3"
        android:background="@android:color/black"/>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="120dp"
        android:layout_weight="1"
        android:background="@android:color/holo_green_dark"/>
</LinearLayout>


2. 当前布局显示效果:
这里写图片描述


3. 权重分配分析:
其实看过案例三之后,相信大家已经对这个分配规则了解的差不多了,最后讲一个极端的情况:将控件的宽度设置成填充父窗体match_parent同时设置权重比例,呈现会如何?
通过案例三我们已经清楚分配的两个步骤,还是一样。第一步先计算剩余空间值,第二步用权重比例分配剩余空间值。,填充父窗体代表宽度为父窗体宽度,之后按照步骤计算。

【计算方式】:【最后控件的宽度 = 控件本身宽度 + 权重比例分配宽度 】

当前屏幕横屏宽度:320dp
第一个子控件未分配权重前所占宽度:fill_parent 即为充满横屏(320dp)
第二个子控件未分配权重前所占宽度:fill_parent 即为充满横屏(320dp)
当前屏幕剩余空间总数:320dp-320dp-320dp = -320dp,将当前-320dp按权重分配给两个子控件,子控件一分配到四分之三,子控件二分配到四分之一

第一个子控件分配权重后宽度:320dp+((320dp-320dp-320dp)*3)/4 = 80dp
第二个子控件分配权重后宽度:320dp+(320dp-320dp-320dp)/4 = 240dp


总结:

1. 分配规则


【最后控件的宽度 = 控件本身宽度 + 权重比例分配宽度 】

2. 计算步骤


第一步 【计算剩余空间值】:将屏幕宽度(或高度)减去该水平(或竖直)排列之间所有控件的宽度(或高度),得出剩余空间值。

第二步 【权重比例分配剩余空间值】:根据你所设置的权重值,按照比例分配给控件(剩余空间值为负数也照样分配)。


3. 套用公式

例:如水平方向上的线性布局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)

4. 推断


情况一:当L中内部子控件(A,B)的宽度之和大于L的总宽度时,即(width_l-width_a-width_b)<0时,weight_a/(weight_a+weight_b)比例的值越大,当前控件所占空间越小。


情况二:当L中内部子控件(A,B)的宽度之和小于L的总宽度时,即(width_l-width_a-width_b)>0时,weight_a/(weight_a+weight_b)比例的值越大,当前控件所占空间越大。

虽然大家一般都是通用案例一那种分配,但是真真切切的了解一个属性、一个控件,收获还是满满的。希望对你们有帮助 :)

(上述内容因视频学习而个人记录)

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值