diff options
author | Łukasz Paczos <lukas.paczos@gmail.com> | 2019-09-05 14:18:18 +0200 |
---|---|---|
committer | Łukasz Paczos <lukas.paczos@gmail.com> | 2019-09-05 14:18:18 +0200 |
commit | 1e8dc003508cc3cc7fc6ff2ef05f9f84d21eee73 (patch) | |
tree | 37151b4d1656c24a0e0ec6e058c1ceadfaaa8839 | |
parent | 2ec3bf02c72b40d4d7901cbad2c22011476fa2f5 (diff) | |
download | qtlocation-mapboxgl-1e8dc003508cc3cc7fc6ff2ef05f9f84d21eee73.tar.gz |
[android][wip] camera transitions queue
-rw-r--r-- | platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapCameraController.java | 65 |
1 files changed, 50 insertions, 15 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapCameraController.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapCameraController.java index 2cc42976c7..eb6873dee7 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapCameraController.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapCameraController.java @@ -7,16 +7,16 @@ import android.support.annotation.NonNull; import com.mapbox.mapboxsdk.camera.CameraPosition; import com.mapbox.mapboxsdk.geometry.LatLng; -import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; +import java.util.LinkedList; import java.util.List; import java.util.concurrent.locks.ReentrantLock; public class MapCameraController { @NonNull - private final List<CameraTransition> queuedTransitions = new ArrayList<>(); + private final HashMap<Integer, LinkedList<CameraTransition>> queuedTransitions = new HashMap<>(5); @NonNull private final ReentrantLock runningTransitionsLock = new ReentrantLock(); @@ -69,6 +69,8 @@ public class MapCameraController { CameraPosition.Builder builder = new CameraPosition.Builder(finalUpdate); setCameraProperty(builder, transition.getCameraProperty(), null); finalUpdate = builder.build(); + + startNextTransition(transition.getCameraProperty()); } } } @@ -84,6 +86,8 @@ public class MapCameraController { if (transition.isFinishing()) { transition.onFinish(); iterator.remove(); + + startNextTransition(transition.getCameraProperty()); } } } @@ -136,10 +140,16 @@ public class MapCameraController { MapCameraController(@NonNull final Transform transform) { this.transform = transform; + queuedTransitions.put(CameraTransition.PROPERTY_CENTER, new LinkedList<CameraTransition>()); + queuedTransitions.put(CameraTransition.PROPERTY_ZOOM, new LinkedList<CameraTransition>()); + queuedTransitions.put(CameraTransition.PROPERTY_PITCH, new LinkedList<CameraTransition>()); + queuedTransitions.put(CameraTransition.PROPERTY_BEARING, new LinkedList<CameraTransition>()); + queuedTransitions.put(CameraTransition.PROPERTY_ANCHOR, new LinkedList<CameraTransition>()); + queuedTransitions.put(CameraTransition.PROPERTY_PADDING, new LinkedList<CameraTransition>()); thread.start(); } - public void startTransition(final CameraTransition transition) { + public void startTransition(CameraTransition transition) { long time = System.currentTimeMillis(); transition.initTime(getCameraPropertyValue(transition.getCameraProperty()), time); @@ -164,8 +174,19 @@ public class MapCameraController { } } + public void queueTransition(CameraTransition transition) { + CameraTransition running = runningTransitions.get(transition.getCameraProperty()); + LinkedList<CameraTransition> queued = queuedTransitions.get(transition.getCameraProperty()); + assert queued != null; + if (running == null && queued.isEmpty()) { + startTransition(transition); + } else { + queued.addLast(transition); + } + } + @NonNull - public List<CameraTransition> getQueuedTransitions() { + public HashMap<Integer, LinkedList<CameraTransition>> getQueuedTransitions() { return queuedTransitions; } @@ -186,8 +207,10 @@ public class MapCameraController { void onDestroy() { destroyed = true; - for (CameraTransition transition : queuedTransitions) { - transition.onCancel(); + for (List<CameraTransition> transitions : queuedTransitions.values()) { + for (CameraTransition transition : transitions) { + transition.onCancel(); + } } queuedTransitions.clear(); @@ -236,24 +259,26 @@ public class MapCameraController { } private Object getCameraPropertyValue(int property) { + CameraPosition cameraPosition = transform.getCameraPosition(); + assert cameraPosition != null; switch (property) { case CameraTransition.PROPERTY_CENTER: - return transform.getCameraPosition().target; + return cameraPosition.target; case CameraTransition.PROPERTY_ZOOM: - return transform.getCameraPosition().zoom; + return cameraPosition.zoom; case CameraTransition.PROPERTY_PITCH: - return transform.getCameraPosition().tilt; + return cameraPosition.tilt; case CameraTransition.PROPERTY_BEARING: - return transform.getCameraPosition().bearing; + return cameraPosition.bearing; case CameraTransition.PROPERTY_PADDING: - double[] padding = transform.getCameraPosition().padding; + double[] padding = cameraPosition.padding; final Double[] result = new Double[padding.length]; for (int i = 0; i < padding.length; i++) { - result[i] = Double.valueOf(padding[i]); + result[i] = padding[i]; } return result; @@ -262,6 +287,14 @@ public class MapCameraController { } } + private void startNextTransition(int cameraProperty) { + LinkedList<CameraTransition> queue = queuedTransitions.get(cameraProperty); + assert queue != null; + if (!queue.isEmpty()) { + startTransition(queue.pop()); + } + } + public interface CameraBehavior { void animationScheduled(MapCameraController controller, CameraTransition transition); @@ -281,9 +314,11 @@ public class MapCameraController { } } - for (CameraTransition currentTransition : controller.getQueuedTransitions()) { - if (currentTransition.getType() != CameraTransition.TYPE_GESTURE) { - currentTransition.cancel(); + for (List<CameraTransition> currentTransitions : controller.getQueuedTransitions().values()) { + for (CameraTransition currentTransition : currentTransitions) { + if (currentTransition.getType() != CameraTransition.TYPE_GESTURE) { + currentTransition.cancel(); + } } } } |