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

时间:2020-07-23 11:05:59

标签: android android-jetpack-compose

是否可以通过编程方式获取和设置窗口上元素的位置/边界?假设我们有一个简单的Text,并且想在50dp轴上移动它y

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

2 个答案:

答案 0 :(得分:1)

如果我正确解释了您的问题,那么您想在其上移动文本50dp y轴和“文字”以及文字上方的50dp空间应为可点击的。

这是创建小型可定制组合物的一种解决方案:

@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设置具有{d1(minHeigth未使用的minWidth 此处),然后设置clickable,然后设置具有某些dp的padding。实际上,撰写 不再区分边距和填充,它只是一些空格

按顺序编写修饰符,因此clickable覆盖了空格(填充) 以及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))

        }
    }
}

答案 1 :(得分:0)

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

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