From 212ea7a19ece8b98cb438db6079bc99c805b35b2 Mon Sep 17 00:00:00 2001 From: Leith Bade Date: Fri, 30 Oct 2015 14:14:03 +1100 Subject: [android] When pinch zooming lock rotation Fixes #813 --- .../java/com/mapbox/mapboxsdk/views/MapView.java | 35 ++++++++-------------- 1 file changed, 13 insertions(+), 22 deletions(-) (limited to 'android') diff --git a/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/MapView.java b/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/MapView.java index 13482c1ca2..24c1f10733 100644 --- a/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/MapView.java +++ b/android/MapboxGLAndroidSDK/src/main/java/com/mapbox/mapboxsdk/views/MapView.java @@ -178,6 +178,7 @@ public final class MapView extends FrameLayout { private ScaleGestureDetector mScaleGestureDetector; private RotateGestureDetector mRotateGestureDetector; private boolean mTwoTap = false; + private boolean mZoomStarted = false; // Shows zoom buttons private ZoomButtonsController mZoomButtonsController; @@ -2428,8 +2429,6 @@ public final class MapView extends FrameLayout { } // Fling the map - // TODO Google Maps also has a rotate and zoom fling - float ease = 0.25f; velocityX = velocityX * ease; @@ -2452,7 +2451,6 @@ public final class MapView extends FrameLayout { } // Called for drags - // TODO use MoveGestureDetector @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { if (!mScrollEnabled) { @@ -2460,8 +2458,7 @@ public final class MapView extends FrameLayout { } // Cancel any animation - mNativeMapView.cancelTransitions(); // TODO need to test canceling - // transitions with touch + mNativeMapView.cancelTransitions(); // Scroll the map mNativeMapView.moveBy(-distanceX / mScreenDensity, -distanceY / mScreenDensity); @@ -2479,7 +2476,6 @@ public final class MapView extends FrameLayout { long mBeginTime = 0; float mScaleFactor = 1.0f; - boolean mStarted = false; // Called when two fingers first touch the screen @Override @@ -2497,7 +2493,7 @@ public final class MapView extends FrameLayout { public void onScaleEnd(ScaleGestureDetector detector) { mBeginTime = 0; mScaleFactor = 1.0f; - mStarted = false; + mZoomStarted = false; } // Called each time one of the two fingers moves @@ -2509,23 +2505,22 @@ public final class MapView extends FrameLayout { } // If scale is large enough ignore a tap - // TODO: Google Maps seem to use a velocity rather than absolute - // value? mScaleFactor *= detector.getScaleFactor(); if ((mScaleFactor > 1.05f) || (mScaleFactor < 0.95f)) { - mStarted = true; + mZoomStarted = true; } // Ignore short touches in case it is a tap // Also ignore small scales long time = detector.getEventTime(); long interval = time - mBeginTime; - if (!mStarted && (interval <= ViewConfiguration.getTapTimeout())) { + if (!mZoomStarted && (interval <= ViewConfiguration.getTapTimeout())) { return false; } - // TODO complex decision between rotate or scale or both (see Google - // Maps app) + if (!mZoomStarted) { + return false; + } // Cancel any animation mNativeMapView.cancelTransitions(); @@ -2543,8 +2538,6 @@ public final class MapView extends FrameLayout { } // This class handles two finger rotate gestures - // TODO need way to single finger rotate - need to research how google maps - // does this - for phones with single touch, or when using mouse etc private class RotateGestureListener extends RotateGestureDetector.SimpleOnRotateGestureListener { long mBeginTime = 0; @@ -2579,10 +2572,9 @@ public final class MapView extends FrameLayout { } // If rotate is large enough ignore a tap - // TODO: Google Maps seem to use a velocity rather than absolute - // value, up to a point then they always rotate + // Also is zoom already started, don't rotate mTotalAngle += detector.getRotationDegreesDelta(); - if ((mTotalAngle > 5.0f) || (mTotalAngle < -5.0f)) { + if (!mZoomStarted && ((mTotalAngle > 10.0f) || (mTotalAngle < -10.0f))) { mStarted = true; } @@ -2594,10 +2586,9 @@ public final class MapView extends FrameLayout { return false; } - // TODO complex decision between rotate or scale or both (see Google - // Maps app). It seems if you start one or the other it takes more - // to start the other too. Haven't figured out what it uses to - // decide when to transition to both at the same time. + if (!mStarted) { + return false; + } // Cancel any animation mNativeMapView.cancelTransitions(); -- cgit v1.2.1