From bd0f0d3a217ceef6a4b3681fbc4b9c4fe4be1f06 Mon Sep 17 00:00:00 2001 From: Tobrun Van Nuland Date: Thu, 26 May 2016 13:27:55 +0200 Subject: [PATCH] [android] #3629 - smooth MyLocationView animation when tracking the user location, introducing a new easeTo method with a linear interpolator --- .../main/java/com/mapbox/mapboxsdk/maps/MapView.java | 4 ++-- .../java/com/mapbox/mapboxsdk/maps/MapboxMap.java | 12 +++++++++++- .../com/mapbox/mapboxsdk/maps/NativeMapView.java | 6 +++--- .../mapboxsdk/maps/widgets/MyLocationView.java | 10 ++++------ platform/android/src/jni.cpp | 10 +++++++--- 5 files changed, 27 insertions(+), 15 deletions(-) diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java index 9ec4a9018..403f58153 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapView.java @@ -1182,7 +1182,7 @@ public class MapView extends FrameLayout { mNativeMapView.jumpTo(bearing, center, pitch, zoom); } - void easeTo(double bearing, LatLng center, long duration, double pitch, double zoom, @Nullable final MapboxMap.CancelableCallback cancelableCallback) { + void easeTo(double bearing, LatLng center, long duration, double pitch, double zoom, boolean easingInterpolator, @Nullable final MapboxMap.CancelableCallback cancelableCallback) { if (mDestroyed) { return; } @@ -1203,7 +1203,7 @@ public class MapView extends FrameLayout { }); } - mNativeMapView.easeTo(bearing, center, duration, pitch, zoom); + mNativeMapView.easeTo(bearing, center, duration, pitch, zoom, easingInterpolator); } void flyTo(double bearing, LatLng center, long duration, double pitch, double zoom, @Nullable final MapboxMap.CancelableCallback cancelableCallback) { diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java index 77cfff184..62cb74979 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapboxMap.java @@ -331,8 +331,18 @@ public class MapboxMap { */ @UiThread public final void easeCamera(CameraUpdate update, int durationMs, final MapboxMap.CancelableCallback callback) { + easeCamera(update, durationMs, true, callback); + } + + @UiThread + public final void easeCamera(CameraUpdate update, int durationMs, boolean easingInterpolator) { + easeCamera(update, durationMs, easingInterpolator, null); + } + + @UiThread + public final void easeCamera(CameraUpdate update, int durationMs, boolean easingInterpolator, final MapboxMap.CancelableCallback callback) { mCameraPosition = update.getCameraPosition(this); - mMapView.easeTo(mCameraPosition.bearing, mCameraPosition.target, getDurationNano(durationMs), mCameraPosition.tilt, mCameraPosition.zoom, new CancelableCallback() { + mMapView.easeTo(mCameraPosition.bearing, mCameraPosition.target, getDurationNano(durationMs), mCameraPosition.tilt, mCameraPosition.zoom, easingInterpolator, new CancelableCallback() { @Override public void onCancel() { if (callback != null) { 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 bf342bdb4..6298795e6 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 @@ -446,8 +446,8 @@ final class NativeMapView { nativeJumpTo(mNativeMapViewPtr, angle, center, pitch, zoom); } - public void easeTo(double angle, LatLng center, long duration, double pitch, double zoom) { - nativeEaseTo(mNativeMapViewPtr, angle, center, duration, pitch, zoom); + public void easeTo(double angle, LatLng center, long duration, double pitch, double zoom, boolean easingInterpolator) { + nativeEaseTo(mNativeMapViewPtr, angle, center, duration, pitch, zoom, easingInterpolator); } public void flyTo(double angle, LatLng center, long duration, double pitch, double zoom) { @@ -641,7 +641,7 @@ final class NativeMapView { private native void nativeJumpTo(long nativeMapViewPtr, double angle, LatLng center, double pitch, double zoom); - private native void nativeEaseTo(long nativeMapViewPtr, double angle, LatLng center, long duration, double pitch, double zoom); + private native void nativeEaseTo(long nativeMapViewPtr, double angle, LatLng center, long duration, double pitch, double zoom, boolean easingInterpolator); private native void nativeFlyTo(long nativeMapViewPtr, double angle, LatLng center, long duration, double pitch, double zoom); diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationView.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationView.java index 8b5a347d0..916adb4c0 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationView.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/widgets/MyLocationView.java @@ -120,7 +120,6 @@ public class MyLocationView extends View { throw new RuntimeException("The dimensions from location and bearing drawables should be match"); } - foregroundDrawable = defaultDrawable; foregroundBearingDrawable = bearingDrawable; setForegroundDrawableTint(foregroundTintColor); @@ -594,8 +593,7 @@ public class MyLocationView extends View { if (previousUpdateTimeStamp == 0) { locationUpdateDuration = 0; } else { - // TODO remove 10 * hack to multiply duration to workaround easing interpolation (easeCamera) - locationUpdateDuration = 10 * (locationUpdateTimestamp - previousUpdateTimeStamp); + locationUpdateDuration = locationUpdateTimestamp - previousUpdateTimeStamp; } // calculate interpolated location @@ -613,7 +611,6 @@ public class MyLocationView extends View { } gpsDirection = 0; setCompass(gpsDirection); -// } } else if (myBearingTrackingMode == MyBearingTracking.COMPASS) { if (!compassListener.isPaused()) { builder.bearing(compassListener.getCurrentDegree()); @@ -622,10 +619,11 @@ public class MyLocationView extends View { } } + // accuracy updateAccuracy(location); - // animate to new camera - mapboxMap.easeCamera(CameraUpdateFactory.newCameraPosition(builder.build()), (int) locationUpdateDuration, null); + // ease to new camera position with a linear interpolator + mapboxMap.easeCamera(CameraUpdateFactory.newCameraPosition(builder.build()), (int) locationUpdateDuration, false /*linear interpolator*/); } @Override diff --git a/platform/android/src/jni.cpp b/platform/android/src/jni.cpp index ddbb6a768..d87eb434b 100755 --- a/platform/android/src/jni.cpp +++ b/platform/android/src/jni.cpp @@ -1177,7 +1177,7 @@ void nativeJumpTo(JNIEnv *env, jni::jobject* obj, jlong nativeMapViewPtr, jdoubl nativeMapView->getMap().jumpTo(options); } -void nativeEaseTo(JNIEnv *env, jni::jobject* obj, jlong nativeMapViewPtr, jdouble angle, jni::jobject* centerLatLng, jlong duration, jdouble pitch, jdouble zoom) { +void nativeEaseTo(JNIEnv *env, jni::jobject* obj, jlong nativeMapViewPtr, jdouble angle, jni::jobject* centerLatLng, jlong duration, jdouble pitch, jdouble zoom, jboolean easing) { mbgl::Log::Debug(mbgl::Event::JNI, "nativeEaseTo"); assert(nativeMapViewPtr != 0); NativeMapView *nativeMapView = reinterpret_cast(nativeMapViewPtr); @@ -1200,6 +1200,11 @@ void nativeEaseTo(JNIEnv *env, jni::jobject* obj, jlong nativeMapViewPtr, jdoubl mbgl::AnimationOptions animationOptions; animationOptions.duration.emplace(mbgl::Duration(duration)); + if (!easing) { + // add a linear interpolator instead of easing + animationOptions.easing = mbgl::util::UnitBezier(0, 0, 1, 1); + } + nativeMapView->getMap().easeTo(cameraOptions, animationOptions); } @@ -1210,7 +1215,6 @@ void nativeSetContentPadding(JNIEnv *env, jni::jobject* obj,long nativeMapViewPt nativeMapView->setInsets({top, left, bottom, right}); } - void nativeFlyTo(JNIEnv *env, jni::jobject* obj, jlong nativeMapViewPtr, jdouble angle, jni::jobject* centerLatLng, jlong duration, jdouble pitch, jdouble zoom) { mbgl::Log::Debug(mbgl::Event::JNI, "nativeFlyTo"); assert(nativeMapViewPtr != 0); @@ -1868,7 +1872,7 @@ extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM *vm, void *reserved) { MAKE_NATIVE_METHOD(nativeLatLngForPixel, "(JLandroid/graphics/PointF;)Lcom/mapbox/mapboxsdk/geometry/LatLng;"), MAKE_NATIVE_METHOD(nativeGetTopOffsetPixelsForAnnotationSymbol, "(JLjava/lang/String;)D"), MAKE_NATIVE_METHOD(nativeJumpTo, "(JDLcom/mapbox/mapboxsdk/geometry/LatLng;DD)V"), - MAKE_NATIVE_METHOD(nativeEaseTo, "(JDLcom/mapbox/mapboxsdk/geometry/LatLng;JDD)V"), + MAKE_NATIVE_METHOD(nativeEaseTo, "(JDLcom/mapbox/mapboxsdk/geometry/LatLng;JDDZ)V"), MAKE_NATIVE_METHOD(nativeFlyTo, "(JDLcom/mapbox/mapboxsdk/geometry/LatLng;JDD)V"), MAKE_NATIVE_METHOD(nativeAddCustomLayer, "(JLcom/mapbox/mapboxsdk/layers/CustomLayer;Ljava/lang/String;)V"), MAKE_NATIVE_METHOD(nativeRemoveCustomLayer, "(JLjava/lang/String;)V"),