
一、概念
是当前节点宽高的上下界(最大值和最小值)。在布局阶段,当父容器测量子元素的时候会提供约束条件 Contraints 好让子元素知道自己被允许的最大最小尺寸,当测量完计算出自身需要的尺寸后,需要综合父容器给出的约束条件,最终得出自身的实际尺寸。
| class Constraints {
} |
1.1 类型
对宽高可以分别设置不同类型的约束。
| 有边界 | 一个区间,即包含最大值和最小值。 |
| 无界限 | 没有约束,即0到无限大。 |
| 固定值(完全匹配) | 一个确切值,即最大值最小值相等。 |
二、Modifier 对 Contraints 的影响

自上而下测量:假设屏幕宽高是300*200,对于 fillMaxSize 这个 Modifier Node,填满剩余空间会将 Constraints 的 min 值设为最大值,接着 warpContentSize 让子节点自己决定,会将 min 值设为0,最后 size(50) 给出一个具体的约束,min 和 max 都设为 50。
| .size() .width() .height() | 在遵守约束的前提下往传入值靠拢。值在区间就是该值,低于最小值就是最小值,超过最大值就是最大值。 |
| .requiredSize() .requiredWidth() .requiredHeight() | 子元素的测量结果一定会在满足父元素约束下决定自身大小,例如 Modifier.width(300.dp).width(150.dp),最终宽度是300.dp,因为第一个约束为[300-300dp],第二个150.dp因为超出范围而被强制设为 min。使用 requiredSize() 会在约束传递过程中修改限制,就是要忽略父容器约束强制使用自己的值。例如约束为 weight[100-100dp],调用 .requiredWidth(50dp) 后约束为 weight[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 的工作原理而无法再次改变。
本文详细介绍了Android布局中Constraints的概念,探讨了Modifier如何影响尺寸约束,包括.size()、requiredSize()等方法的作用,以及单次和多次调用时约束的变化规则。
1621

被折叠的 条评论
为什么被折叠?



