在 Jetpack Compose 中以编程方式获取和设置元素的位置

Get and set position of element programmatically in Jetpack Compose

是否可以通过编程方式获取和设置 window 上元素的 position/bounds?比方说,我们有一个简单的 Text 并想在 y 轴上移动它 50dp

Text(text = "Hello", modifier = Modifier.padding(8.dp).fillMaxWidth())

https://developer.android.com/reference/kotlin/androidx/ui/layout/package-summary#offset

Text(text = "Hello", modifier = Modifier.padding(8.dp).offset(y = 50.dp))

如果我对你的问题的解释正确,那么你想将 Text 移动 50dp y-axis 和文本以及文本上方的 50dp space 应该是可点击的。

这是创建小型自定义可组合项的一种解决方案:

@Composable
fun TextWithPos(content: String, modifier: Modifier, x: Int, y: Int, clickFun: () -> Unit = {}) {

    Text(text = content, modifier = modifier
            .defaultMinSizeConstraints(minHeight = y.dp)
            .clickable(onClick = clickFun)
            .padding(top = y.dp))

}

这个 Composable 设置了一些 dp 为 minHeigth 的文本(minWidth 未使用 此处),然后设置 clickable,然后是带有一些 dp 的 padding。其实编 不再区分边距和填充,它只是一些 space.

Compose 按顺序处理修饰符,因此 clickable 覆盖了 space(填充) 以及 Text 中的文本。如果将 clickable 移动到 padding 下方,则 可点击区域仅覆盖 Text.

内的文字

这里是一个带有可点击操作的预览,用于显示可点击区域。因为 函数设置一个修饰符并将其移交给自定义可组合项 修饰符优先于自定义可组合项中的修饰符集。

@Preview(showBackground = true)
@Composable
fun TextPosPreview() {
    PlaygroundTheme {
        Column() {
            TextWithPos(content = "Hello", modifier = Modifier
                    .padding(start = 16.dp, end=16.dp), x = 0, y = 50) {
                counter++
            }

            var counter by remember { mutableStateOf(1) }
            Text(text = counter.toString(), modifier = Modifier
                    .padding(16.dp))

        }
    }
}