关于layout_weight,你到底知多少

  • 什么是 layout_weight

layout_weight 是Android线性布局中的权重表示方式,一定程度上用来表示子布局所占父布局的比重。

若C-child表示子布局声明的大小,B-blank表示剩余布局的大小,P-percent表示子布局占据父布局剩余布局的比例,则子布局最终的实际大小R-reality为:

R = C + B * P

通过以上公式,下面的布局依然成立:
left所占宽度:R = 0 + B * (1/2) = (1/2) * B



    

    


layout_weight
  • weightSum

LinearLayout有个权重数量的标记:weightSum,以上布局中两个TextView分别声明了自己的权重,在LinearLayout没有声明 weightSum 时,默认的权重数量就是子布局权重之和:2。

如果将以上布局的Linearlayou权重之和声明为4:



    

    


则子布局的显示如下:

每个TextView占据1/4
  • 0dp 与 wrap_content

谷歌官方建议子布局的layout_width使用0dp,来分比例显示布局,和wrap_content大同小异,当使用layout_weight时,都表示占据剩余宽度或高度的比重。

但两者有明显区别。

使用0dp时,要考虑所分配的布局宽度是否小于控件实际宽度,比如:



    

    


关于layout_weight,你到底知多少_第1张图片
left布局变窄了

而使用wrap_content不必考虑这样的问题:



    

    


left适应自身布局后再获取剩余布局的1/20
  • wrap_content 与 match_parent

当子布局的高宽声明为match_parent时,所显示的效果与wrap_content 截然相反。



    

    


left和right所声明的layout_weight与实际显示截然相反

究其原因,都是match_parent在捣鬼。

来看下文章开始时的公式:
R = C + B * P

以left控件为例,此时的B(剩余布局) = 父布局大小 - 子控件大小之和,父布局大小也就是C(因为声明的是match_parent),而子控件大小之和是2C,所以 :

B = C - 2C = -C ,
R = C + B * P = C + (-C) * (1/3) = (2/3) * C

其实,以上公式恒成立,关键在于,当子控件的高宽声明为match_parent时的剩余布局大小要搞清楚。剩余布局大小 = 父布局大小 - 子布局大小之和

你可能感兴趣的:(关于layout_weight,你到底知多少)