diff options
author | Tobrun Van Nuland <tobrun.van.nuland@gmail.com> | 2016-05-26 13:27:55 +0200 |
---|---|---|
committer | Tobrun Van Nuland <tobrun.van.nuland@gmail.com> | 2016-05-26 15:35:03 +0200 |
commit | bd0f0d3a217ceef6a4b3681fbc4b9c4fe4be1f06 (patch) | |
tree | 4eba0bde2bd61c1fac474ef1027d6e5f452c9bb1 /platform/android | |
parent | bdeabc492c80007eec0d1ae9a16b0e20fa483b4a (diff) | |
download | qtlocation-mapboxgl-bd0f0d3a217ceef6a4b3681fbc4b9c4fe4be1f06.tar.gz |
[android] #3629 - smooth MyLocationView animation when tracking the user location, introducing a new easeTo method with a linear interpolator
Diffstat (limited to 'platform/android')
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 9ec4a90187..403f581530 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 77cfff184b..62cb74979e 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 bf342bdb40..6298795e66 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 8b5a347d0c..916adb4c0a 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 ddbb6a7680..d87eb434b1 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<NativeMapView *>(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"), |