From 0b0d7b844a3f583bbdc729f9911f2db862e49384 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Paczos?= Date: Wed, 10 Jul 2019 19:36:13 +0200 Subject: [android] allow map panning after quick zoom is disabled but a phantom gesture is executed --- .../mapbox/mapboxsdk/maps/MapGestureDetector.java | 45 +++++++++++----------- 1 file changed, 23 insertions(+), 22 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 3f24ebe2ac..5003d62c46 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 @@ -75,9 +75,6 @@ final class MapGestureDetector { private AndroidGesturesManager gesturesManager; - // Manages when to ignore double-tap event because we've started the quick-zoom. See #14013. - private boolean executeDoubleTap; - private Animator scaleAnimator; private Animator rotateAnimator; private final List scheduledAnimators = new ArrayList<>(); @@ -110,7 +107,9 @@ final class MapGestureDetector { private void initializeGestureListeners(@NonNull Context context, boolean attachDefaultListeners) { if (attachDefaultListeners) { - StandardGestureListener standardGestureListener = new StandardGestureListener(); + StandardGestureListener standardGestureListener = new StandardGestureListener( + context.getResources().getDimension( + com.mapbox.android.gestures.R.dimen.mapbox_defaultScaleSpanSinceStartThreshold)); MoveGestureListener moveGestureListener = new MoveGestureListener(); ScaleGestureListener scaleGestureListener = new ScaleGestureListener( context.getResources().getDimension(R.dimen.mapbox_minimum_scale_velocity)); @@ -304,6 +303,14 @@ final class MapGestureDetector { } private final class StandardGestureListener extends StandardGestureDetector.SimpleStandardOnGestureListener { + + private PointF doubleTapFocalPoint; + private final float doubleTapMovementThreshold; + + StandardGestureListener(float doubleTapMovementThreshold) { + this.doubleTapMovementThreshold = doubleTapMovementThreshold; + } + @Override public boolean onDown(MotionEvent motionEvent) { return true; @@ -336,7 +343,7 @@ final class MapGestureDetector { public boolean onDoubleTapEvent(MotionEvent motionEvent) { int action = motionEvent.getActionMasked(); if (action == MotionEvent.ACTION_DOWN) { - executeDoubleTap = true; + doubleTapFocalPoint = new PointF(motionEvent.getX(), motionEvent.getY()); // disable the move detector in preparation for the quickzoom, // so that we don't move the map's center slightly before the quickzoom is started (see #14227) @@ -344,26 +351,27 @@ final class MapGestureDetector { } if (motionEvent.getActionMasked() == MotionEvent.ACTION_UP) { - if (executeDoubleTap) { - // re-enable the move detector only if we did not start the quickzoom, otherwise, re-enable in the #onScaleEnd - gesturesManager.getMoveGestureDetector().setEnabled(true); + // re-enable the move detector + gesturesManager.getMoveGestureDetector().setEnabled(true); + + float diffX = Math.abs(motionEvent.getX() - doubleTapFocalPoint.x); + float diffY = Math.abs(motionEvent.getY() - doubleTapFocalPoint.y); + if (diffX > doubleTapMovementThreshold || diffY > doubleTapMovementThreshold) { + // Ignore double-tap event because we've started the quick-zoom. See #14013. + return false; } - if (!uiSettings.isZoomGesturesEnabled() || !uiSettings.isDoubleTapGesturesEnabled() || !executeDoubleTap) { + if (!uiSettings.isZoomGesturesEnabled() || !uiSettings.isDoubleTapGesturesEnabled()) { return false; } - PointF zoomFocalPoint; // Single finger double tap if (constantFocalPoint != null) { // User provided focal point - zoomFocalPoint = constantFocalPoint; - } else { - // Zoom in on gesture - zoomFocalPoint = new PointF(motionEvent.getX(), motionEvent.getY()); + doubleTapFocalPoint = constantFocalPoint; } - zoomInAnimated(zoomFocalPoint, false); + zoomInAnimated(doubleTapFocalPoint, false); return true; } @@ -464,13 +472,6 @@ final class MapGestureDetector { @Override public boolean onScaleBegin(@NonNull StandardScaleGestureDetector detector) { quickZoom = detector.getPointersCount() == 1; - if (quickZoom) { - // Unfortunately, the double-tap event is returned by the framework when the second `ACTION_DOWN` event - // is registered in the right interval, regardless of the following `ACTION_MOVE` events. - // That's why, the quick-zoom gives us a handy reference when we've exceeded the movement threshold - // and we should ignore the double-tap. - executeDoubleTap = false; - } if (!uiSettings.isZoomGesturesEnabled()) { return false; -- cgit v1.2.1