diff options
author | Łukasz Paczos <lukas.paczos@gmail.com> | 2019-09-05 15:08:25 +0200 |
---|---|---|
committer | Łukasz Paczos <lukas.paczos@gmail.com> | 2019-09-05 15:08:25 +0200 |
commit | 641a7c242d8119b05f93d53ead9991008a39b431 (patch) | |
tree | 3f86ed1ca4b940e30e83787882cba8a4819c9b76 | |
parent | 1e8dc003508cc3cc7fc6ff2ef05f9f84d21eee73 (diff) | |
download | qtlocation-mapboxgl-641a7c242d8119b05f93d53ead9991008a39b431.tar.gz |
[android][wip] camera transitions listeners
2 files changed, 46 insertions, 14 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 c84455d27f..4a1828f9a6 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 @@ -3,6 +3,8 @@ package com.mapbox.mapboxsdk.maps; import android.support.v4.view.animation.PathInterpolatorCompat; import android.view.animation.Interpolator; +import java.util.concurrent.CopyOnWriteArrayList; + public abstract class CameraTransition<T> { public static final int TYPE_ANY = 0; @@ -12,13 +14,15 @@ public abstract class CameraTransition<T> { 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); - static final int PROPERTY_CENTER = 0; + public static final int PROPERTY_CENTER = 0; static final int PROPERTY_ZOOM = 1; static final int PROPERTY_PITCH = 2; static final int PROPERTY_BEARING = 3; static final int PROPERTY_ANCHOR = 4; static final int PROPERTY_PADDING = 5; + private final CopyOnWriteArrayList<Listener> listeners = new CopyOnWriteArrayList<>(); + private final int type; private T startValue; @@ -62,6 +66,10 @@ public abstract class CameraTransition<T> { isCanceled = true; } + public boolean isStarted() { + return isStarted; + } + public T getStartValue() { if (startValue == null) { throw new RuntimeException("start or queue the transition first"); @@ -99,16 +107,20 @@ public abstract class CameraTransition<T> { return interpolator; } + public void addListener(Listener listener) { + listeners.add(listener); + } + + public void removeListener(Listener listener) { + listeners.remove(listener); + } + T onFrame(double currentTime) { double animationPosition = (currentTime - startTime) / duration; double fraction = interpolator.getInterpolation((float) animationPosition); return getAnimatedValue(fraction); } - public boolean isStarted() { - return isStarted; - } - boolean isFinishing() { return isFinishing; } @@ -117,16 +129,35 @@ public abstract class CameraTransition<T> { isFinishing = true; } + public void onProgress() { + for (Listener listener : listeners) { + listener.onProgress(); + } + } + void onCancel() { - // todo camera - notify listeners + for (Listener listener : listeners) { + listener.onCancel(); + } } void onFinish() { - // todo camera - notify listeners + for (Listener listener : listeners) { + listener.onFinish(); + } } abstract int getCameraProperty(); // todo camera - make protected? abstract T getAnimatedValue(double fraction); + + public interface Listener { + + void onProgress(); + + void onCancel(); + + void 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 eb6873dee7..ffbb19d23a 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 @@ -83,6 +83,8 @@ public class MapCameraController { Iterator<CameraTransition> iterator = runningTransitions.values().iterator(); while (iterator.hasNext()) { CameraTransition transition = iterator.next(); + transition.onProgress(); + if (transition.isFinishing()) { transition.onFinish(); iterator.remove(); @@ -150,9 +152,6 @@ public class MapCameraController { } public void startTransition(CameraTransition transition) { - long time = System.currentTimeMillis(); - transition.initTime(getCameraPropertyValue(transition.getCameraProperty()), time); - synchronized (runningTransitionsLock) { behavior.animationScheduled(this, transition); @@ -162,13 +161,15 @@ public class MapCameraController { if (resultingTransition != transition && resultingTransition != runningTransition) { throw new UnsupportedOperationException(); } else if (resultingTransition != transition) { - // todo camera - invoke cancel callback right away transition.cancel(); + transition.onCancel(); } else { runningTransition.cancel(); - runningTransitions.put(transition.getCameraProperty(), transition); + queuedTransitions.get(transition.getCameraProperty()).push(transition); } } else { + long time = System.currentTimeMillis(); + transition.initTime(getCameraPropertyValue(transition.getCameraProperty()), time); runningTransitions.put(transition.getCameraProperty(), transition); } } @@ -187,12 +188,12 @@ public class MapCameraController { @NonNull public HashMap<Integer, LinkedList<CameraTransition>> getQueuedTransitions() { - return queuedTransitions; + return new HashMap<>(queuedTransitions); } @NonNull public HashMap<Integer, CameraTransition> getRunningTransitions() { - return runningTransitions; + return new HashMap<>(runningTransitions); } @NonNull |