A [androidx.
GlobalPositionAwareModifierNodeSample
@Composable
fun GlobalPositionAwareModifierNodeSample() {
class PositionLoggerNode(var id: String) : GlobalPositionAwareModifierNode, Modifier.Node() {
override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
// This will be the size of the Layout.
coordinates.size
// The position of the Layout relative to the application window.
coordinates.positionInWindow()
// The position of the Layout relative to the Compose root.
coordinates.positionInRoot()
// These will be the alignment lines provided to the Layout
coordinates.providedAlignmentLines
// This will be a LayoutCoordinates instance corresponding to the parent of the Layout.
coordinates.parentLayoutCoordinates
}
}
data class PositionLoggerElement(val id: String) : ModifierNodeElement<PositionLoggerNode>() {
override fun create() = PositionLoggerNode(id)
override fun update(node: PositionLoggerNode) {
node.id = id
}
override fun InspectorInfo.inspectableProperties() {
name = "logPosition"
properties["id"] = id
}
}
fun Modifier.logPosition(id: String) = this then PositionLoggerElement(id)
}
OnGloballyPositioned
@Composable
fun OnGloballyPositioned() {
Column(
Modifier.onGloballyPositioned { coordinates ->
// This will be the size of the Column.
coordinates.size
// The position of the Column relative to the application window.
coordinates.positionInWindow()
// The position of the Column relative to the Compose root.
coordinates.positionInRoot()
// These will be the alignment lines provided to the layout (empty here for Column).
coordinates.providedAlignmentLines
// This will be a LayoutCoordinates instance corresponding to the parent of Column.
coordinates.parentLayoutCoordinates
}
) {
Box(Modifier.size(20.dp).background(Color.Green))
Box(Modifier.size(20.dp).background(Color.Blue))
}
}