check minimal move before starting double-tap-zoom-drag
This commit is contained in:
parent
4e454ef84c
commit
0d8454a079
@ -16,7 +16,9 @@
|
|||||||
*/
|
*/
|
||||||
package org.oscim.layers;
|
package org.oscim.layers;
|
||||||
|
|
||||||
import org.oscim.backend.CanvasAdapter;
|
import static org.oscim.backend.CanvasAdapter.dpi;
|
||||||
|
import static org.oscim.utils.FastMath.withinSquaredDist;
|
||||||
|
|
||||||
import org.oscim.core.Tile;
|
import org.oscim.core.Tile;
|
||||||
import org.oscim.event.Event;
|
import org.oscim.event.Event;
|
||||||
import org.oscim.event.Gesture;
|
import org.oscim.event.Gesture;
|
||||||
@ -25,7 +27,6 @@ import org.oscim.event.MotionEvent;
|
|||||||
import org.oscim.map.Map;
|
import org.oscim.map.Map;
|
||||||
import org.oscim.map.Map.InputListener;
|
import org.oscim.map.Map.InputListener;
|
||||||
import org.oscim.map.ViewController;
|
import org.oscim.map.ViewController;
|
||||||
import org.oscim.utils.FastMath;
|
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
@ -54,7 +55,7 @@ public class MapEventLayer extends Layer implements InputListener, GestureListen
|
|||||||
|
|
||||||
private boolean mDown;
|
private boolean mDown;
|
||||||
private boolean mDoubleTap;
|
private boolean mDoubleTap;
|
||||||
private boolean mDrag;
|
private boolean mDragZoom;
|
||||||
|
|
||||||
private float mPrevX1;
|
private float mPrevX1;
|
||||||
private float mPrevY1;
|
private float mPrevY1;
|
||||||
@ -116,14 +117,14 @@ public class MapEventLayer extends Layer implements InputListener, GestureListen
|
|||||||
if (action == MotionEvent.ACTION_DOWN) {
|
if (action == MotionEvent.ACTION_DOWN) {
|
||||||
mMap.animator().cancel();
|
mMap.animator().cancel();
|
||||||
|
|
||||||
mDoubleTap = false;
|
|
||||||
mStartMove = -1;
|
mStartMove = -1;
|
||||||
mDown = true;
|
mDoubleTap = false;
|
||||||
mDrag = false;
|
mDragZoom = false;
|
||||||
|
|
||||||
mPrevX1 = e.getX(0);
|
mPrevX1 = e.getX(0);
|
||||||
mPrevY1 = e.getY(0);
|
mPrevY1 = e.getY(0);
|
||||||
|
|
||||||
|
mDown = true;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!(mDown || mDoubleTap)) {
|
if (!(mDown || mDoubleTap)) {
|
||||||
@ -132,11 +133,12 @@ public class MapEventLayer extends Layer implements InputListener, GestureListen
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (action == MotionEvent.ACTION_MOVE) {
|
if (action == MotionEvent.ACTION_MOVE) {
|
||||||
return onActionMove(e);
|
onActionMove(e);
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
if (action == MotionEvent.ACTION_UP) {
|
if (action == MotionEvent.ACTION_UP) {
|
||||||
mDown = false;
|
mDown = false;
|
||||||
if (mDoubleTap && !mDrag) {
|
if (mDoubleTap && !mDragZoom) {
|
||||||
/* handle double tap zoom */
|
/* handle double tap zoom */
|
||||||
mMap.animator().animateZoom(300, 2,
|
mMap.animator().animateZoom(300, 2,
|
||||||
mPrevX1 - mMap.getWidth() / 2,
|
mPrevX1 - mMap.getWidth() / 2,
|
||||||
@ -156,9 +158,7 @@ public class MapEventLayer extends Layer implements InputListener, GestureListen
|
|||||||
vx *= t * t;
|
vx *= t * t;
|
||||||
}
|
}
|
||||||
doFling(vx, vy);
|
doFling(vx, vy);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (action == MotionEvent.ACTION_CANCEL) {
|
if (action == MotionEvent.ACTION_CANCEL) {
|
||||||
@ -181,7 +181,7 @@ public class MapEventLayer extends Layer implements InputListener, GestureListen
|
|||||||
return e.getAction() & MotionEvent.ACTION_MASK;
|
return e.getAction() & MotionEvent.ACTION_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean onActionMove(MotionEvent e) {
|
private void onActionMove(MotionEvent e) {
|
||||||
ViewController mViewport = mMap.viewport();
|
ViewController mViewport = mMap.viewport();
|
||||||
float x1 = e.getX(0);
|
float x1 = e.getX(0);
|
||||||
float y1 = e.getY(0);
|
float y1 = e.getY(0);
|
||||||
@ -196,40 +196,50 @@ public class MapEventLayer extends Layer implements InputListener, GestureListen
|
|||||||
mPrevX1 = x1;
|
mPrevX1 = x1;
|
||||||
mPrevY1 = y1;
|
mPrevY1 = y1;
|
||||||
|
|
||||||
/* double-tap + hold */
|
/* double-tap drag zoom */
|
||||||
if (mDoubleTap) {
|
if (mDoubleTap) {
|
||||||
|
/* just ignore first move event to set mPrevX/Y */
|
||||||
if (!mDown) {
|
if (!mDown) {
|
||||||
// TODO check if within tap range
|
|
||||||
mDown = true;
|
mDown = true;
|
||||||
return true;
|
return;
|
||||||
}
|
}
|
||||||
// FIXME limit scale properly
|
if (!mDragZoom && !isMinimalMove(mx, my)) {
|
||||||
mDrag = true;
|
mPrevX1 -= mx;
|
||||||
|
mPrevY1 -= my;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO limit scale properly
|
||||||
|
mDragZoom = true;
|
||||||
mViewport.scaleMap(1 + my / (height / 6), 0, 0);
|
mViewport.scaleMap(1 + my / (height / 6), 0, 0);
|
||||||
mMap.updateMap(true);
|
mMap.updateMap(true);
|
||||||
mStartMove = -1;
|
mStartMove = -1;
|
||||||
return true;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* simple move */
|
||||||
if (!mEnableMove)
|
if (!mEnableMove)
|
||||||
return true;
|
return;
|
||||||
|
|
||||||
if (mStartMove < 0) {
|
if (mStartMove < 0) {
|
||||||
float minSlop = (CanvasAdapter.dpi / MIN_SLOP);
|
if (!isMinimalMove(mx, my)) {
|
||||||
if (FastMath.withinSquaredDist(mx, my, minSlop * minSlop)) {
|
|
||||||
mPrevX1 -= mx;
|
mPrevX1 -= mx;
|
||||||
mPrevY1 -= my;
|
mPrevY1 -= my;
|
||||||
return true;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
float minSlop = (dpi / MIN_SLOP);
|
||||||
|
if (withinSquaredDist(mx, my, minSlop * minSlop)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
mStartMove = e.getTime();
|
mStartMove = e.getTime();
|
||||||
mTracker.start(x1, y1, mStartMove);
|
mTracker.start(x1, y1, mStartMove);
|
||||||
return true;
|
return;
|
||||||
}
|
}
|
||||||
mViewport.moveMap(mx, my);
|
mViewport.moveMap(mx, my);
|
||||||
mTracker.update(x1, y1, e.getTime());
|
mTracker.update(x1, y1, e.getTime());
|
||||||
mMap.updateMap(true);
|
mMap.updateMap(true);
|
||||||
return true;
|
return;
|
||||||
}
|
}
|
||||||
mStartMove = -1;
|
mStartMove = -1;
|
||||||
|
|
||||||
@ -252,8 +262,7 @@ public class MapEventLayer extends Layer implements InputListener, GestureListen
|
|||||||
|
|
||||||
if (mDoTilt) {
|
if (mDoTilt) {
|
||||||
tiltBy = my / 5;
|
tiltBy = my / 5;
|
||||||
} else if (Math.abs(my) > (CanvasAdapter.dpi /
|
} else if (Math.abs(my) > (dpi / MIN_SLOP * PINCH_TILT_THRESHOLD)) {
|
||||||
MIN_SLOP * PINCH_TILT_THRESHOLD)) {
|
|
||||||
/* enter exclusive tilt mode */
|
/* enter exclusive tilt mode */
|
||||||
mCanScale = false;
|
mCanScale = false;
|
||||||
mCanRotate = false;
|
mCanRotate = false;
|
||||||
@ -309,8 +318,7 @@ public class MapEventLayer extends Layer implements InputListener, GestureListen
|
|||||||
if (mCanScale || mDoRotate) {
|
if (mCanScale || mDoRotate) {
|
||||||
if (!(mDoScale || mDoRotate)) {
|
if (!(mDoScale || mDoRotate)) {
|
||||||
/* enter exclusive scale mode */
|
/* enter exclusive scale mode */
|
||||||
if (Math.abs(deltaPinch) > (CanvasAdapter.dpi
|
if (Math.abs(deltaPinch) > (dpi / MIN_SLOP * PINCH_ZOOM_THRESHOLD)) {
|
||||||
/ MIN_SLOP * PINCH_ZOOM_THRESHOLD)) {
|
|
||||||
|
|
||||||
if (!mDoRotate) {
|
if (!mDoRotate) {
|
||||||
mPrevPinchWidth = pinchWidth;
|
mPrevPinchWidth = pinchWidth;
|
||||||
@ -328,7 +336,7 @@ public class MapEventLayer extends Layer implements InputListener, GestureListen
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!(mDoRotate || mDoScale || mDoTilt))
|
if (!(mDoRotate || mDoScale || mDoTilt))
|
||||||
return true;
|
return;
|
||||||
|
|
||||||
float fx = (x2 + x1) / 2 - width / 2;
|
float fx = (x2 + x1) / 2 - width / 2;
|
||||||
float fy = (y2 + y1) / 2 - height / 2;
|
float fy = (y2 + y1) / 2 - height / 2;
|
||||||
@ -353,8 +361,6 @@ public class MapEventLayer extends Layer implements InputListener, GestureListen
|
|||||||
mPrevY2 = y2;
|
mPrevY2 = y2;
|
||||||
|
|
||||||
mMap.updateMap(true);
|
mMap.updateMap(true);
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateMulti(MotionEvent e) {
|
private void updateMulti(MotionEvent e) {
|
||||||
@ -381,6 +387,11 @@ public class MapEventLayer extends Layer implements InputListener, GestureListen
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private boolean isMinimalMove(float mx, float my) {
|
||||||
|
float minSlop = (dpi / MIN_SLOP);
|
||||||
|
return !withinSquaredDist(mx, my, minSlop * minSlop);
|
||||||
|
}
|
||||||
|
|
||||||
private boolean doFling(float velocityX, float velocityY) {
|
private boolean doFling(float velocityX, float velocityY) {
|
||||||
|
|
||||||
int w = Tile.SIZE * 3;
|
int w = Tile.SIZE * 3;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user