From fd33b41dd268476784137da849e0075ccc7cc39b Mon Sep 17 00:00:00 2001 From: "arthur.valin" Date: Tue, 28 Mar 2023 11:09:02 +0200 Subject: [PATCH] Adding Start-Finish icons and titles to markers --- .../geocaching/ui/overlay/AddMarkerOverlay.kt | 39 +++++++++++++++---- .../ui/overlay/NewRoadtripOverlay.kt | 2 +- .../geocaching/ui/overlay/PlaceMarker.kt | 16 +++++--- app/src/main/res/drawable/roadtrip_marker.xml | 5 +++ 4 files changed, 49 insertions(+), 13 deletions(-) create mode 100644 app/src/main/res/drawable/roadtrip_marker.xml diff --git a/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/AddMarkerOverlay.kt b/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/AddMarkerOverlay.kt index 4d9a4dd..4f8112f 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/AddMarkerOverlay.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/AddMarkerOverlay.kt @@ -1,7 +1,9 @@ package uca.baptistearthur.geocaching.ui.overlay +import android.content.Context import android.util.Log import android.view.MotionEvent +import androidx.core.content.ContextCompat import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch @@ -11,11 +13,12 @@ import org.osmdroid.util.GeoPoint import org.osmdroid.views.MapView import org.osmdroid.views.overlay.Overlay import org.osmdroid.views.overlay.Polyline +import uca.baptistearthur.geocaching.R class AddMarkerOverlay(val roadManager: RoadManager) : Overlay() { - private var locations: MutableSet = mutableSetOf() + private var locations: MutableSet = mutableSetOf() private lateinit var roadOverlay: Polyline private var newRoadtripOverlayVisible = false; override fun onDoubleTap(e: MotionEvent?, mapView: MapView?): Boolean { @@ -23,25 +26,36 @@ class AddMarkerOverlay(val roadManager: RoadManager) : Overlay() { val proj = mapView?.projection; if(proj!=null){ val loc = proj.fromPixels(e?.x?.toInt()!!, e.y.toInt() ) as GeoPoint - locations.add(loc) - val marker = PlaceMarker(mapView, locations, this) + val marker = PlaceMarker(mapView, this) marker.position = loc + if(locations.isNotEmpty()) locations.last().setDefaultIcon() + locations.add(marker) + locations.forEach{ it.closeInfoWindow()} + computeIcons(mapView.context) mapView.overlays.add(marker) computeRoad(mapView) computeNewRoadtripOverlay(mapView); + mapView.invalidate() } return true; } + fun computeIcons(context: Context){ + if(locations.isNotEmpty()) { + val flagIcon = ContextCompat.getDrawable(context, R.drawable.roadtrip_marker)!! + locations.last().icon = flagIcon + locations.first().icon = flagIcon + } + } + fun computeRoad(mapView: MapView) { mapView.overlays.remove(mapView.overlays.find { it is Polyline}) if (locations.size > 1) { CoroutineScope(Dispatchers.IO).launch { - val road = roadManager.getRoad(ArrayList(locations)) + val road = roadManager.getRoad(ArrayList(locations.map{it -> it.position})) withContext(Dispatchers.Main) { roadOverlay = RoadManager.buildRoadOverlay(road) mapView.overlays.add(roadOverlay) - mapView.invalidate() } } } @@ -60,7 +74,18 @@ class AddMarkerOverlay(val roadManager: RoadManager) : Overlay() { newRoadtripOverlayVisible=false } } - - + fun removeMarker(placeMarker: PlaceMarker) = locations.remove(placeMarker); + fun getMarkerLabel(placeMarker: PlaceMarker) = + when (placeMarker) { + locations.first() -> { + "Start" + } + locations.last() -> { + "Finish" + } + else -> { + "Step " + locations.indexOf(placeMarker); + } + } } \ No newline at end of file diff --git a/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/NewRoadtripOverlay.kt b/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/NewRoadtripOverlay.kt index 92d7629..2722928 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/NewRoadtripOverlay.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/NewRoadtripOverlay.kt @@ -14,7 +14,7 @@ import org.osmdroid.views.overlay.Overlay import uca.baptistearthur.geocaching.R -class NewRoadtripOverlay(val points: Collection) : Overlay() { +class NewRoadtripOverlay(val points: Collection) : Overlay() { private var circleRectF=RectF() diff --git a/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/PlaceMarker.kt b/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/PlaceMarker.kt index 2386da0..ca07bb1 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/PlaceMarker.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/ui/overlay/PlaceMarker.kt @@ -1,26 +1,32 @@ package uca.baptistearthur.geocaching.ui.overlay +import android.graphics.drawable.Drawable +import android.util.Log import android.view.MotionEvent +import androidx.core.content.ContextCompat import org.osmdroid.bonuspack.routing.OSRMRoadManager import org.osmdroid.bonuspack.routing.RoadManager import org.osmdroid.util.GeoPoint import org.osmdroid.views.MapView import org.osmdroid.views.overlay.Marker import org.osmdroid.views.overlay.infowindow.InfoWindow +import uca.baptistearthur.geocaching.R -class PlaceMarker(val mapView: MapView, val locations: MutableSet, val parent : AddMarkerOverlay) : Marker(mapView) { - override fun getTitle(): String { - return "Step " + (locations.indexOf(this.position)+1) - } +class PlaceMarker(val mapView: MapView, val parent : AddMarkerOverlay) : Marker(mapView) { + + override fun getTitle() = parent.getMarkerLabel(this) override fun onLongPress(e: MotionEvent?, mapView: MapView?): Boolean { if(mapView!=null && this.hitTest(e, mapView)) { - locations.remove(this.position) + parent.removeMarker(this) this.closeInfoWindow() mapView.overlays.remove(this) + parent.computeIcons(mapView.context) parent.computeRoad(mapView) parent.computeNewRoadtripOverlay(mapView) + mapView.invalidate() return true } return false } + } \ No newline at end of file diff --git a/app/src/main/res/drawable/roadtrip_marker.xml b/app/src/main/res/drawable/roadtrip_marker.xml new file mode 100644 index 0000000..b5351a5 --- /dev/null +++ b/app/src/main/res/drawable/roadtrip_marker.xml @@ -0,0 +1,5 @@ + + +