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() {
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 -> {

@ -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)

@ -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
}

@ -12,4 +12,12 @@
android:clickable="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>
Loading…
Cancel
Save