From 469ca9093f4178fa2cef9e11b5a5592bd226731a Mon Sep 17 00:00:00 2001 From: Chuck Greb <charles.greb@gmail.com> Date: Fri, 2 May 2014 14:49:33 -0400 Subject: [PATCH] Adds double tap to zoom --- .../org/oscim/layers/MapEventLayerTest.java | 47 +++++++++++++++++-- vtm/src/org/oscim/layers/MapEventLayer.java | 8 ++++ 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/vtm-tests/test/org/oscim/layers/MapEventLayerTest.java b/vtm-tests/test/org/oscim/layers/MapEventLayerTest.java index 17efb3f8..bb84499e 100644 --- a/vtm-tests/test/org/oscim/layers/MapEventLayerTest.java +++ b/vtm-tests/test/org/oscim/layers/MapEventLayerTest.java @@ -12,6 +12,7 @@ import org.oscim.map.ViewController; import static org.fest.assertions.api.Assertions.assertThat; import static org.mockito.Matchers.any; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -39,22 +40,58 @@ public class MapEventLayerTest { assertThat(layer).isNotNull(); } + @Test + public void doubleTap_shouldAnimateZoom() throws Exception { + simulateDoubleTap(); + verify(mockAnimator).animateZoom(300, 2, 0, 0); + } + + @Test + public void doubleTap_shouldAnimateZoomAfterDoubleTouchDrag() throws Exception { + simulateDoubleTouchDragUp(); + simulateDoubleTap(); + verify(mockAnimator).animateZoom(300, 2, 0, 0); + } + + @Test + public void doubleTouchDrag_shouldNotAnimateZoom() throws Exception { + simulateDoubleTouchDragUp(); + verify(mockAnimator, never()).animateZoom(any(long.class), any(double.class), + any(float.class), any(float.class)); + } + @Test public void doubleTouchDragUp_shouldDecreaseContentScale() throws Exception { - layer.onTouchEvent(new TestMotionEvent(MotionEvent.ACTION_DOWN, 1, 1)); - layer.onGesture(Gesture.DOUBLE_TAP, new TestMotionEvent(MotionEvent.ACTION_MOVE, 1, 0)); - layer.onTouchEvent(new TestMotionEvent(MotionEvent.ACTION_MOVE, 1, 0)); + simulateDoubleTouchDragUp(); verify(mockViewport).scaleMap(argumentCaptor.capture(), any(float.class), any(float.class)); assertThat(argumentCaptor.getValue()).isLessThan(1); } @Test public void doubleTouchDragDown_shouldIncreaseContentScale() throws Exception { + simulateDoubleTouchDragDown(); + verify(mockViewport).scaleMap(argumentCaptor.capture(), any(float.class), any(float.class)); + assertThat(argumentCaptor.getValue()).isGreaterThan(1); + } + + private void simulateDoubleTap() { + layer.onTouchEvent(new TestMotionEvent(MotionEvent.ACTION_DOWN, 1, 1)); + layer.onGesture(Gesture.DOUBLE_TAP, new TestMotionEvent(MotionEvent.ACTION_UP, 1, 1)); + layer.onTouchEvent(new TestMotionEvent(MotionEvent.ACTION_UP, 1, 1)); + } + + private void simulateDoubleTouchDragUp() { + layer.onTouchEvent(new TestMotionEvent(MotionEvent.ACTION_DOWN, 1, 1)); + layer.onGesture(Gesture.DOUBLE_TAP, new TestMotionEvent(MotionEvent.ACTION_MOVE, 1, 0)); + layer.onTouchEvent(new TestMotionEvent(MotionEvent.ACTION_MOVE, 1, 0)); + layer.onTouchEvent(new TestMotionEvent(MotionEvent.ACTION_UP, 1, 0)); + } + + private void simulateDoubleTouchDragDown() { layer.onTouchEvent(new TestMotionEvent(MotionEvent.ACTION_DOWN, 1, 1)); layer.onGesture(Gesture.DOUBLE_TAP, new TestMotionEvent(MotionEvent.ACTION_MOVE, 1, 2)); layer.onTouchEvent(new TestMotionEvent(MotionEvent.ACTION_MOVE, 1, 2)); - verify(mockViewport).scaleMap(argumentCaptor.capture(), any(float.class), any(float.class)); - assertThat(argumentCaptor.getValue()).isGreaterThan(1); + layer.onTouchEvent(new TestMotionEvent(MotionEvent.ACTION_UP, 1, 2)); } class TestMotionEvent extends MotionEvent { diff --git a/vtm/src/org/oscim/layers/MapEventLayer.java b/vtm/src/org/oscim/layers/MapEventLayer.java index ee93c40f..a30c4933 100644 --- a/vtm/src/org/oscim/layers/MapEventLayer.java +++ b/vtm/src/org/oscim/layers/MapEventLayer.java @@ -54,6 +54,7 @@ public class MapEventLayer extends Layer implements InputListener, GestureListen private boolean mDown; private boolean mDoubleTap; + private boolean mDrag; private float mPrevX1; private float mPrevY1; @@ -136,6 +137,12 @@ public class MapEventLayer extends Layer implements InputListener, GestureListen } if (action == MotionEvent.ACTION_UP) { mDown = false; + if (mDoubleTap && !mDrag) { + mMap.animator().animateZoom(300, 2, 0, 0); + } + + mDrag = false; + if (mStartMove < 0) return true; @@ -200,6 +207,7 @@ public class MapEventLayer extends Layer implements InputListener, GestureListen return true; } // FIXME limit scale properly + mDrag = true; mViewport.scaleMap(1 + my / (height / 6), 0, 0); mMap.updateMap(true); mStartMove = -1;