(转载注明: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)比例的值越大,当前控件所占空间越大。
虽然大家一般都是通用案例一那种分配,但是真真切切的了解一个属性、一个控件,收获还是满满的。希望对你们有帮助 :)
(上述内容因视频学习而个人记录)