04,Android屏幕适配(权重适配)
1,权重适配
【1】这是 LinearLayout 的特有属性:weight,意味权重
-
使用weigjt 适配。先占据的宽或高设置为0 。
-
weigjtSum 和weight 进行分配
-
android:weightSum="3" //表示总权重数
-
常规做法: 当布局有严格比例分配时, 可以使用权重来处理
2,权重适配的两种情况
【1】权重:自身的宽度+(总宽度-(所有控件宽度合))*占余空间的比例
-
使用match_parent
-
TextView1 L 1 2/3L= L + (L-(L+L))* 1/3 = 2/3L
-
TextView2 L 2 1/3L= L + (L-(L+L))* 2/3 = 1/3L
-
使0dp
-
TextView1 0dp 1 1/3L= 0dp + (L-(0+0))* 1/3 = 1/3L
-
TextView2 0dp 2 2/3L= 0dp + L-(0+0)* 2/3 = 2/3L
2,权重适配
这是 LinearLayout 的特有属性:weight,意味权重,我们可以让界面布局按照我们设定的比例来显示。比如,现在有个需求,要求界面上有两个控件,一个占屏幕宽的1/3,另一个占屏幕宽的2/3。
可以这样编写代码,如下:
文本1的weight=1,宽度为0dp
文本2的weight=2,宽度为0dp
而显示效果就是文本1的宽度占了1/(1+2),文本2的宽度占了1/(1+2),如上图所示,这样就很好的完成了需求。
但我希望你能明白权重的计算规则,权重的意思是控件的大小等于自身大小加上占剩余空间的比例。注意是剩余空间的比例,什么意思呢?
先看另外一种效果。
与之前相比,我只改了一个属性,就是把文本1和文本2这两个TextView的宽度改成了match_parent。
然而结果却变了个样,本该显示1/3的文本1却占了2/3,而文本2却变成了1/3。
再来看一下刚才那句话,什么叫剩余空间呢?
当前的LinearLayout的orientatioin为横向,两个TextView的weight分别是1和2。
先分析第一种情况,就是当宽度为0dp的时候。
假设说屏幕的宽度为L,现在该屏幕下有两个控件,两个控件的宽度为0,那剩余空间就等于L-(0+0)=L。
文本1的weight=1,那么它的宽度:
自身宽度 + 所占剩余空间的比例 = 真正的宽度
0 + L * 1/(1+2) = 1/3 L
同理,文本2的宽度为:
自身宽度 + 所占剩余空间的比例 = 真正的宽度
0 + L * 2/(1+2) = 2/3 L
因此当宽度设置为0dp的时候,显示效果就是1:2的关系。
再来讨论当宽度设置为match_parent的时候的情况,就是当控件的宽度为 L 的时候。
现在屏幕的宽度为L,现在这两个控件的宽度都为L,那剩余空间就等于L-(L+L) = -L。
文本1的weight=1,那么它的宽度:
自身宽度 + 所占剩余空间的比例 = 真正的宽度
L + -L * 1/(1+2) = 2/3 L
同理,文本2的宽度为:
自身宽度 + 所占剩余空间的比例 = 真正的宽度
L + -L * 2/(1+2) = 1/3 L
因此当宽度设置为0dp的时候,显示效果就是2:1的关系。
这就是权重的计算规则,很多人面试都遇到过。
这是横向的只测试了宽的权重,其实高也是一样,这里不做讲解,贴两张图,改动的地方我会标记出来,大家自己查看,有疑问请在评论区提问。
0dp的情况
match_parent的情况
注意:
权重只有LinearLayout才有,RelativeLayout没有这个属性,虽然 Google 推荐使用RelativeLayout而不是LinearLayout。
这里多提一句为什么Google推荐使用RelativeLayout而不是LinearLayout。
在 Android 中,系统对View进行测量、布局和绘制时,都是通过对 View树的遍历来进行操作的。如果一个View 树的高度太高,就会严重影响测量、布局和绘制的速度,因此我们如果不想被影响的话,第一个方法就是要降低View树的高度,Google也在其API文档中建议View树的高度不宜超过10层。
真实项目中,大部分的根布局几乎都是RelativeLayout,因为要实现相对位置的控制,所以比较方便一些。
而最初的时候创建一个 xml 布局,Google是用 LinearLayout 作为默认根布局的,而现在已经使用 RelativeLayout 作为 xml 文件默认的根布局了,原因就是希望通过扁平的 RelativeLayout 来降低通过 LinearLayout 嵌套所产生布局树的高度,从而提高 UI 渲染的效率。