我试过用this来回答他用OnGloballyPositionedModifier
的问题,但它没有返回我孩子的正确绝对位置。我试过positionInWindow()
,positionInRoot()
。当column
做间距时,它似乎工作,但当我用offset
做时,它不工作。
@Composable
fun GetAbsolutePos(
content: @Composable () -> Unit,
) {
Box(modifier = Modifier
.onGloballyPositioned { coordinates ->
println("My coordinates: " + coordinates.positionInRoot())
}
) {
content()
}
}
@Preview
@Composable
fun test() {
GetAbsolutePos() {
Box(
modifier = Modifier
.width(PixelToDp(pixelSize = 200))
.offset(x = PixelToDp(pixelSize = 100), y = PixelToDp(pixelSize = 50))
.height(PixelToDp(pixelSize = 200))
.background(Color.Red)
) {
GetAbsolutePos() {
Column(
) {
GetAbsolutePos() {
Box(
Modifier
.size(PixelToDp(pixelSize = 20))
.background(Color.Green)
)
}
GetAbsolutePos() {
Box(
Modifier
.size(PixelToDp(pixelSize = 20))
.background(Color.Blue)
)
}
}
}
}
}
}
它将打印以下内容
I/System.out: My coordinates: Offset(0.0, 0.0) // wrong I used offset, it should be 100x50
I/System.out: My coordinates: Offset(100.0, 50.0) // correct
I/System.out: My coordinates: Offset(100.0, 50.0) // correct
I/System.out: My coordinates: Offset(100.0, 70.0) // correct? so it works on column spacing but not with offset????
有没有办法得到我的组合函数相对于整个ANDROID窗口的绝对位置?
编辑1:
@Composable
fun PixelToDp(pixelSize: Int): Dp {
return with(LocalDensity.current) { pixelSize.toDp() }
}
编辑:2
修饰符的顺序应该无关紧要,因为函数onGloballyPositioned
声明了。This callback will be invoked at least once when the LayoutCoordinates are available, and every time the element's position changes within the window.
对于onSizeChanged
也是如此,可以通过运行下面的代码来观察(与@Thracian的答案中的示例相同)。Invoked with the size of the modified Compose UI element when the element is first measured or when the size of the element changes.
因为这个函数实际上是一个回调函数,所以顺序应该不重要。如果我错了,请随时纠正我。
Box(modifier = Modifier
.onSizeChanged {
println("🔥 Size 1: $it")
}
.size(PixelToDp(pixelSize = 150))
.onSizeChanged {
println("🔥 Size 2: $it")
}
.background(Color.Red)
)
打印
I/System.out: 🔥 Size 2: 150 x 150
I/System.out: 🔥 Size 1: 150 x 150
1条答案
按热度按时间zu0ti5jz1#
检查合成对象的位置时,未考虑修改器的顺序问题
印刷品:
在这个答案中,我解释了修改器的顺序如何改变一些修改器的结果,包括修改器。偏移量
https://stackoverflow.com/a/74145347/5457853
我做了一个例子来展示与兄弟、其他修改器的交互,以及基于修改器如何应用于Modifier.offset或Modifier.graphicsLayer的位置
可以看出,改变橙子组合的偏移不会影响蓝色组合的位置,但它会改变触摸位置的界限,并且在应用偏移之前和之后全局位置会改变