一、概念
是当前节点宽高的上下界(最大值和最小值)。在 Layout 阶段,当父节点测量子节点的时候会把 Contraints 往下传递,好让子元素知道自己被允许的最大最小尺寸,当所有子元素被测量完成后开始决定自身尺寸时,同样的需要考虑自身的父容器给出的约束。
1.1 类型
对宽高可以分别设置不同类型的约束。
有界的 | 一个区间,即包含最大值和最小值。 |
无界的 | 没有约束,即0到无限大。 |
固定的 | 一个确切值,即最大值最小值相等。 |
二、Modifier 对 Contraints 的影响
.size() | 在遵守约束的前提下往传入值靠拢。值在区间就是该值,低于最小值就是最小值,超过最大值就是最大值。 |
.requiredSize() | 就是要忽略约束使用自己的值。例如调用 .size(100dp) 后约束为 weight[100-100dp]、height[100-100dp],再调用 .requiredSize(50dp) 后约束为 weight[50-50dp]、height[50-50dp]。 |
.width()、.height() | 相比用 size 同时设置宽高,单独设置宽或高不影响对方。 |
.sizeIn() | 能更细粒度的控制约束。 .sizeIn( minWidth = 100dp, maxWidth = 200dp, minHeight = 10dp, maxHeight = 20dp ) |
.wrapContentSize() | 会把宽高约束的最小值重置为0。 |
.fillMaxSize() | 会把宽高约束变为最大值。 |
2.1 单次调用
父容器传入的 Contraints 为 weight[100-300dp]、height[100-200dp] | |
在约束范围内 | 调用 Modifier.size(150dp),约束变成 weight[150-150dp]、height[150-150dp] 继续向下传递,此时该节点显示一个 150*150 的矩形。 |
小于约束范围 | 调用 Modifier.size(50dp),约束变成 weight[100-100dp]、height[100-100dp] 继续向下传递,该节点显示一个 100*100 的矩形。 |
大于约束范围 | 调用 Modifier.size(400dp),约束变成 weight[300-300dp]、height[200-200dp] 继续向下传递,该节点显示一个 300*200 的矩形。 |
2.2 多次调用
上方距离其实也解释了链式调用 .size() 为什么只有第一个生效,因为第一个已经把约束变为最大值和最小值相等的固定值,这样第二个无论传值更大或更小,都会因为遵循 Contraints 的工作原理而无法再次改变。