LinearLayout,很常用的一种布局,当在使用这种布局方式时,为了达到较好的屏幕适配效果,可以选择使用android:layout_weight属性。当为布局中的每个组件指定了大小和权重之后,我们的android系统如何计算各组件实际所占空间呢?
贴个自己常用的计算方法:
实际大小=指定大小+(屏幕大小-(所有组件大小的和))*权重比例。
用一屏幕的大小减去所有组件大小的和,得到剩余大小,或理解为可分配空间,该值可为负。然后用我们给某个组件设定的值,加上其在剩余大小中按比例计算后的值,就是该组件最后的实际大小。
可用空间=屏幕大小-所有组件大小的和,
实际大小=指定大小+可用空间*权重比例,
所以最后为:
实际大小=指定大小+(屏幕大小-(所有组件大小的和))*权重比例。
示例:
以android:layout_width为例,验证计算方式(屏幕宽度:L)
在LinearLayout中放置三个按钮,分别为Button1,Button2,Button3,android:layout_height="wrap_content"均指定为包裹内容,每个Button的android:layout_weight分别为1,2,3。
依据android:layout_width属性的设置,分三种情况:
1. android:layout_width="0dp"时:
组件大小=0+(L-(0+0+0))*权重比例,组件大小和权重成正比。
各Button占的宽度:
Button1=0+(L-(0+0+0))*(1/6),为1/6L;
Button2=0+(L-(0+0+0))*(2/6),为2/6L;
Button3=0+(L-(0+0+0))*(3/6),为3/6L。
所以Button1:Button2:Button3 = 1:2:3。
2. android:layout_width="match_parent"时:
组件大小=L+(L-(L+L+L))*权重比例,组件大小和权重成反比。
如果前面组件已经占满屏幕,则剩余组件无法获得空间,不可见。
各Button占的宽度:
每个Button的layout_width指定为match_parent,即表示每个Button指定大小为父组件宽度,即L。
Button1=L+(L-(L+L+L))*(1/6),为4/6L;
Button2=L+(L-(L+L+L))*(2/6),为2/6L;
Button3=L+L(L-(L+L+L))*(3/6),为0。
所以Button1:Button2=2:1,Button3不可见。
3. android:layout_width="wrap_content"时:
组件大小=所需大小+(L-各组件所需大小和)*权重比例,剩余大小即(L-各组件所需大小和)为正,则为正比,否则为反比。
该情况和组件内容占用大小有关,所以布局上并不是很明显的比例关系,因为比例关系仅指剩余大小的比例:
剩余大小为正,即屏幕空间足够,所占空间和权重成正比。
剩余大小为负,即屏幕空间不足,所占空间和权重成反比,下面的图可能有点难看,希望想表达的意思到了。
LinearLayout的android:layout_weight属性用起来很简单,但是如果想深入理解其原理,就需要参考源代码了。