From fa6d5864177bfb68e99f8732068a3402cc5aadfd Mon Sep 17 00:00:00 2001 From: Tobrun Date: Mon, 14 Nov 2016 10:37:34 +0100 Subject: [PATCH] [android] - allow using rotate gesture when not tracking user location, correctly update bearing during rotation gesture (#6978) --- .../mapboxsdk/maps/TrackingSettings.java | 2 +- .../maps/widgets/MyLocationView.java | 21 ++++++++++++------- 2 files changed, 14 insertions(+), 9 deletions(-) diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/TrackingSettings.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/TrackingSettings.java index 474af1985..c32d4a890 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/TrackingSettings.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/TrackingSettings.java @@ -199,7 +199,7 @@ public class TrackingSettings { // The user settings are enabled AND; // EITHER bearing tracking is dismissed on gesture OR there is no bearing tracking return uiSettings.isRotateGesturesEnabled() && - (dismissBearingTrackingOnGesture || myBearingTrackingMode == MyBearingTracking.NONE); + (dismissBearingTrackingOnGesture || myBearingTrackingMode == MyBearingTracking.NONE || (myLocationTrackingMode == MyLocationTracking.TRACKING_NONE)); } /** diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationView.java index 15733eb93..9d3c21c6e 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationView.java @@ -92,8 +92,9 @@ public class MyLocationView extends View { private PointF screenLocation; // camera vars - private double bearing; private double tilt; + private double bearing; + private float magneticHeading; // Controls the compass update rate in milliseconds private static final int COMPASS_UPDATE_RATE_MS = 500; @@ -314,6 +315,13 @@ public class MyLocationView extends View { public void setBearing(double bearing) { this.bearing = bearing; + if (myLocationTrackingMode == MyLocationTracking.TRACKING_NONE) { + if (myBearingTrackingMode == MyBearingTracking.GPS) { + setCompass(location.getBearing() - bearing); + } else if (myBearingTrackingMode == MyBearingTracking.COMPASS) { + setCompass(magneticHeading - bearing); + } + } } public void setCameraPosition(CameraPosition position) { @@ -451,6 +459,8 @@ public class MyLocationView extends View { if (myLocationTrackingMode == MyLocationTracking.TRACKING_FOLLOW) { // always face north setCompass(0); + } else { + myLocationBehavior.invalidate(); } } invalidate(); @@ -572,14 +582,14 @@ public class MyLocationView extends View { SensorManager.getRotationMatrixFromVector(matrix, event.values); SensorManager.getOrientation(matrix, orientation); - float magneticHeading = (float) Math.toDegrees(SensorManager.getOrientation(matrix, orientation)[0]); + magneticHeading = (float) Math.toDegrees(SensorManager.getOrientation(matrix, orientation)[0]); if (myLocationTrackingMode == MyLocationTracking.TRACKING_FOLLOW) { // Change the user location view orientation to reflect the device orientation rotateCamera(magneticHeading); setCompass(0); } else { // Change compass direction - setCompass(magneticHeading); + setCompass(magneticHeading - bearing); } compassUpdateNextTimestamp = currentTime + COMPASS_UPDATE_RATE_MS; @@ -730,11 +740,6 @@ public class MyLocationView extends View { // update LatLng location LatLng newLocation = new LatLng(location); - // update LatLng direction - if (myBearingTrackingMode == MyBearingTracking.GPS && location.hasBearing()) { - setCompass(location.getBearing() + bearing); - } - // update LatLng accuracy updateAccuracy(location);