summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
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
commit641a7c242d8119b05f93d53ead9991008a39b431 (patch)
tree3f86ed1ca4b940e30e83787882cba8a4819c9b76
parent1e8dc003508cc3cc7fc6ff2ef05f9f84d21eee73 (diff)
downloadqtlocation-mapboxgl-641a7c242d8119b05f93d53ead9991008a39b431.tar.gz
[android][wip] camera transitions listeners
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraTransition.java45
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapCameraController.java15
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