summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorŁukasz Paczos <lukas.paczos@gmail.com>2019-09-03 17:19:32 +0200
committerŁukasz Paczos <lukas.paczos@gmail.com>2019-09-03 17:19:32 +0200
commit89038a11f13682d4388f9ac05d86c21f85a523be (patch)
treefd6d87b1cc5ce295d81b42823b24616b60449eb5
parent6ab9a8dcb6864114e74d9e4d274343860997e5c7 (diff)
downloadqtlocation-mapboxgl-89038a11f13682d4388f9ac05d86c21f85a523be.tar.gz
[android][wip] camera zoom property
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/CameraTransition.java18
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapCameraController.java77
-rwxr-xr-xplatform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java13
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/TargetCameraTransition.java2
-rw-r--r--platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/ZoomCameraTransition.java20
-rwxr-xr-xplatform/android/src/native_map_view.cpp6
-rwxr-xr-xplatform/android/src/native_map_view.hpp2
7 files changed, 87 insertions, 51 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 23729cbc6c..c84455d27f 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
@@ -29,7 +29,8 @@ public abstract class CameraTransition<T> {
private final double duration;
private final double delay;
- private boolean canceled;
+ private boolean isCanceled;
+ private boolean isStarted;
private boolean isFinishing;
private final Interpolator interpolator;
@@ -42,13 +43,11 @@ public abstract class CameraTransition<T> {
this.interpolator = interpolator;
}
- void initTime(double currentTime) {
+ void initTime(T startValue, double currentTime) {
this.startTime = currentTime + delay;
this.endTime = this.startTime + duration;
- }
-
- void setStartValue(T startValue) {
this.startValue = startValue;
+ this.isStarted = true;
}
public int getType() {
@@ -56,11 +55,11 @@ public abstract class CameraTransition<T> {
}
public boolean isCanceled() {
- return canceled;
+ return isCanceled;
}
public void cancel() {
- canceled = true;
+ isCanceled = true;
}
public T getStartValue() {
@@ -106,6 +105,10 @@ public abstract class CameraTransition<T> {
return getAnimatedValue(fraction);
}
+ public boolean isStarted() {
+ return isStarted;
+ }
+
boolean isFinishing() {
return isFinishing;
}
@@ -124,5 +127,6 @@ public abstract class CameraTransition<T> {
abstract int getCameraProperty();
+ // todo camera - make protected?
abstract T getAnimatedValue(double fraction);
}
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 e9834ce255..27c8f188e4 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
@@ -5,6 +5,7 @@ import android.os.Looper;
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;
@@ -41,7 +42,7 @@ public class MapCameraController {
}
final CameraPosition update = cameraPosition;
- if (!runningTransitions.isEmpty()) {
+ if (!runningTransitions.isEmpty() && update != null) {
handler.post(new Runnable() {
@Override
public void run() {
@@ -54,8 +55,14 @@ public class MapCameraController {
transition.onCancel();
iterator.remove();
CameraPosition.Builder builder = new CameraPosition.Builder(finalUpdate);
- if (transition.getCameraProperty() == CameraTransition.PROPERTY_CENTER) {
- builder.target(null);
+ switch (transition.getCameraProperty()) {
+ case CameraTransition.PROPERTY_CENTER:
+ builder.target(null);
+ break;
+
+ case CameraTransition.PROPERTY_ZOOM:
+ builder.zoom(-1);
+ break;
}
finalUpdate = builder.build();
}
@@ -63,10 +70,7 @@ public class MapCameraController {
// todo camera - check if update is noop, abort then
- if (finalUpdate != null && finalUpdate.target != null) {
- // todo camera - remove if-check
- transform.moveCamera(finalUpdate);
- }
+ transform.moveCamera(finalUpdate);
iterator = runningTransitions.values().iterator();
while (iterator.hasNext()) {
@@ -83,34 +87,37 @@ public class MapCameraController {
// todo camera - what's the correct delay not to flood and block the main thread?
double nextFrameTime = System.currentTimeMillis() + 5;
- if (!runningTransitions.isEmpty()) {
- boolean willRun = false;
- for (CameraTransition transition : runningTransitions.values()) {
- if (transition.getStartTime() <= nextFrameTime) {
- willRun = true;
- break;
- }
+ boolean willRun = false;
+ for (CameraTransition transition : runningTransitions.values()) {
+ if (transition.getStartTime() <= nextFrameTime) {
+ willRun = true;
+ break;
}
+ }
+
+ if (willRun) {
+ CameraPosition.Builder builder = new CameraPosition.Builder();
- if (willRun) {
- CameraPosition.Builder builder = new CameraPosition.Builder();
-
- TargetCameraTransition targetCameraTransition =
- (TargetCameraTransition) runningTransitions.get(CameraTransition.PROPERTY_CENTER);
- if (targetCameraTransition != null && targetCameraTransition.getStartTime() <= nextFrameTime) {
- if (nextFrameTime >= targetCameraTransition.getEndTime()) {
- builder.target(targetCameraTransition.getEndValue());
- targetCameraTransition.setFinishing();
- } else {
- builder.target(targetCameraTransition.onFrame(nextFrameTime));
+ for (CameraTransition transition : runningTransitions.values()) {
+ if (transition.getStartTime() <= nextFrameTime) {
+ if (nextFrameTime >= transition.getEndTime()) {
+ transition.setFinishing();
}
- cameraPosition = builder.build();
+ Object value = transition.isFinishing() ? transition.getEndValue() : transition.onFrame(nextFrameTime);
+ switch (transition.getCameraProperty()) {
+ case CameraTransition.PROPERTY_CENTER:
+ builder.target((LatLng) value);
+ break;
+
+ case CameraTransition.PROPERTY_ZOOM:
+ builder.zoom((double) value);
+ break;
+ }
}
- } else {
- cameraPosition = null;
}
+ cameraPosition = builder.build();
} else {
cameraPosition = null;
}
@@ -133,11 +140,13 @@ public class MapCameraController {
}
public void startTransition(final CameraTransition transition) {
- transition.initTime(System.currentTimeMillis());
+ long time = System.currentTimeMillis();
switch (transition.getCameraProperty()) {
case CameraTransition.PROPERTY_CENTER:
- transition.setStartValue(transform.getCameraPosition().target);
+ transition.initTime(transform.getCameraPosition().target, time);
break;
+ case CameraTransition.PROPERTY_ZOOM:
+ transition.initTime(transform.getCameraPosition().zoom, time);
}
behavior.animationScheduled(this, transition);
@@ -152,10 +161,10 @@ public class MapCameraController {
transition.cancel();
} else {
runningTransition.cancel();
- schedule(transition);
+ runningTransitions.put(transition.getCameraProperty(), transition);
}
} else {
- schedule(transition);
+ runningTransitions.put(transition.getCameraProperty(), transition);
}
}
@@ -195,10 +204,6 @@ public class MapCameraController {
CameraTransition resolve(CameraTransition currentTransition, CameraTransition interruptingTransition);
}
- private void schedule(CameraTransition transition) {
- runningTransitions.put(transition.getCameraProperty(), transition);
- }
-
public static class DefaultCameraBehavior implements CameraBehavior {
@Override
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java
index 8496160c7e..fb9a83972b 100755
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/NativeMapView.java
@@ -668,12 +668,17 @@ final class NativeMapView implements NativeMap {
}
@Override
- public void jumpTo(@NonNull LatLng center, double zoom, double pitch, double angle, double[] padding) {
+ public void jumpTo(@Nullable LatLng center, double zoom, double pitch, double angle, double[] padding) {
if (checkState("jumpTo")) {
return;
}
- nativeJumpTo(angle, center.getLatitude(), center.getLongitude(), pitch, zoom,
- getAnimationPaddingAndClearCachedInsets(padding));
+ nativeJumpTo(
+ angle,
+ center != null ? new double[] {center.getLatitude(), center.getLongitude()} : null,
+ pitch,
+ zoom,
+ getAnimationPaddingAndClearCachedInsets(padding)
+ );
}
@Override
@@ -1266,7 +1271,7 @@ final class NativeMapView implements NativeMap {
private native double nativeGetTopOffsetPixelsForAnnotationSymbol(String symbolName);
@Keep
- private native void nativeJumpTo(double angle, double latitude, double longitude, double pitch, double zoom,
+ private native void nativeJumpTo(double angle, double[] center, double pitch, double zoom,
double[] padding);
@Keep
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/TargetCameraTransition.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/TargetCameraTransition.java
index 54eda43092..f3fa423308 100644
--- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/TargetCameraTransition.java
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/TargetCameraTransition.java
@@ -8,7 +8,7 @@ public class TargetCameraTransition extends CameraTransition<LatLng> {
private final LatLng latLng = new LatLng();
- public TargetCameraTransition(int type, long delay, long duration, LatLng endValue, Interpolator interpolator) {
+ public TargetCameraTransition(int type, long duration, long delay, LatLng endValue, Interpolator interpolator) {
super(type, duration, delay, endValue, interpolator);
}
diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/ZoomCameraTransition.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/ZoomCameraTransition.java
new file mode 100644
index 0000000000..073aba4deb
--- /dev/null
+++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/ZoomCameraTransition.java
@@ -0,0 +1,20 @@
+package com.mapbox.mapboxsdk.maps;
+
+import android.view.animation.Interpolator;
+
+public class ZoomCameraTransition extends CameraTransition<Double> {
+
+ public ZoomCameraTransition(int type, double duration, double delay, Double endValue, Interpolator interpolator) {
+ super(type, duration, delay, endValue, interpolator);
+ }
+
+ @Override
+ int getCameraProperty() {
+ return PROPERTY_ZOOM;
+ }
+
+ @Override
+ Double getAnimatedValue(double fraction) {
+ return getStartValue() + ((getEndValue() - getStartValue()) * fraction);
+ }
+}
diff --git a/platform/android/src/native_map_view.cpp b/platform/android/src/native_map_view.cpp
index 8ef757de15..0544861751 100755
--- a/platform/android/src/native_map_view.cpp
+++ b/platform/android/src/native_map_view.cpp
@@ -336,12 +336,14 @@ void NativeMapView::moveBy(jni::JNIEnv&, jni::jdouble dx, jni::jdouble dy, jni::
map->moveBy({dx, dy}, animationOptions);
}
-void NativeMapView::jumpTo(jni::JNIEnv& env, jni::jdouble bearing, jni::jdouble latitude, jni::jdouble longitude, jni::jdouble pitch, jni::jdouble zoom, const jni::Array<jni::jdouble>& padding) {
+void NativeMapView::jumpTo(jni::JNIEnv& env, jni::jdouble bearing, const jni::Array<jni::jdouble>& center, jni::jdouble pitch, jni::jdouble zoom, const jni::Array<jni::jdouble>& padding) {
mbgl::CameraOptions options;
if (bearing != -1) {
options.bearing = bearing;
}
- options.center = mbgl::LatLng(latitude, longitude);
+ if (center) {
+ options.center = mbgl::LatLng(center.Get(env, 0), center.Get(env, 1));
+ }
if (padding) {
assert(padding.Length(env) == 4);
options.padding = mbgl::EdgeInsets{padding.Get(env, 0), padding.Get(env, 1),
diff --git a/platform/android/src/native_map_view.hpp b/platform/android/src/native_map_view.hpp
index 26567a003c..3b4c57438f 100755
--- a/platform/android/src/native_map_view.hpp
+++ b/platform/android/src/native_map_view.hpp
@@ -91,7 +91,7 @@ public:
void moveBy(jni::JNIEnv&, jni::jdouble, jni::jdouble, jni::jlong);
- void jumpTo(jni::JNIEnv&, jni::jdouble, jni::jdouble, jni::jdouble, jni::jdouble, jni::jdouble, const jni::Array<jni::jdouble>&);
+ void jumpTo(jni::JNIEnv&, jni::jdouble, const jni::Array<jni::jdouble>&, jni::jdouble, jni::jdouble, const jni::Array<jni::jdouble>&);
void easeTo(jni::JNIEnv&, jni::jdouble, jni::jdouble, jni::jdouble, jni::jlong, jni::jdouble, jni::jdouble, const jni::Array<jni::jdouble>&, jni::jboolean);