关于属性layout_weight及其与Measure过程的那些事

关于属性layout_weight及其与Measure过程的那些事

一、关于属性layout_weight

  layout_weight:值表示一旦View设置了该属性(假设有效的情况下),那么该View的宽度(高度)等于原有宽度(高度)加上剩余空间占比。要和wrap_content(推荐用0dp替代)、match_parent配合使用。

  1. 和wrap_content配合

  先按照内容的多少去设定空间大小,然后按照权重的比例分配剩余空间。
  需要注意的是,使用layout_weight分配的是剩余空间,而不是等效分割。举个例子,屏幕宽度为W,设置两个按钮的layout_width=wrap_content,那么按钮1宽度BW1,按钮2宽度BW2,若增加设置layout_height=1,那么按钮1最终宽度BW1+(W–BW1–BW2)/2;按钮2最终宽度BW2+(W-BW1-BW2)/2。
在这里插入图片描述

  和wrap_content配合的一个例子:在一个水平LinearLayout中有两个比重weight为1,width为wrap_content的按钮如下。
在这里插入图片描述

图1 初始布局

在这里插入图片描述

图2 最终布局
  前面也提到了,和wrap_content配合,会先按照内容大小设定空间,而后按照layout_weight比例分割剩余空间。正因为如此,**View的Measrure过程会进行两次测量**。   为了达到控件按layout_weight分割屏幕宽度,推荐使用0dp配合。**将layout_width或者layout_height设为0dp,将直接按照layout_weight权重的比例分配空间,且不会被内容撑大**。当然,这也需要经过两次测量。
  1. 和match_parent配合

  同match_parent配合的时候,剩余空间的分配会显得与实际想要的情况相反
  举个例子,设屏幕宽度为W,在两个view的宽度都为match_parent的情况下,原有宽度为W,两个的View的宽度都为W,那么剩余宽度为W-(W+W)=-W, 左边的View占比三分之一,所以总宽度是W+(-W)*1/3 = (2/3)W。用图来表示如下。
在这里插入图片描述

图3 初始布局

在这里插入图片描述

图4 最终布局

二、layout_height属性与View的Measure过程

  事实上默认的View的layout_weight这个值为0,根据对属性layout_weight的上述描述,在设定了这个值的情况下,与wrap_contet、match_parent以及0dp三者,无论是和哪个配合,View的测量过程都是先根据LayoutParams设定大小后根据layout_weight分配剩余空间
  因此一旦设置了这个值,那么所在View在绘制的时候就会执行两次Measure过程。

参考资料:android:layout_weight的真实含义

原创文章 78 获赞 25 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_38196407/article/details/105890680