搞明白android中layout_weight的用法

本文是学习这篇博客所得的收获:
Android:Layout_weight的深刻理解

当子控件有layout_weight属性时, 系统将先按照layout_widthlayout_hight属性
先把子控件放到父控件中, 之后才解析layout_weight属性, 然后计算父控件中的剩余空间,
最后按比例分配剩余空间给子控件.

看一下处理layout_weight时所用到的公式:

1
2
3
4
5
6
7
8
9
# 实际尺寸: 子控件最终展示出来的尺寸
# 当前尺寸: 子控件刚被放到布局中, 系统还没有解析其weight属性时的尺寸
# weight比例: 子控件在所有有`layout_weight`属性的控件中所占的比例
# (例: 三个子控件, 第一个比重为1, 第二个为2, 第三个为2,
# 那么第一个所占比例为1/5, 第二个为2/5, 第三个为2/5)
# 剩余空间: 子控件刚被放到父控件中, 系统还没有解析其weight属性时父控件还有多少剩余空间

剩余空间 = 父控件尺寸 - 子控件1尺寸 - 子控件2尺寸 - 子控件3尺寸...
实际尺寸 = 当前尺寸 + weight比例 * 剩余空间尺寸

当控件的layout_width以及layout_hight的值为0或者wrap_content时,
layout_weight属性很容易预测最终效果, 它们会按照自己的weight比例
分配剩余空间尺寸.

需要留意的是当控件的layout_widthlayout_hight的值为fill_parent的时候,
此时每个子控件在刚被放到父控件中, 且系统还没有解析子控件的layout_weight时,
父控件就已经没有剩余空间了,

因为此时所有子控件的当前尺寸都等于父控件的尺寸, 且第一个子控件就已经占满了父控件!

那么套用上述公式, 计算子控件最终实际尺寸的过程如下:

下面假设一个父控件中有三个子控件, 其比重为1 : 2 : 3,
则子控件的weight比例依次为1/6, 2/6, 3/6

剩余空间的计算如下:

1
2
3
4
5
剩余空间 = 父控件尺寸 - 子控件1当前尺寸 - 子控件2当前尺寸 - 子控件3当前尺寸
# 上述等同于:
剩余空间 = 父控件尺寸 - 父控件尺寸 - 父控件尺寸 - 父控件尺寸
# 则(注意是负2):
剩余空间 = -2 * 父控件尺寸

子控件最终实际尺寸的计算如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
实际尺寸 = 当前尺寸 + weight比例 * 剩余空间尺寸
# 子控件1:
实际尺寸 = 父控件尺寸 + 1/6 * (-2 * 父控件尺寸)
= 父控件尺寸 - 2/6 * 父控件尺寸
= 4/6 * 父控件尺寸
= 2/3 * 父控件尺寸

# 子控件2:
实际尺寸 = 父控件尺寸 + 2/6 * (-2 * 父控件尺寸)
= 父控件尺寸 - 4/6 * 父控件尺寸
= 2/6 * 父控件尺寸
= 1/3 * 父控件尺寸

# 子控件3:
实际尺寸 = 父控件尺寸 + 3/6 * (-2 * 父控件尺寸)
= 父控件尺寸 - 6/6 * 父控件尺寸
= 父控件尺寸 - 父控件尺寸
= 0

所以此时子控件3将会消失, 不会显示在屏幕上.