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