diff --git a/app/src/main/java/uca/baptistearthur/geocaching/Map.kt b/app/src/main/java/uca/baptistearthur/geocaching/Map.kt index 34d2d00..5d66bc5 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/Map.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/Map.kt @@ -23,6 +23,7 @@ import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider import org.osmdroid.views.overlay.mylocation.GpsMyLocationProvider import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay + class Map : Fragment() { private lateinit var map : MapView val defaultPoint = GeoPoint(48.8583, 2.2944) @@ -67,6 +68,11 @@ class Map : Fragment() { myLocation.enableFollowLocation() myLocation.enableMyLocation() map.overlays.add(myLocation) + + val recenter = RecenterOverlay(GpsMyLocationProvider(context), map) + recenter.enableMyLocation() + map.overlays.add(recenter); + } override fun onCreateView( diff --git a/app/src/main/java/uca/baptistearthur/geocaching/RecenterOverlay.kt b/app/src/main/java/uca/baptistearthur/geocaching/RecenterOverlay.kt new file mode 100644 index 0000000..eee6a23 --- /dev/null +++ b/app/src/main/java/uca/baptistearthur/geocaching/RecenterOverlay.kt @@ -0,0 +1,72 @@ +package uca.baptistearthur.geocaching + +import android.graphics.* +import android.graphics.drawable.shapes.Shape +import android.location.Location +import android.view.GestureDetector +import android.view.MotionEvent +import androidx.appcompat.widget.AppCompatDrawableManager +import androidx.core.content.ContextCompat +import org.osmdroid.util.GeoPoint +import org.osmdroid.views.MapView +import org.osmdroid.views.overlay.Overlay +import org.osmdroid.views.overlay.mylocation.IMyLocationConsumer +import org.osmdroid.views.overlay.mylocation.IMyLocationProvider + + +class RecenterOverlay(val myLocationProvider: IMyLocationProvider, val mapView: MapView) : Overlay(), GestureDetector.OnGestureListener, IMyLocationConsumer { + + private val gestureDetector: GestureDetector = GestureDetector(mapView.context, this) + + private var circleRectF=RectF(); + + + override fun draw(canvas: Canvas, mapView: MapView, shadow: Boolean) { + + val circleSize = 300f + val circlePadding = 20f + val circleX = canvas.width - circleSize - circlePadding + val circleY = canvas.height - circleSize - circlePadding + circleRectF=RectF(circleX, circleY, circleX + circleSize, circleY + circleSize) + + val paint = Paint().apply { + color = Color.WHITE + style = Paint.Style.FILL + } + canvas.drawCircle( + circleX + circleSize / 2, + circleY + circleSize / 2, + circleSize / 2, + paint + ) + + val iconSize = 180 + val icon = ContextCompat.getDrawable(mapView.context, R.drawable.center) + + val iconX = (circleX + circleSize / 2 - iconSize / 2).toInt() + val iconY = (circleY + circleSize / 2 - iconSize / 2).toInt() + + icon?.setBounds(iconX, iconY, iconX + iconSize, iconY + iconSize) + icon?.draw(canvas) + } + + fun enableMyLocation() { + myLocationProvider.startLocationProvider(this); + } + + override fun onSingleTapConfirmed(e: MotionEvent?, mapView: MapView?) = + myLocationProvider.lastKnownLocation?.let { + if (e != null && circleRectF.contains(e.x, e.y)) { + mapView?.controller?.setCenter(GeoPoint(it.latitude, it.longitude)) + } + true + } ?: false + + override fun onDown(p0: MotionEvent) = true + override fun onShowPress(p0: MotionEvent) = Unit + override fun onSingleTapUp(p0: MotionEvent) = true + override fun onScroll(p0: MotionEvent, p1: MotionEvent, p2: Float, p3: Float) = true; + override fun onLongPress(p0: MotionEvent) = Unit + override fun onFling(p0: MotionEvent, p1: MotionEvent, p2: Float, p3: Float) = true + override fun onLocationChanged(location: Location?, source: IMyLocationProvider?) = Unit +} diff --git a/app/src/main/res/drawable/center.xml b/app/src/main/res/drawable/center.xml new file mode 100644 index 0000000..e215d44 --- /dev/null +++ b/app/src/main/res/drawable/center.xml @@ -0,0 +1,5 @@ + + +