diff options
author | Łukasz Paczos <lukasz.paczos@mapbox.com> | 2019-09-06 16:50:19 +0200 |
---|---|---|
committer | Łukasz Paczos <lukasz.paczos@mapbox.com> | 2019-09-06 16:50:19 +0200 |
commit | 6574aad91d17514477b646ef226ed9c6136ee617 (patch) | |
tree | 5bde2c133c387d468d73ebf7406a6dd63066ff50 | |
parent | 0dff7299e2546ec7828739dd6ee0a0b9f68fb0f6 (diff) | |
download | qtlocation-mapboxgl-6574aad91d17514477b646ef226ed9c6136ee617.tar.gz |
[android][wip] option to cancel camera transitions
2 files changed, 84 insertions, 55 deletions
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraTransition.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraTransition.java index cf0a9b825f..a4c068e70c 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraTransition.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraTransition.java @@ -7,9 +7,10 @@ import java.util.concurrent.CopyOnWriteArrayList; public abstract class CameraTransition<T> { - public static final int TYPE_ANY = 0; - public static final int TYPE_GESTURE = 1; - public static final int TYPE_LOCATION = 2; + //todo camera - reason should be an intdef/enum/object so that devs can extend without clashing with default values + public static final int REASON_ANY = 0; + public static final int REASON_GESTURE = 1; + public static final int REASON_LOCATION = 2; public static final Interpolator INTERPOLATOR_LINEAR = PathInterpolatorCompat.create(0f, 0f, 1f, 1f); public static final Interpolator INTERPOLATOR_EASING = PathInterpolatorCompat.create(0f, 0f, 0.25f, 1f); @@ -23,7 +24,7 @@ public abstract class CameraTransition<T> { private final CopyOnWriteArrayList<Listener> listeners = new CopyOnWriteArrayList<>(); - private final int type; + private final int reason; private T startValue; private final T endValue; @@ -39,12 +40,13 @@ public abstract class CameraTransition<T> { private boolean isCanceled; private boolean isStarted; + private boolean isFinished; private boolean isFinishing; private final Interpolator interpolator; - CameraTransition(int type, double durationMillis, double delayMillis, T endValue, Interpolator interpolator) { - this.type = type; + CameraTransition(int reason, double durationMillis, double delayMillis, T endValue, Interpolator interpolator) { + this.reason = reason; this.durationMillis = durationMillis; this.durationNanos = durationMillis * 1E6; this.delayMillis = delayMillis; @@ -53,17 +55,19 @@ public abstract class CameraTransition<T> { this.interpolator = interpolator; } - void initTime(T startValue, double currentTimeNanos) { + void onStart(T startValue, double currentTimeNanos) { this.startTimeMillis = currentTimeNanos / 1E6 + delayMillis; this.startTimeNanos = currentTimeNanos + delayNanos; this.endTimeMillis = startTimeMillis + durationMillis; this.endTimeNanos = startTimeNanos + durationNanos; this.startValue = startValue; this.isStarted = true; + this.isCanceled = false; + this.isFinished = false; } - public int getType() { - return type; + public int getReason() { + return reason; } public boolean isCanceled() { @@ -78,8 +82,12 @@ public abstract class CameraTransition<T> { return isStarted; } + public boolean isFinished() { + return isFinished; + } + public T getStartValue() { - if (startValue == null) { + if (!isStarted) { throw new RuntimeException("start or queue the transition first"); } return startValue; @@ -90,28 +98,28 @@ public abstract class CameraTransition<T> { } public double getStartTime() { - if (startTimeMillis <= 0) { + if (!isStarted) { throw new RuntimeException("start or queue the transition first"); } return startTimeMillis; } double getStartTimeNanos() { - if (startTimeNanos <= 0) { + if (!isStarted) { throw new RuntimeException("start or queue the transition first"); } return startTimeNanos; } public double getEndTime() { - if (endTimeMillis <= 0) { + if (!isStarted) { throw new RuntimeException("start or queue the transition first"); } return endTimeMillis; } double getEndTimeNanos() { - if (endTimeNanos <= 0) { + if (!isStarted) { throw new RuntimeException("start or queue the transition first"); } return endTimeNanos; @@ -121,18 +129,10 @@ public abstract class CameraTransition<T> { return durationMillis; } - double getDurationNanos() { - return durationNanos; - } - public double getDelay() { return delayMillis; } - double getDelayNanos() { - return delayNanos; - } - public Interpolator getInterpolator() { return interpolator; } @@ -166,12 +166,21 @@ public abstract class CameraTransition<T> { } void onCancel() { + this.isCanceled = true; for (Listener listener : listeners) { listener.onCancel(); } + onFinish(); } void onFinish() { + this.startTimeMillis = 0; + this.startTimeNanos = 0; + this.endTimeMillis = 0; + this.endTimeNanos = 0; + this.startValue = null; + this.isStarted = false; + this.isFinished = true; for (Listener listener : listeners) { listener.onFinish(); } 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 952cb4f20a..34bcd134db 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 @@ -26,8 +26,6 @@ public class MapCameraController { @NonNull private final Transform transform; - private volatile boolean destroyed; - private final Choreographer choreographer = Choreographer.getInstance(); MapCameraController(@NonNull final Transform transform) { @@ -44,22 +42,19 @@ public class MapCameraController { private final Choreographer.FrameCallback frameCallback = new Choreographer.FrameCallback() { @Override public void doFrame(long frameTimeNanos) { - if (destroyed) { - return; - } List<CameraTransition> canceled = new ArrayList<>(); Iterator<CameraTransition> iterator = runningTransitions.values().iterator(); while (iterator.hasNext()) { CameraTransition transition = iterator.next(); if (transition.isCanceled()) { - transition.onCancel(); iterator.remove(); canceled.add(transition); } } for (CameraTransition transition : canceled) { - startNextTransition(transition.getCameraProperty()); + transition.onCancel(); + checkNextTransition(transition.getCameraProperty()); } boolean shouldRun = false; @@ -80,7 +75,6 @@ public class MapCameraController { transform.moveCamera(builder.build()); } - List<CameraTransition> finished = new ArrayList<>(); iterator = runningTransitions.values().iterator(); while (iterator.hasNext()) { @@ -88,14 +82,14 @@ public class MapCameraController { transition.onProgress(); if (transition.isFinishing()) { - transition.onFinish(); iterator.remove(); finished.add(transition); } } for (CameraTransition transition : finished) { - startNextTransition(transition.getCameraProperty()); + transition.onFinish(); + checkNextTransition(transition.getCameraProperty()); } choreographer.postFrameCallback(this); @@ -111,7 +105,6 @@ public class MapCameraController { if (resultingTransition != transition && resultingTransition != runningTransition) { throw new UnsupportedOperationException(); } else if (resultingTransition != transition) { - transition.cancel(); transition.onCancel(); } else { runningTransition.cancel(); @@ -119,7 +112,7 @@ public class MapCameraController { } } else { long time = System.nanoTime(); - transition.initTime(getCameraPropertyValue(transition.getCameraProperty()), time); + transition.onStart(getCameraPropertyValue(transition.getCameraProperty()), time); runningTransitions.put(transition.getCameraProperty(), transition); } } @@ -135,6 +128,42 @@ public class MapCameraController { } } + public void cancelQueuedTransitions() { + List<CameraTransition> canceled = new ArrayList<>(); + for (List<CameraTransition> transitions : queuedTransitions.values()) { + Iterator<CameraTransition> iterator = transitions.iterator(); + while (iterator.hasNext()) { + CameraTransition transition = iterator.next(); + iterator.remove(); + canceled.add(transition); + } + } + + for (CameraTransition transition : canceled) { + transition.onCancel(); + } + } + + public void cancelRunningTransitions() { + List<CameraTransition> canceled = new ArrayList<>(); + Iterator<CameraTransition> iterator = runningTransitions.values().iterator(); + while (iterator.hasNext()) { + CameraTransition transition = iterator.next(); + iterator.remove(); + canceled.add(transition); + } + + for (CameraTransition transition : canceled) { + transition.onCancel(); + checkNextTransition(transition.getCameraProperty()); + } + } + + public void cancelAllTransitions() { + cancelQueuedTransitions(); + cancelRunningTransitions(); + } + @NonNull public HashMap<Integer, LinkedList<CameraTransition>> getQueuedTransitions() { return new HashMap<>(queuedTransitions); @@ -155,19 +184,8 @@ public class MapCameraController { } void onDestroy() { - destroyed = true; - - for (List<CameraTransition> transitions : queuedTransitions.values()) { - for (CameraTransition transition : transitions) { - transition.onCancel(); - } - } - queuedTransitions.clear(); - - for (CameraTransition transition : runningTransitions.values()) { - transition.onCancel(); - } - runningTransitions.clear(); + cancelAllTransitions(); + choreographer.removeFrameCallback(frameCallback); } private static void setCameraProperty(CameraPosition.Builder builder, int property, Object value) { @@ -231,11 +249,13 @@ public class MapCameraController { } } - private void startNextTransition(int cameraProperty) { - LinkedList<CameraTransition> queue = queuedTransitions.get(cameraProperty); - assert queue != null; - if (!queue.isEmpty()) { - startTransition(queue.pop()); + private void checkNextTransition(int cameraProperty) { + if (runningTransitions.get(cameraProperty) == null) { + LinkedList<CameraTransition> queue = queuedTransitions.get(cameraProperty); + assert queue != null; + if (!queue.isEmpty()) { + startTransition(queue.pop()); + } } } @@ -251,16 +271,16 @@ public class MapCameraController { @Override public void animationScheduled(MapCameraController controller, CameraTransition transition) { - if (transition.getType() == CameraTransition.TYPE_GESTURE) { + if (transition.getReason() == CameraTransition.REASON_GESTURE) { for (CameraTransition currentTransition : controller.getRunningTransitions().values()) { - if (currentTransition.getType() != CameraTransition.TYPE_GESTURE) { + if (currentTransition.getReason() != CameraTransition.REASON_GESTURE) { currentTransition.cancel(); } } for (List<CameraTransition> currentTransitions : controller.getQueuedTransitions().values()) { for (CameraTransition currentTransition : currentTransitions) { - if (currentTransition.getType() != CameraTransition.TYPE_GESTURE) { + if (currentTransition.getReason() != CameraTransition.REASON_GESTURE) { currentTransition.cancel(); } } |