【问题标题】:Is it possible to build an evenly spaced and unconstrained grid in Compose?是否可以在 Compose 中构建一个均匀分布且不受约束的网格?
【发布时间】:2021-12-08 22:10:08
【问题描述】:

是否可以在 compose 中构建一个网格,其中所有元素的大小都是均匀的,由最大的内容决定?我还希望这个网格包装内容,并且不受任何预设高度的约束。

所以像这样。假设网格是全角的,并且我们知道只有 2 列。

 ____________ ____________
|      1.    |2. Medium   |
|Short stuff |length      |
|            |text        |
|____________|____________|
|3. This is  |            |
|a very long |4. hi!      |
|content here|            |
|____________|____________|

我一直在尝试创建这样的东西,但我认为在 Compose 中不设置某种网格的整体高度是不可能的?

你可以有这样的东西:

@Composable
fun SampleGrid() {
    Row(modifier = Modifier.fillMaxWidth()) {
        Column(modifier = Modifier.weight(0.5f)) {
            Cell(modifier = Modifier.weight(0.5f))
            Cell(modifier = Modifier.weight(0.5f))
        }
        Column(modifier = Modifier.weight(0.5f)) {
            Cell(modifier = Modifier.weight(0.5f))
            Cell(modifier = Modifier.weight(0.5f))
        }
    }
}

所以这是一个不错的 2x2 均匀网格,但 weigth 将使元素增长到它想要的高度,直到它被周围的其他视图或具有设定高度的容器限制。

我们可以将height(IntrinsicSize.Max) 添加到列修饰符中,所以它有点包装内容,但是如果另一列中有很多/更少的内容怎么办?高度不同步

 ____________ ____________
|      1.    |2. hi!      |
|Short stuff |____________| 
|            |4. hi!      |
|____________|____________|
|3. This is  |
|a very long |
|content here|
|____________|

您可以使用 Column 包装器和多个 Rows 构建网格,但您会遇到同样的问题。

我发现即使使用自定义 Layout,尤其是 SubcomposeLayout,这也是一个问题。我们可以让一种布局依赖于另一种布局,但是如果计算一行的高度,结果第二行需要更多空间,因为它有更多内容,该怎么办?然后您必须重新测量第一个以使其更大,但不允许在 Compose 中测量两次。

我的理解正确吗?具有均匀大小的元素的网格是否会随着其最大的内容增长(而不是受到某个高度的限制)不可能?对我来说感觉有点像鸡和蛋的问题......

【问题讨论】:

    标签: android kotlin android-jetpack-compose


    【解决方案1】:

    您可以通过将.height(IntrinsicSize.Min) 应用于Row 来解决此问题:它将最大高度限制为最小Column 高度:

    Row(
        modifier = Modifier
            .width(200.dp)
            .height(IntrinsicSize.Min)
    ) {
        Column(modifier = Modifier.weight(1f)) {
            Cell("Short stuff", modifier = Modifier.weight(1f))
            Cell(LoremIpsum(10).values.first(), modifier = Modifier.weight(1f))
        }
        Column(modifier = Modifier.weight(1f)) {
            Cell("Medium length text", modifier = Modifier.weight(1f))
            Cell("hi", modifier = Modifier.weight(1f))
        }
    }
    

    结果:

    【讨论】:

    • 谢谢!如果我们使用IntrinsicSize.MinIntrinsicSize.Max,这有关系吗?自己尝试一下,我发现网格的布局方式没有区别。另外,我想我被预览误导了——包裹在Surface 中的同一个网格组件占用了预览中的所有空间,但它在设备上显示良好:(
    • 抱歉,这里有点生气 - 我已经再次测试了十几次,如果它被包裹在 Surface 设置为 fillMaxSize/Height 中,您的网格实现会覆盖整个屏幕。但是,如果包裹在任何其他容器 BoxColumn - 也设置为 fillMaxSize/Height 它的行为符合预期......该容器也是上述 Surface 的子容器......为什么?
    • @MartynaMaron 你是对的,在这种情况下IntrinsicSize.MinIntrinsicSize.Min 之间似乎没有区别。第二个问题似乎是Box参数propagateMinConstraints = true引起的。我不确定Surface 为何使用它,但您可以将正确的参数应用于Box,例如背景和形状。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-19
    • 2013-04-03
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多