From 18971395d67d5014f571035382762f51be6ff2fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Paczos?= Date: Fri, 12 Jul 2019 15:29:30 +0200 Subject: [android] improve scale inertia --- .../java/com/mapbox/mapboxsdk/constants/MapboxConstants.java | 10 ++++++++++ .../java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java | 9 +++++++-- .../android/MapboxGLAndroidSDK/src/main/res/values/dimens.xml | 2 +- 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MapboxConstants.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MapboxConstants.java index d490fd3900..e9fc9e2e02 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MapboxConstants.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/constants/MapboxConstants.java @@ -78,6 +78,16 @@ public class MapboxConstants { */ public static final float ROTATION_THRESHOLD_INCREASE_WHEN_SCALING = 25f; + /** + * Maximum absolute zoom change for multi-pointer scale velocity animation + */ + public static final double MAX_ABSOLUTE_SCALE_VELOCITY_CHANGE = 2.5; + + /** + * Scale velocity animation duration multiplier. + */ + public static final double SCALE_VELOCITY_ANIMATION_DURATION_MULTIPLIER = 150; + /** * Time within which user needs to lift fingers for velocity animation to start. */ diff --git a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java index 74a864a6a1..77d59e1690 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java +++ b/platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java @@ -30,6 +30,8 @@ import java.util.List; import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; +import static com.mapbox.mapboxsdk.constants.MapboxConstants.MAX_ABSOLUTE_SCALE_VELOCITY_CHANGE; +import static com.mapbox.mapboxsdk.constants.MapboxConstants.SCALE_VELOCITY_ANIMATION_DURATION_MULTIPLIER; import static com.mapbox.mapboxsdk.constants.MapboxConstants.ZOOM_RATE; import static com.mapbox.mapboxsdk.maps.MapboxMap.OnCameraMoveStartedListener.REASON_API_GESTURE; @@ -558,7 +560,9 @@ final class MapGestureDetector { double zoomAddition = calculateScale(velocityXY, detector.isScalingOut()); double currentZoom = transform.getRawZoom(); PointF focalPoint = getScaleFocalPoint(detector); - long animationTime = (long) (Math.abs(zoomAddition) * 1000 / 4); + // (log(x + 1 / e^2) + 2) * 150, x=0 to 2.5 (MapboxConstants#MAX_ABSOLUTE_SCALE_VELOCITY_CHANGE) + long animationTime = (long) ((Math.log((Math.abs(zoomAddition)) + 1 / Math.pow(Math.E, 2)) + 2) + * SCALE_VELOCITY_ANIMATION_DURATION_MULTIPLIER); scaleAnimator = createScaleAnimator(currentZoom, zoomAddition, focalPoint, animationTime); scheduleAnimator(scaleAnimator); } @@ -578,7 +582,8 @@ final class MapGestureDetector { } private double calculateScale(double velocityXY, boolean isScalingOut) { - double zoomAddition = (float) Math.log(velocityXY / 1000 + 1); + double zoomAddition = velocityXY * MAX_ABSOLUTE_SCALE_VELOCITY_CHANGE * 1e-4; + zoomAddition = MathUtils.clamp(zoomAddition, 0, MAX_ABSOLUTE_SCALE_VELOCITY_CHANGE); if (isScalingOut) { zoomAddition = -zoomAddition; } diff --git a/platform/android/MapboxGLAndroidSDK/src/main/res/values/dimens.xml b/platform/android/MapboxGLAndroidSDK/src/main/res/values/dimens.xml index d2428d8d8f..161a9634d2 100644 --- a/platform/android/MapboxGLAndroidSDK/src/main/res/values/dimens.xml +++ b/platform/android/MapboxGLAndroidSDK/src/main/res/values/dimens.xml @@ -8,7 +8,7 @@ 18dp - 150dp + 225dp 100dp -- cgit v1.2.1