diff options
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 | 98 |
1 files changed, 14 insertions, 84 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 84d92e73dc..43fb08972b 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 @@ -10,9 +10,10 @@ import android.os.Handler; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.view.InputDevice; +import android.view.KeyEvent; import android.view.MotionEvent; +import android.view.View; import android.view.animation.DecelerateInterpolator; -import android.view.animation.LinearInterpolator; import com.mapbox.android.gestures.AndroidGesturesManager; import com.mapbox.android.gestures.MoveGestureDetector; @@ -44,13 +45,14 @@ import static com.mapbox.mapboxsdk.utils.MathUtils.normalize; /** * Manages gestures events on a MapView. */ -final class MapGestureDetector { +final class MapGestureDetector implements View.OnKeyListener { private final Transform transform; private final Projection projection; private final UiSettings uiSettings; private final AnnotationManager annotationManager; private final CameraChangeDispatcher cameraChangeDispatcher; + private boolean isZHeldDown = false; // new map touch API private final CopyOnWriteArrayList<MapboxMap.OnMapClickListener> onMapClickListenerList @@ -87,7 +89,6 @@ final class MapGestureDetector { private Animator scaleAnimator; private Animator rotateAnimator; - private Animator pitchAnimator; private final List<Animator> scheduledAnimators = new ArrayList<>(); /** @@ -106,6 +107,7 @@ final class MapGestureDetector { this.projection = projection; this.uiSettings = uiSettings; this.cameraChangeDispatcher = cameraChangeDispatcher; + view.setOnKeyListener(this); // Checking for context != null for testing purposes if (context != null) { @@ -118,6 +120,12 @@ final class MapGestureDetector { } } + @Override + public boolean onKey(View view, int i, KeyEvent keyEvent) { + MapGestureDetector.this.isZHeldDown = keyEvent.getKeyCode() == keyEvent.KEYCODE_Z; + return false; + } + private void initializeGestureListeners(@NonNull Context context, boolean attachDefaultListeners) { if (attachDefaultListeners) { StandardGestureListener standardGestureListener = new StandardGestureListener( @@ -253,7 +261,6 @@ final class MapGestureDetector { cancelAnimator(scaleAnimator); cancelAnimator(rotateAnimator); - cancelAnimator(pitchAnimator); dispatchCameraIdle(); } @@ -314,16 +321,9 @@ final class MapGestureDetector { // Get the vertical scroll amount, one click = 1 float scrollDist = event.getAxisValue(MotionEvent.AXIS_VSCROLL); - // Check whether a keyboard shift key is held down while the scrolling is happening. If so, - // tilt the map to scroll. More info at - // https://developer.android.com/reference/android/view/KeyEvent.html#META_SHIFT_ON - if (event.getMetaState() == 1) { - transform.setTilt(transform.getTilt() - scrollDist); - } else { - // Scale the map by the appropriate power of two factor - transform.zoomBy(scrollDist, new PointF(event.getX(), event.getY())); - } - + // Scale the map by the appropriate power of two factor. The map camera target doesn't + // change when scrolling in or out. + transform.zoomBy(scrollDist, new PointF(uiSettings.getWidth() / 2, uiSettings.getHeight() / 2)); return true; default: @@ -891,41 +891,6 @@ final class MapGestureDetector { } } - private Animator createPitchAnimator(double currentPitch, double pitchAddition, long animationTime) { - ValueAnimator animator = ValueAnimator.ofFloat((float) currentPitch, (float) (currentPitch + pitchAddition)); - animator.setDuration(animationTime); - animator.setInterpolator(new LinearInterpolator()); - animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { - - @Override - public void onAnimationUpdate(@NonNull ValueAnimator animation) { - Float floatValue = (Float) animation.getAnimatedValue(); - transform.setTilt(floatValue.doubleValue()); - } - }); - - animator.addListener(new AnimatorListenerAdapter() { - - @Override - public void onAnimationStart(Animator animation) { - transform.cancelTransitions(); - cameraChangeDispatcher.onCameraMoveStarted(REASON_API_ANIMATION); - } - - @Override - public void onAnimationCancel(Animator animation) { - transform.cancelTransitions(); - } - - @Override - public void onAnimationEnd(Animator animation) { - dispatchCameraIdle(); - } - }); - return animator; - } - - private Animator createScaleAnimator(double currentZoom, double zoomAddition, @NonNull final PointF animationFocalPoint, long animationTime) { ValueAnimator animator = ValueAnimator.ofFloat((float) currentZoom, (float) (currentZoom + zoomAddition)); @@ -972,26 +937,6 @@ final class MapGestureDetector { } /** - * Adjust the map camera so that the map's plane is tilted up. - * - * @param runImmediately if true, animation will be started right away, otherwise it will wait until - * {@link MotionEvent#ACTION_UP} is registered. - */ - void pitchCameraUpAnimated(boolean runImmediately) { - pitchAnimated(true, runImmediately); - } - - /** - * Adjust the map camera so that the map's plane is tilted down. - * - * @param runImmediately if true, animation will be started right away, otherwise it will wait until - * {@link MotionEvent#ACTION_UP} is registered. - */ - void pitchCameraDownAnimated(boolean runImmediately) { - pitchAnimated(false, runImmediately); - } - - /** * Zoom out by 1. * * @param zoomFocalPoint focal point of zoom animation @@ -1019,21 +964,6 @@ final class MapGestureDetector { } } - private void pitchAnimated(boolean pitchUp, boolean runImmediately) { - //canceling here as well, because when using a button it will not be canceled automatically by onDown() - cancelAnimator(pitchAnimator); - - pitchAnimator = createPitchAnimator( - transform.getTilt(), - pitchUp ? -5 : 5, - MapboxConstants.ANIMATION_DURATION); - if (runImmediately) { - pitchAnimator.start(); - } else { - scheduleAnimator(pitchAnimator); - } - } - private void dispatchCameraIdle() { // we need to dispatch camera idle callback only if there is no other gestures in progress if (noGesturesInProgress()) { |