如何解决Jetpack Compose,Modifier.size() 使用移动比例锚点 解决方案TL;DR完整说明来自 Google 的 Adam Powell:
注意缩放锚点如何随着图像的增长而变化。
首先,根据父布局,锚点在左上角(应该是)
@Composable
inline fun Box(
modifier: Modifier = Modifier,contentAlignment: Alignment = Alignment.TopStart,content: @Composable BoxScope.() -> Unit
) {
然后当图像宽度等于父宽度时,锚点移动到中心顶部。 然后当图像高度大于父高度时,它再次移动到图像的中心。
这是我用来重现此代码的代码:https://github.com/feresr/ComposeBugMaybe/blob/master/app/src/main/java/com/feresr/composebug/MainActivity.kt
这是预期的行为吗?如果是这样,我该如何禁用它?我希望锚点最好固定在给定的点(左上角)。我觉得这种行为很奇怪,因为我没有以任何方式改变 Modifier.offset()
。
解决方法
解决方案TL;DR
在子节点上使用 Modifier.wrapContentSize(Alignment,true)
基本上是告诉它的父节点“我将忽略你的约束,并以这种对齐方式定位自己)”。
未能在孩子上使用 Modifier.wrapContentSize
只会居中(每当它违反父约束时 - 这是“撰写”默认行为)
无界参数确定这是否适用于最大约束。在这种情况下,它应该是正确的,因为鸭子在违反最大约束时会居中。
完整说明
(来自 Google 的 Adam Powell):
这与 Compose UI 的布局系统的工作方式有关。当一个 compose UI 元素被测量时,父元素给子元素一组约束 - 最小和最大宽度和高度。如果子级返回的尺寸与约束不兼容,则父级会看到子级的尺寸被限制为与约束兼容。
当父母放置行为不端的孩子时,孩子的实际位置相对于父母看到的钳位大小矩形居中
这有助于编写和安排具有硬性要求的 UI 元素,同时确定故障发生的位置;它还有助于将绝对大小的元素放置在较大的最小大小区域内的简单情况
Modifier.size
- 与 Modifier.preferredSize
相反 - 告诉一个元素忽略它所测量的约束并且无论如何都是给定的大小。
因此,如果您在只有 50dp 大的容器中使用 Modifier.size(100.dp)
,它会执行您的要求,但父元素会将该元素定位为只有 50dp
这就是你在这里看到的——鸭子比容器大,所以它被这个默认行为居中。首先沿着水平轴,因为它首先变得比可用宽度大,然后沿着垂直轴,一旦它变得对于可用高度来说也太大了。 修改器有能力通过在内容对于约束变得太大(或太小)时实施解决策略来改变这种行为。 Modifier.wrapContentSize 就是一个例子;它放宽了最小尺寸限制,并允许您提供有关如何在最小尺寸内定位元素的选项
请注意,wrapContentSize
有一个无界参数,允许元素大于可用大小,这似乎与您的情况特别相关。将此应用于 Box
引用自 Slack 线程 https://kotlinlang.slack.com/archives/CJLTWPH7S/p1609086849306600
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。