Adding better recenter algorithm following the location

arthur
Arthur VALIN 2 years ago
parent 0cf19438cc
commit 9bcddd990b

@ -9,6 +9,8 @@ import org.osmdroid.config.Configuration
class MainWindow: AppCompatActivity() { class MainWindow: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
val map = Map();
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.main_window) setContentView(R.layout.main_window)
@ -22,7 +24,7 @@ class MainWindow: AppCompatActivity() {
true true
} }
R.id.map -> { R.id.map -> {
loadFragment(Map()) loadFragment(map)
true true
} }
R.id.list -> { R.id.list -> {

@ -17,6 +17,7 @@ import android.Manifest.permission.ACCESS_FINE_LOCATION
import android.hardware.SensorManager import android.hardware.SensorManager
import android.location.Location import android.location.Location
import android.location.LocationListener import android.location.LocationListener
import android.widget.ProgressBar
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import org.osmdroid.views.overlay.compass.CompassOverlay import org.osmdroid.views.overlay.compass.CompassOverlay
import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider import org.osmdroid.views.overlay.compass.InternalCompassOrientationProvider
@ -26,13 +27,16 @@ import org.osmdroid.views.overlay.mylocation.MyLocationNewOverlay
class Map : Fragment() { class Map : Fragment() {
private lateinit var map : MapView private lateinit var map : MapView
private lateinit var spinner: ProgressBar;
val defaultPoint = GeoPoint(48.8583, 2.2944) val defaultPoint = GeoPoint(48.8583, 2.2944)
var isMapCentered = false; var isMapCentered = false;
val locationListener = object : LocationListener { val locationListener = object : LocationListener {
override fun onLocationChanged(location: Location) { override fun onLocationChanged(location: Location) {
val geoPoint = GeoPoint(location.latitude, location.longitude) val geoPoint = GeoPoint(location.latitude, location.longitude)
if(!isMapCentered){ if(!isMapCentered){
map.controller.setCenter(geoPoint) map.controller.setCenter(geoPoint)
spinner.visibility=View.GONE;
isMapCentered=true; isMapCentered=true;
} }
map.invalidate() map.invalidate()
@ -50,7 +54,10 @@ class Map : Fragment() {
private fun configureMap(view: View){ private fun configureMap(view: View){
map = view.findViewById(R.id.mapView) 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) { if (ContextCompat.checkSelfPermission(requireActivity(), ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
requestPermissionLauncher.launch(ACCESS_FINE_LOCATION) requestPermissionLauncher.launch(ACCESS_FINE_LOCATION)
} }
@ -65,7 +72,6 @@ class Map : Fragment() {
map.overlays.add(scaleBarOverlay) map.overlays.add(scaleBarOverlay)
val myLocation = MyLocationNewOverlay(GpsMyLocationProvider(context), map) val myLocation = MyLocationNewOverlay(GpsMyLocationProvider(context), map)
myLocation.enableFollowLocation()
myLocation.enableMyLocation() myLocation.enableMyLocation()
map.overlays.add(myLocation) map.overlays.add(myLocation)

@ -1,25 +1,23 @@
package uca.baptistearthur.geocaching package uca.baptistearthur.geocaching
import android.graphics.* import android.graphics.*
import android.graphics.drawable.shapes.Shape
import android.location.Location import android.location.Location
import android.view.GestureDetector import android.view.GestureDetector
import android.view.MotionEvent import android.view.MotionEvent
import androidx.appcompat.widget.AppCompatDrawableManager
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import org.osmdroid.util.GeoPoint import org.osmdroid.util.GeoPoint
import org.osmdroid.views.MapView import org.osmdroid.views.MapView
import org.osmdroid.views.overlay.Overlay import org.osmdroid.views.overlay.Overlay
import org.osmdroid.views.overlay.mylocation.IMyLocationConsumer import org.osmdroid.views.overlay.mylocation.IMyLocationConsumer
import org.osmdroid.views.overlay.mylocation.IMyLocationProvider 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 { class RecenterOverlay(val myLocationProvider: IMyLocationProvider, val mapView: MapView) : Overlay(), IMyLocationConsumer {
private val gestureDetector: GestureDetector = GestureDetector(mapView.context, this)
private var circleRectF=RectF();
private var circleRectF=RectF()
private var mIsFollowing = false
private var mLocation: Location? = null
override fun draw(canvas: Canvas, mapView: MapView, shadow: Boolean) { override fun draw(canvas: Canvas, mapView: MapView, shadow: Boolean) {
val circleSize = 300f val circleSize = 300f
@ -49,20 +47,47 @@ class RecenterOverlay(val myLocationProvider: IMyLocationProvider, val mapView:
icon?.draw(canvas) 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() { fun enableMyLocation() {
mLocation = myLocationProvider.lastKnownLocation
mIsFollowing = true;
if(mLocation!=null) {
mapView.controller?.animateTo(GeoPoint(mLocation!!.latitude, mLocation!!.longitude))
}
myLocationProvider.startLocationProvider(this); myLocationProvider.startLocationProvider(this);
} }
fun disableMyLocation(){ fun disableMyLocation(){
mapView.controller?.stopAnimation(false)
mIsFollowing = false
myLocationProvider.stopLocationProvider(); 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?) = override fun onSingleTapConfirmed(e: MotionEvent?, mapView: MapView?) =
myLocationProvider.lastKnownLocation?.let { myLocationProvider.lastKnownLocation?.let {
if (e != null && circleRectF.contains(e.x, e.y)) { if (e != null && circleRectF.contains(e.x, e.y)) {
mapView?.controller?.setCenter(GeoPoint(it.latitude, it.longitude)) mapView?.controller?.setCenter(GeoPoint(it.latitude, it.longitude))
mapView?.controller?.setZoom(20.0); mapView?.controller?.setZoom(21.0);
enableMyLocation()
} }
true true
} ?: false } ?: false
@ -82,12 +107,4 @@ class RecenterOverlay(val myLocationProvider: IMyLocationProvider, val mapView:
disableMyLocation() disableMyLocation()
super.onDetach(mapView) 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
} }

@ -12,4 +12,12 @@
android:clickable="true" android:clickable="true"
android:focusable="true" /> android:focusable="true" />
<ProgressBar
android:id="@+id/mapLoading"
style="?android:attr/progressBarStyleLarge"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:visibility="gone"/>
</FrameLayout> </FrameLayout>
Loading…
Cancel
Save