summaryrefslogtreecommitdiff
path: root/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java')
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java66
1 files changed, 63 insertions, 3 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java
index 340e84abef..7e312a8158 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/location/LocationComponent.java
@@ -396,6 +396,10 @@ public final class LocationComponent {
/**
* Sets the camera mode, which determines how the map camera will track the rendered location.
* <p>
+ * When camera is transitioning to a new mode, it will reject inputs like {@link #zoomWhileTracking(double)} or
+ * {@link #tiltWhileTracking(double)}.
+ * Use {@link OnLocationCameraTransitionListener} to listen for the transition state.
+ * <p>
* <ul>
* <li>{@link CameraMode#NONE}: No camera tracking</li>
* <li>{@link CameraMode#NONE_COMPASS}: Camera does not track location, but does track compass bearing</li>
@@ -409,9 +413,65 @@ public final class LocationComponent {
* @param cameraMode one of the modes found in {@link CameraMode}
*/
public void setCameraMode(@CameraMode.Mode int cameraMode) {
- locationCameraController.setCameraMode(cameraMode);
- boolean isGpsNorth = cameraMode == CameraMode.TRACKING_GPS_NORTH;
- locationAnimatorCoordinator.resetAllCameraAnimations(mapboxMap.getCameraPosition(), isGpsNorth);
+ setCameraMode(cameraMode, null);
+ }
+
+ /**
+ * Sets the camera mode, which determines how the map camera will track the rendered location.
+ * <p>
+ * When camera is transitioning to a new mode, it will reject inputs like {@link #zoomWhileTracking(double)} or
+ * {@link #tiltWhileTracking(double)}.
+ * Use {@link OnLocationCameraTransitionListener} to listen for the transition state.
+ * <p>
+ * <ul>
+ * <li>{@link CameraMode#NONE}: No camera tracking</li>
+ * <li>{@link CameraMode#NONE_COMPASS}: Camera does not track location, but does track compass bearing</li>
+ * <li>{@link CameraMode#NONE_GPS}: Camera does not track location, but does track GPS bearing</li>
+ * <li>{@link CameraMode#TRACKING}: Camera tracks the user location</li>
+ * <li>{@link CameraMode#TRACKING_COMPASS}: Camera tracks the user location, with bearing provided by a compass</li>
+ * <li>{@link CameraMode#TRACKING_GPS}: Camera tracks the user location, with normalized bearing</li>
+ * <li>{@link CameraMode#TRACKING_GPS_NORTH}: Camera tracks the user location, with bearing always set to north</li>
+ * </ul>
+ *
+ * @param cameraMode one of the modes found in {@link CameraMode}
+ * @param transitionListener callback that's going to be invoked when the transition animation finishes
+ */
+ public void setCameraMode(@CameraMode.Mode int cameraMode,
+ @Nullable OnLocationCameraTransitionListener transitionListener) {
+ locationCameraController.setCameraMode(cameraMode, lastLocation, new CameraTransitionListener(transitionListener));
+ }
+
+ /**
+ * Used to reset camera animators and notify listeners when the transition finishes.
+ */
+ private class CameraTransitionListener implements OnLocationCameraTransitionListener {
+
+ private final OnLocationCameraTransitionListener externalListener;
+
+ private CameraTransitionListener(OnLocationCameraTransitionListener externalListener) {
+ this.externalListener = externalListener;
+ }
+
+ @Override
+ public void onLocationCameraTransitionFinished(int cameraMode) {
+ if (externalListener != null) {
+ externalListener.onLocationCameraTransitionFinished(cameraMode);
+ }
+ reset(cameraMode);
+ }
+
+ @Override
+ public void onLocationCameraTransitionCanceled(int cameraMode) {
+ if (externalListener != null) {
+ externalListener.onLocationCameraTransitionCanceled(cameraMode);
+ }
+ reset(cameraMode);
+ }
+
+ private void reset(@CameraMode.Mode int cameraMode) {
+ locationAnimatorCoordinator.resetAllCameraAnimations(mapboxMap.getCameraPosition(),
+ cameraMode == CameraMode.TRACKING_GPS_NORTH);
+ }
}
/**