Compose 自定义 - 约束 Constrains

本文详细介绍了Android布局中Constraints的概念,探讨了Modifier如何影响尺寸约束,包括.size()、requiredSize()等方法的作用,以及单次和多次调用时约束的变化规则。

官方介绍 

一、概念

是当前节点宽高的上下界(最大值和最小值)。在布局阶段,当父容器测量子元素的时候会提供约束条件 Contraints 好让子元素知道自己被允许的最大最小尺寸,当测量完计算出自身需要的尺寸后,需要综合父容器给出的约束条件,最终得出自身的实际尺寸。

class Constraints {
    val minWidth: Int
    val maxWidth: Int
    val minHeight: Int
    val maxHeight: Int

}

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 的工作原理而无法再次改变。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值