diff options
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 |
commit | 89038a11f13682d4388f9ac05d86c21f85a523be (patch) | |
tree | fd6d87b1cc5ce295d81b42823b24616b60449eb5 | |
parent | 6ab9a8dcb6864114e74d9e4d274343860997e5c7 (diff) | |
download | qtlocation-mapboxgl-89038a11f13682d4388f9ac05d86c21f85a523be.tar.gz |
[android][wip] camera zoom property
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); |