关于属性layout_weight及其与Measure过程的那些事
关于属性layout_weight及其与Measure过程的那些事
一、关于属性layout_weight
layout_weight:值表示一旦View设置了该属性(假设有效的情况下),那么该View的宽度(高度)等于原有宽度(高度)加上剩余空间占比。要和wrap_content(推荐用0dp替代)、match_parent配合使用。
- 和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的按钮如下。
- 和match_parent配合
同match_parent配合的时候,剩余空间的分配会显得与实际想要的情况相反。
举个例子,设屏幕宽度为W,在两个view的宽度都为match_parent的情况下,原有宽度为W,两个的View的宽度都为W,那么剩余宽度为W-(W+W)=-W, 左边的View占比三分之一,所以总宽度是W+(-W)*1/3 = (2/3)W。用图来表示如下。
二、layout_height属性与View的Measure过程
事实上默认的View的layout_weight这个值为0,根据对属性layout_weight的上述描述,在设定了这个值的情况下,与wrap_contet、match_parent以及0dp三者,无论是和哪个配合,View的测量过程都是先根据LayoutParams设定大小后根据layout_weight分配剩余空间。
因此一旦设置了这个值,那么所在View在绘制的时候就会执行两次Measure过程。