在 Jetpack Compose 中拖动 Google 地图上的标记时如何使用 InputHandler?

问题描述 投票:0回答:1

我已经在谷歌地图上成功添加了这个标记:

Marker(
    state = MarkerState(
        position = LatLng(lat, lng)
    ),
    title = "Party",
    snippet = "Come to party.",
    draggable = true
)

我设置为可拖动。现在我想知道什么时候有人拖动它。我发现这个函数叫做 InputHandler() 但我不知道如何使用它。

我尝试使用:

InputHandler(
    onMarkerDragEnd = { marker ->
        Log.d(TAG, "${marker.id}")
    }
)

但是没有任何反应。谁能帮忙?或者知道何时拖动标记的任何其他想法?

android kotlin google-maps android-jetpack-compose google-maps-markers
1个回答
0
投票

您可以使用 OnMarkerDragListener 接口来监听标记拖动事件。

val marker = googleMap.addMarker(
    MarkerOptions()
        .position(LatLng(lat, lng))
        .title("Location")
        .snippet("set Location.")
        .draggable(true)
)

googleMap.setOnMarkerDragListener(object : OnMarkerDragListener {
    override fun onMarkerDragStart(marker: Marker?) {
        // Called when marker drag starts
    }

    override fun onMarkerDrag(marker: Marker?) {
        // Called while marker is being dragged
    }

    override fun onMarkerDragEnd(marker: Marker?) {
        // Called when marker drag ends
        Log.d(TAG, "${marker?.id}")
    }
})

这里是maps-compose

 var markerPosition by remember { mutableStateOf(LatLng(37.7749, -122.4194)) }
var isDragging by remember { mutableStateOf(false) }

GoogleMap(
    modifier = Modifier.fillMaxSize(),
    initialCameraPosition = CameraPosition(target = markerPosition, zoom = 10f),
    onMapClick = { /* handle map clicks */ }
) { map ->
    if (isDragging) {
        // While dragging, create a temporary marker with opacity set to 0
        Marker(
            position = markerPosition,
            alpha = 0f
        )
    } else {
        // When not dragging, create a visible marker
        Marker(
            position = markerPosition,
            title = "Party",
            snippet = "Come to party.",
            draggable = true,
            onClick = { /* handle marker clicks */ }
        )
    }
}

// Listen for drag events using the pointer input system
PointerInput(Unit) {
    forEachGesture {
        awaitPointerEventScope {
            val down = awaitFirstDown()
            if (down.changes.any { it.changedToDown() && it.position in markerPosition.toOffset() }) {
                // If the user starts a drag gesture on the marker, set isDragging to true
                isDragging = true
            }

            val up = awaitUpOrCancellation()
            if (up.changes.any { it.changedToUp() }) {
                // If the user stops a drag gesture, set isDragging to false and update the marker position
                isDragging = false
                markerPosition = up.changes.first { it.changedToUp() }.position.toLatLng()
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.