diff options
author | Łukasz Paczos <lukasz.paczos@mapbox.com> | 2018-01-15 13:47:06 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-01-15 13:47:06 +0100 |
commit | 5782b6be486f2bf88a3852cd4f6be3bafb7788d0 (patch) | |
tree | f10a6876d68f0bfdfb328f4284898cbe01550e4e /platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java | |
parent | b2aa8d6ca5d1b6eb7b6e52d817735eabea9d8de0 (diff) | |
download | qtlocation-mapboxgl-5782b6be486f2bf88a3852cd4f6be3bafb7788d0.tar.gz |
Camera callbacks for velocity animated movements (#10925)
* [android] camera listeners double invocation fix
* [android] invoking camera change callbacks for velocity animated movements
Diffstat (limited to 'platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java')
-rw-r--r-- | platform/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/maps/MapGestureDetector.java | 50 |
1 files changed, 39 insertions, 11 deletions
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 214fa22795..1788cb4428 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 @@ -28,6 +28,7 @@ import com.mapbox.services.android.telemetry.utils.TelemetryUtils; import java.util.concurrent.CopyOnWriteArrayList; +import static com.mapbox.mapboxsdk.maps.MapboxMap.OnCameraMoveStartedListener.REASON_API_ANIMATION; import static com.mapbox.mapboxsdk.maps.MapboxMap.OnCameraMoveStartedListener.REASON_API_GESTURE; /** @@ -78,9 +79,11 @@ final class MapGestureDetector { private boolean scaleGestureOccurred; private boolean recentScaleGestureOccurred; - private boolean scaleAnimating; private long scaleBeginTime; + private boolean scaleAnimating; + private boolean rotateAnimating; + private VelocityTracker velocityTracker; private boolean wasZoomingIn; private boolean wasClockwiseRotating; @@ -233,7 +236,10 @@ final class MapGestureDetector { MapboxTelemetry.getInstance().pushEvent(MapboxEventWrapper.buildMapDragEndEvent( getLocationFromGesture(event.getX(), event.getY()), transform)); scrollGestureOccurred = false; - cameraChangeDispatcher.onCameraIdle(); + + if (!scaleAnimating && !rotateAnimating) { + cameraChangeDispatcher.onCameraIdle(); + } } twoTap = false; @@ -615,7 +621,6 @@ final class MapGestureDetector { return; } - if (rotateGestureOccurred || quickZoom) { reset(); return; @@ -657,13 +662,23 @@ final class MapGestureDetector { @Override public void onAnimationUpdate(ValueAnimator animation) { - transform.setZoom((Float) animation.getAnimatedValue(), scalePointBegin); + transform.setZoom((Float) animation.getAnimatedValue(), scalePointBegin, 0, true); } }); animator.addListener(new AnimatorListenerAdapter() { + + @Override + public void onAnimationStart(Animator animation) { + cameraChangeDispatcher.onCameraMoveStarted(REASON_API_ANIMATION); + } + + @Override + public void onAnimationCancel(Animator animation) { + reset(); + } + @Override public void onAnimationEnd(Animator animation) { - super.onAnimationEnd(animation); reset(); } }); @@ -682,7 +697,6 @@ final class MapGestureDetector { private long beginTime = 0; private boolean started = false; - private boolean animating = false; // Called when two fingers first touch the screen @Override @@ -753,9 +767,9 @@ final class MapGestureDetector { } double angularVelocity = calculateVelocityVector(detector); - if (Math.abs(angularVelocity) > 0.001 && rotateGestureOccurred && !animating) { + if (Math.abs(angularVelocity) > 0.001 && rotateGestureOccurred && !rotateAnimating) { animateRotateVelocity(); - } else if (!animating) { + } else if (!rotateAnimating) { reset(); } } @@ -763,12 +777,16 @@ final class MapGestureDetector { private void reset() { beginTime = 0; started = false; - animating = false; + rotateAnimating = false; rotateGestureOccurred = false; + + if (!twoTap) { + cameraChangeDispatcher.onCameraIdle(); + } } private void animateRotateVelocity() { - animating = true; + rotateAnimating = true; double currentRotation = transform.getRawBearing(); double rotateAdditionDegrees = calculateVelocityInDegrees(); createAnimator(currentRotation, rotateAdditionDegrees).start(); @@ -811,9 +829,19 @@ final class MapGestureDetector { } }); animator.addListener(new AnimatorListenerAdapter() { + + @Override + public void onAnimationStart(Animator animation) { + cameraChangeDispatcher.onCameraMoveStarted(REASON_API_ANIMATION); + } + + @Override + public void onAnimationCancel(Animator animation) { + reset(); + } + @Override public void onAnimationEnd(Animator animation) { - super.onAnimationEnd(animation); reset(); } }); |