@@ -51,6 +51,9 @@ class OpenMapView
5151 private var lastTouchY = 0f
5252 private var onMapClickListener: OnMapClickListener ? = null
5353 private var onMapLongClickListener: OnMapLongClickListener ? = null
54+ private var onMarkerDragListener: OnMarkerDragListener ? = null
55+ private var draggedMarker: Marker ? = null
56+ private var isDragging = false
5457
5558 private val gestureDetector =
5659 GestureDetector (
@@ -103,30 +106,76 @@ class OpenMapView
103106 }
104107
105108 override fun onTouchEvent (event : MotionEvent ): Boolean {
106- // Let gesture detector handle long press
107- gestureDetector.onTouchEvent(event)
109+ // Let gesture detector handle long press (but not during drag)
110+ if (! isDragging) {
111+ gestureDetector.onTouchEvent(event)
112+ }
108113
109114 // Let scale detector handle pinch gestures
110115 scaleGestureDetector.onTouchEvent(event)
111116
112- // Handle panning only if not scaling
117+ // Handle dragging and panning only if not scaling
113118 if (! scaleGestureDetector.isInProgress) {
114119 when (event.action) {
115120 MotionEvent .ACTION_DOWN -> {
116121 lastTouchX = event.x
117122 lastTouchY = event.y
123+ // Check if touch is on a draggable marker
124+ val touchedMarker = controller.handleMarkerTouch(event.x, event.y)
125+ if (touchedMarker != null && touchedMarker.draggable) {
126+ draggedMarker = touchedMarker
127+ isDragging = false
128+ }
118129 return true
119130 }
120131 MotionEvent .ACTION_MOVE -> {
121132 val dx = event.x - lastTouchX
122133 val dy = event.y - lastTouchY
123- controller.updatePanOffset(dx, dy)
124- lastTouchX = event.x
125- lastTouchY = event.y
126- invalidate()
134+ val movementDistance = kotlin.math.sqrt((dx * dx + dy * dy).toDouble())
135+
136+ if (draggedMarker != null ) {
137+ // Start dragging if moved more than threshold
138+ if (! isDragging && movementDistance > 10 ) {
139+ isDragging = true
140+ controller.commitPan()
141+ onMarkerDragListener?.onMarkerDragStart(draggedMarker!! )
142+ }
143+
144+ // Continue dragging
145+ if (isDragging) {
146+ val latLng = controller.screenToLatLng(event.x, event.y)
147+ draggedMarker!! .position = latLng
148+ onMarkerDragListener?.onMarkerDrag(draggedMarker!! )
149+ invalidate()
150+ lastTouchX = event.x
151+ lastTouchY = event.y
152+ return true
153+ }
154+ }
155+
156+ // Pan the map if not dragging a marker
157+ if (! isDragging) {
158+ controller.updatePanOffset(dx, dy)
159+ lastTouchX = event.x
160+ lastTouchY = event.y
161+ invalidate()
162+ }
127163 return true
128164 }
129165 MotionEvent .ACTION_UP , MotionEvent .ACTION_CANCEL -> {
166+ // Handle drag end
167+ if (isDragging && draggedMarker != null ) {
168+ onMarkerDragListener?.onMarkerDragEnd(draggedMarker!! )
169+ draggedMarker = null
170+ isDragging = false
171+ invalidate()
172+ return true
173+ }
174+
175+ // Reset drag state
176+ draggedMarker = null
177+ isDragging = false
178+
130179 // Check if touch is on a marker (only if there was minimal movement)
131180 val dx = event.x - lastTouchX
132181 val dy = event.y - lastTouchY
@@ -404,6 +453,35 @@ class OpenMapView
404453 controller.onMarkerClickListener = listener
405454 }
406455
456+ /* *
457+ * Sets a listener to handle marker drag events.
458+ *
459+ * Called when a draggable marker is dragged by the user. The marker must have
460+ * its draggable property set to true to receive drag events.
461+ *
462+ * Example:
463+ * ```kotlin
464+ * mapView.setOnMarkerDragListener(object : OnMarkerDragListener {
465+ * override fun onMarkerDragStart(marker: Marker) {
466+ * Log.d("Map", "Drag started: ${marker.title}")
467+ * }
468+ *
469+ * override fun onMarkerDrag(marker: Marker) {
470+ * Log.d("Map", "Dragging: ${marker.position}")
471+ * }
472+ *
473+ * override fun onMarkerDragEnd(marker: Marker) {
474+ * Log.d("Map", "Drag ended: ${marker.position}")
475+ * }
476+ * })
477+ * ```
478+ *
479+ * @param listener The listener to receive drag events, or null to clear the listener
480+ */
481+ fun setOnMarkerDragListener (listener : OnMarkerDragListener ? ) {
482+ onMarkerDragListener = listener
483+ }
484+
407485 /* *
408486 * Sets a listener to handle map click events.
409487 *
0 commit comments