Android学习笔记:布局属性 layout_weight 解析

说到屏幕适配,最好的方式就是将组件按屏幕比例显示。Android中有一个weight属性,用它来控制组件占用比例非常方便。


weight在使用时都需要注意什么呢?刚开始接触weight属性时,它有时不会按照我们的预期分配组件占据空间的比例。这是对weight属性了解不够导致的,weight属性非常重要,理解后才能充分利用。


一、定义测试布局

使用LinearLayout布局,去掉边缘留白,并添加三个水平的Text组件。设置颜色背景。方便查看。




    

    

    



二、开始测试

1、将三个TextView的layout_width属性设置wrap_content。删除weight所在的代码。

Android学习笔记:布局属性 layout_weight 解析_第1张图片

结果:三个组件都按照自己的内容来分配空间。


2、将三个TextView的layout_width属性设置0dp。height属性设置50dp。把刚刚删除的weight属性代码添加回来。

Android学习笔记:布局属性 layout_weight 解析_第2张图片

结果:三个组件都可以按照weight属性的1:1:1来占据空间。但是A组件的显示方式并不符合预期,因为它向下走了一段距离。

但是仔细观察,组件内的第一行文本是对齐的。

Android学习笔记:布局属性 layout_weight 解析_第3张图片

这是因为,TextView默认会参考父类LinearLayout的baseLine(基线)来对齐。可以采用以下方式避免此问题。

在LinearLayout的属性设置中加入android:baselineAligned="false"属性。即

然后运行程序,结果如预期显示组件。

Android学习笔记:布局属性 layout_weight 解析_第4张图片


3、设置weight属性分别为1、2、3。

Android学习笔记:布局属性 layout_weight 解析_第5张图片

结果:如预期一样,组件以1:2:3的比例填充空间。


4、设置A组件的width属性为wrap_content。

Android学习笔记:布局属性 layout_weight 解析_第6张图片

结果:A组件明显长度过大,比例不再是1:2:3。

原因:LinearLayout中的layout_weight属性在分配比例时会经过两步。

第一步,将控件按声明的尺寸进行分配。

第二步,将剩下的空间按weight属性的值进行比例分配。

即组件所占空间的计算:所占宽度 = 组件声明宽度 + (父控件宽度 - 组件声明宽度)* 组件所占比例(weight属性定义)


5、进一步验证上一条所示的结论是否正确。设置三个组件的width属性为match_parent,weight分别为1、2、2。

Android学习笔记:布局属性 layout_weight 解析_第7张图片

结果:组件并没有按照1:2:2的比例显示组件。

验证:设屏幕宽度为1080,则三个组件的声明宽度都是1080,则剩余尺寸:1080 - 1080*3 = - 1080*2

A组件宽度 = 1080 + (- 1080 * 2)*(1 / 5)= 1080 * (3 / 5);

B、C组件宽度 = 1080 + (- 1080*2)* (2 / 5)= 1080 * (1 / 5);

即A组件占据3/5的空间,B、C组件各占据1/5的空间。


结论:

1、width声明组件宽度,weight功能是设置剩余空间的分配比例

2、组件所占空间的计算:所占宽度 = 组件声明宽度 + (父控件宽度 - 组件声明宽度)* 组件所占比例(weight属性定义)

3、weight属性在垂直的LinearLayout布局中是设置剩余空间的高度比。

4、最重要的一点:weight只适用于LinearLayout布局

5、开发中若设置weight属性,最好将width属性设为0dp,这可以提升程序的运行性能。




总结参考:慕课网,human老师的《Android面试解密 - layout_weight》,并做了一些补充说明。

你可能感兴趣的:(Android)