在 Compose 中,您可以将多个修饰符链接在一起,以更改外观和 可组合项的风格这些修饰符链可能会影响传递的约束条件 可组合项,后者定义了宽度和高度边界。
本页介绍链接的修饰符如何影响约束条件,进而影响 可组合项的测量和放置。
界面树中的修饰符
要了解修饰符如何相互影响,最好先直观地了解 它们会显示在组合阶段生成的界面树中。对于 如需了解详情,请参阅组合部分。
在界面树中,您可以将修饰符可视化为布局的封装容器节点 节点:
向可组合项添加多个修饰符,即可创建一系列修饰符。时间
链接多个修饰符,每个修饰符节点都会封装链的其余部分
以及其中的布局节点。例如,如果您将 clip
和
size
修饰符,clip
修饰符节点会封装 size
修饰符节点,
然后,它会封装 Image
布局节点。
在布局阶段,遍历树的算法保持不变, 每个修饰符节点也会被访问。这样,修饰符可以更改 封装的修饰符或布局节点的要求及其放置位置。
如图 2 所示,Image
和 Text
可组合项的实现
本身由封装单个布局节点的一系列修饰符组成。通过
Row
和 Column
的实现只是用来描述
布置自己的孩子
总结:
- 修饰符会封装单个修饰符或布局节点。
- 布局节点可以布置多个子节点。
以下部分介绍如何使用此心智模式进行推理 修饰符链接及其对可组合项大小的影响。
布局阶段中的约束条件
布局阶段采用三步算法来查找每种布局 节点的宽度、高度以及 x、y 坐标:
- 测量子节点:节点会测量其子节点(如果有)。
- 确定自己的大小:节点根据这些测量值自行确定大小 。
- 放置子节点:每个子节点都是相对于节点自身的节点放置的 排名。
Constraints
有助于在前两个节点找到适合节点的大小
算法的步数。约束条件定义了
节点的宽度和高度。当节点确定其大小时,其测量到的大小
应处于此尺寸范围内
限制条件的类型
限制条件可以是以下项之一:
- 有边界:节点具有最大和最小宽度和高度。
- 无界限:节点不受任何大小的约束。最大宽度和 高度边界设置为无穷大。
- 完全匹配:要求节点遵循确切大小要求。最低 和最大边界设置为相同的值。
- 组合:节点遵循上述限制条件类型的组合。 例如,约束条件可以限制宽度, 无限制的最大高度,或设置精确宽度,但提供有界限高度。
下一部分将介绍如何将这些约束从父级传递到 子节点。
约束条件如何从父级传递到子级
执行算法的第一步(如布局中的约束条件中所述) 阶段,约束条件会从父级传递到子级 在界面树中。
当父节点测量其子节点时,会为每个节点提供这些约束条件 让他们知道自己的孩子可以多大或多小然后,当 并且会遵循由 有自己的父级。
概括来讲,该算法的运作方式如下:
- 界面树中的根节点是决定它实际占用的空间 测量其子项,并将相同的约束条件转发给其第一个子项。
- 如果子项是不影响测量的修饰符,则会转发 下一个修饰符的约束条件。约束条件会向下传递至修饰符 按原样传递链中的参数,除非达到会影响测量结果的修饰符。通过 然后相应地调整约束条件的大小
- 到达没有任何子节点的节点时(称为“叶” 节点”),它会根据传入的约束条件来确定其大小,以及 将此解析后的尺寸返回给其父项。
- 父级根据这个子级的测量结果调整其约束条件,并且 并使用这些调整后的约束调用其下一个子级。
- 测量完父节点的所有子节点后,父节点将决定 并将尺寸传递给它自己的父级。
- 这样,系统会优先遍历整个树。最后,所有节点 尺寸,至此衡量步骤就完成了。
如需查看深入的示例,请参阅约束和修饰符顺序 视频。
影响约束条件的修饰符
在上一部分中,您已了解某些修饰符会影响约束条件 。以下部分介绍了影响 限制条件。
size
修饰符
size
修饰符可声明内容的首选尺寸。
例如,以下界面树应呈现在 300dp
的容器中。
上传者:200dp
。约束条件是有边界的,允许宽度介于 100dp
和
300dp
,高度介于 100dp
和 200dp
之间:
size
修饰符会调整传入的约束条件,以匹配传递给它的值。
在此示例中,值为 150dp
:
如果宽度和高度小于最小约束边界,或者 大于最大约束边界,则修饰符会匹配传递的 同时仍然遵循已传递的限制条件, 位置:
请注意,链接多个 size
修饰符不起作用。前 size
修饰符将最小和最大约束条件设置为固定值。即使
第二个尺寸修饰符请求更小或更大的尺寸,它仍然需要
遵循传入的确切上下限,因此不会替换以下值:
requiredSize
修饰符
如果您需要requiredSize
size
节点覆盖传入的约束条件。requiredSize
修饰符将替换
传入约束条件,并将您指定的尺寸作为确切边界进行传递。
当大小传回树时,子节点将在 可用空间:
width
和 height
修饰符
size
修饰符可同时调整约束条件的宽度和高度。包含
width
修饰符,您可以设置固定宽度,但无需确定高度。
同样,借助 height
修饰符,您可以设置固定高度,但保留
未定宽度:
sizeIn
修饰符
借助 sizeIn
修饰符,您可以设置精确的最小和最大约束条件
指定宽度和高度如果您需要进行精细控制,请使用 sizeIn
修饰符
示例
本部分显示并解释了使用 修饰符。
Image( painterResource(R.drawable.hero), contentDescription = null, Modifier .fillMaxSize() .size(50.dp) )
此代码段生成以下输出:
fillMaxSize
修饰符会更改约束条件,以便同时设置 将最小宽度和高度设置为最大值 - 宽300dp
,200dp
高度。- 虽然
size
修饰符想要使用50dp
的大小,它仍然需要 以遵守传入的最小约束。因此,size
修饰符将 还会输出300
乘以200
的精确约束边界,实际上 并忽略size
修饰符中提供的值。 Image
遵循这些边界,报告大小为300
乘以200
, 一直传到树上。
Image( painterResource(R.drawable.hero), contentDescription = null, Modifier .fillMaxSize() .wrapContentSize() .size(50.dp) )
此代码段生成以下输出:
fillMaxSize
修饰符会调整约束条件,以同时设置最小值 将宽度和高度设置为最大值 - 宽度为300dp
,宽度为200dp
高度。wrapContentSize
修饰符会重置最小约束条件。因此,虽然fillMaxSize
导致了固定的限制条件,wrapContentSize
将其重置为原来的限制条件 有界限约束条件以下节点现在可以占用整个空间 也可以小于整个空间size
修饰符将约束条件设置为50
。Image
可解析为50
乘以50
的大小,以及size
修饰符 转发该网址。wrapContentSize
修饰符具有特殊属性。它需要 并将其放在可用最小边界的中心, 传递给它。因此,它与父级传递的大小等于 最小边界。
通过仅组合三个修饰符,您可以为可组合项定义尺寸,并 将它置于其父项的中心
Image( painterResource(R.drawable.hero), contentDescription = null, Modifier .clip(CircleShape) .padding(10.dp) .size(100.dp) )
此代码段生成以下输出:
clip
修饰符不会更改约束条件。padding
修饰符可降低最大约束条件。size
修饰符将所有约束条件设置为100dp
。Image
遵循这些限制并报告大小为100
100dp
。padding
修饰符会针对所有尺寸添加10dp
,因此它会增加 高度和宽度 x20dp
。- 现在,在绘制阶段,
clip
修饰符会按以下方式作用于120
的画布:120dp
。因此,它会创建该大小的圆形遮罩。 - 然后,
padding
修饰符会在所有尺寸上按10dp
嵌入其内容,因此 将画布大小降低到100
100dp
。 - 系统会在该画布中绘制
Image
。图片会根据120dp
的原始圆圈,因此输出是非舍入结果。