From 9bcddd990b4a665f0f55f73da44e7930efcec945 Mon Sep 17 00:00:00 2001 From: "arthur.valin" Date: Fri, 10 Mar 2023 17:01:39 +0100 Subject: [PATCH] Adding better recenter algorithm following the location --- .../baptistearthur/geocaching/MainWindow.kt | 4 +- .../java/uca/baptistearthur/geocaching/Map.kt | 10 +++- .../geocaching/RecenterOverlay.kt | 51 ++++++++++++------- app/src/main/res/layout/fragment_map.xml | 8 +++ 4 files changed, 53 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/uca/baptistearthur/geocaching/MainWindow.kt b/app/src/main/java/uca/baptistearthur/geocaching/MainWindow.kt index 0774e7a..846ae52 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/MainWindow.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/MainWindow.kt @@ -9,6 +9,8 @@ import org.osmdroid.config.Configuration class MainWindow: AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { + val map = Map(); + super.onCreate(savedInstanceState) setContentView(R.layout.main_window) @@ -22,7 +24,7 @@ class MainWindow: AppCompatActivity() { true } R.id.map -> { - loadFragment(Map()) + loadFragment(map) true } R.id.list -> { diff --git a/app/src/main/java/uca/baptistearthur/geocaching/Map.kt b/app/src/main/java/uca/baptistearthur/geocaching/Map.kt index 5d66bc5..31a90ef 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/Map.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/Map.kt @@ -17,6 +17,7 @@ import android.Manifest.permission.ACCESS_FINE_LOCATION import android.hardware.SensorManager import android.location.Location import android.location.LocationListener +import android.widget.ProgressBar import androidx.activity.result.contract.ActivityResultContracts import org.osmdroid.views.overlay.compass.CompassOverlay import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider @@ -26,13 +27,16 @@ import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay class Map : Fragment() { private lateinit var map : MapView + private lateinit var spinner: ProgressBar; val defaultPoint = GeoPoint(48.8583, 2.2944) var isMapCentered = false; + val locationListener = object : LocationListener { override fun onLocationChanged(location: Location) { val geoPoint = GeoPoint(location.latitude, location.longitude) if(!isMapCentered){ map.controller.setCenter(geoPoint) + spinner.visibility=View.GONE; isMapCentered=true; } map.invalidate() @@ -50,7 +54,10 @@ class Map : Fragment() { private fun configureMap(view: View){ map = view.findViewById(R.id.mapView) - map.controller.setZoom(20.0); + spinner = view.findViewById(R.id.mapLoading); + spinner.visibility=View.VISIBLE; + map.minZoomLevel = 10.0 + map.controller.setZoom(21.0); if (ContextCompat.checkSelfPermission(requireActivity(), ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { requestPermissionLauncher.launch(ACCESS_FINE_LOCATION) } @@ -65,7 +72,6 @@ class Map : Fragment() { map.overlays.add(scaleBarOverlay) val myLocation = MyLocationNewOverlay(GpsMyLocationProvider(context), map) - myLocation.enableFollowLocation() myLocation.enableMyLocation() map.overlays.add(myLocation) diff --git a/app/src/main/java/uca/baptistearthur/geocaching/RecenterOverlay.kt b/app/src/main/java/uca/baptistearthur/geocaching/RecenterOverlay.kt index 47aae20..d494dc2 100644 --- a/app/src/main/java/uca/baptistearthur/geocaching/RecenterOverlay.kt +++ b/app/src/main/java/uca/baptistearthur/geocaching/RecenterOverlay.kt @@ -1,25 +1,23 @@ 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 +import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay -class RecenterOverlay(val myLocationProvider: IMyLocationProvider, val mapView: MapView) : Overlay(), GestureDetector.OnGestureListener, IMyLocationConsumer { - - private val gestureDetector: GestureDetector = GestureDetector(mapView.context, this) - private var circleRectF=RectF(); - +class RecenterOverlay(val myLocationProvider: IMyLocationProvider, val mapView: MapView) : Overlay(), IMyLocationConsumer { + private var circleRectF=RectF() + private var mIsFollowing = false + private var mLocation: Location? = null override fun draw(canvas: Canvas, mapView: MapView, shadow: Boolean) { val circleSize = 300f @@ -49,20 +47,47 @@ class RecenterOverlay(val myLocationProvider: IMyLocationProvider, val mapView: icon?.draw(canvas) } + override fun onLocationChanged(location: Location, source: IMyLocationProvider) { + mLocation = myLocationProvider.lastKnownLocation + if (mIsFollowing) { + mapView.controller.animateTo(GeoPoint(location.latitude, location.longitude)); + } else { + mapView.postInvalidate(); + } + } + fun enableMyLocation() { + mLocation = myLocationProvider.lastKnownLocation + mIsFollowing = true; + if(mLocation!=null) { + mapView.controller?.animateTo(GeoPoint(mLocation!!.latitude, mLocation!!.longitude)) + } myLocationProvider.startLocationProvider(this); } fun disableMyLocation(){ + mapView.controller?.stopAnimation(false) + mIsFollowing = false myLocationProvider.stopLocationProvider(); } + override fun onTouchEvent(event: MotionEvent?, mapView: MapView?): Boolean { + val isSingleFingerDrag = + event!!.action == MotionEvent.ACTION_MOVE && event.pointerCount == 1 + if (event.action == MotionEvent.ACTION_DOWN) { + disableMyLocation() + } else if (isSingleFingerDrag && mIsFollowing) { + return true // prevent the pan + } + return super.onTouchEvent(event, mapView) + } + 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)) - mapView?.controller?.setZoom(20.0); - + mapView?.controller?.setZoom(21.0); + enableMyLocation() } true } ?: false @@ -82,12 +107,4 @@ class RecenterOverlay(val myLocationProvider: IMyLocationProvider, val mapView: disableMyLocation() super.onDetach(mapView) } - - 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/layout/fragment_map.xml b/app/src/main/res/layout/fragment_map.xml index 6ebeadb..b3be230 100644 --- a/app/src/main/res/layout/fragment_map.xml +++ b/app/src/main/res/layout/fragment_map.xml @@ -12,4 +12,12 @@ android:clickable="true" android:focusable="true" /> + + \ No newline at end of file