This example demonstrates draggable markers in OpenMapView, showing how to enable marker dragging and handle drag event callbacks.
- Draggable markers with long-press activation
- OnMarkerDragListener with start/drag/end callbacks
- Toast notifications showing drag events
- Add random markers with FAB button
- Clear all markers with FAB button
- Marker click listener alongside drag listener
- Attribution click listener for OSM copyright
- Open the OpenMapView project in Android Studio
- Select
examples.Example07DraggableMarkersfrom the run configuration dropdown - Click Run (green play button)
- Deploy to your device or emulator
# From project root - build, install, and launch
./gradlew :examples:Example07DraggableMarkers:installDebug
# Launch the app
adb shell am start -n de.afarber.openmapview.example07draggablemarkers/.MainActivityval marker = Marker(
position = LatLng(51.4661, 7.2491),
title = "Marker 1",
snippet = "Drag me!",
draggable = true // Enable dragging
)
mapView.addMarker(marker)mapView.setOnMarkerDragListener(object : OnMarkerDragListener {
override fun onMarkerDragStart(marker: Marker) {
Toast.makeText(context, "Started dragging: ${marker.title}", Toast.LENGTH_SHORT).show()
}
override fun onMarkerDrag(marker: Marker) {
// Called continuously during drag - useful for real-time updates
}
override fun onMarkerDragEnd(marker: Marker) {
val coordString = "%.4f, %.4f".format(
marker.position.latitude,
marker.position.longitude
)
Toast.makeText(context, "${marker.title} at: $coordString", Toast.LENGTH_SHORT).show()
}
})- draggable = true: Enable dragging on individual markers
- OnMarkerDragListener: Interface with three callbacks
- onMarkerDragStart(): Called when long-press initiates drag
- onMarkerDrag(): Called continuously during drag movement
- onMarkerDragEnd(): Called when finger is lifted
- Marker position update: Position is automatically updated during drag
- Add markers - Click the refresh FAB to add 5 random draggable markers
- Long-press to drag - Press and hold a marker, then drag it
- Observe start toast - "Started dragging: Marker X" appears
- Observe end toast - New coordinates shown when released
- Click markers - Tap (don't hold) to see title and snippet
- Clear all - Click the clear FAB to remove all markers
- Pan and zoom - Markers remain draggable at all zoom levels
- Attribution click - Tap OSM attribution to open copyright page
- User long-presses on a draggable marker (~500ms)
onMarkerDragStart()is called- User moves finger while holding
onMarkerDrag()is called continuously- Marker visually follows the touch point
- User lifts finger
onMarkerDragEnd()is called with final position
- Click: Quick tap on marker triggers click listener
- Long-press on marker: Initiates drag (if draggable)
- Long-press on map: Triggers map long-click listener
- Drag on map: Pans the map
- Position is updated in real-time during drag
- Marker's visual position follows the touch point
- Final position is permanent after drag ends
- Drag updates run on UI thread for responsiveness
- No coordinate conversion until drag ends (efficient)
- Smooth visual feedback during drag
var startPosition: LatLng? = null
mapView.setOnMarkerDragListener(object : OnMarkerDragListener {
override fun onMarkerDragStart(marker: Marker) {
startPosition = marker.position
}
override fun onMarkerDrag(marker: Marker) {
// Update UI with current position
}
override fun onMarkerDragEnd(marker: Marker) {
val distance = calculateDistance(startPosition!!, marker.position)
Toast.makeText(context, "Moved: ${distance}m", Toast.LENGTH_SHORT).show()
}
})// Both listeners can coexist
mapView.setOnMarkerClickListener { marker ->
Toast.makeText(context, marker.title, Toast.LENGTH_SHORT).show()
true
}
mapView.setOnMarkerDragListener(object : OnMarkerDragListener {
// ... drag callbacks
})Default Center: Bochum, Germany (51.4661°N, 7.2491°E) at zoom 13.0
Random markers are generated within ~2.5km of the center.
