Improved gestures: use VTM Task for asynchronous calls (#260) #253

This commit is contained in:
Andrey Novikov 2016-11-28 10:37:03 +03:00 committed by Emux
parent ba93445259
commit 5f534656ea

View File

@ -26,9 +26,7 @@ import org.oscim.event.MotionEvent;
import org.oscim.map.Map;
import org.oscim.map.Map.InputListener;
import org.oscim.map.ViewController;
import java.util.Timer;
import java.util.TimerTask;
import org.oscim.utils.async.Task;
import static org.oscim.backend.CanvasAdapter.dpi;
import static org.oscim.utils.FastMath.withinSquaredDist;
@ -94,21 +92,13 @@ public class MapEventLayer2 extends AbstractMapEventLayer implements InputListen
private static final long LONG_PRESS_THRESHOLD = 500;
private final VelocityTracker mTracker;
private final Timer mTimer;
private TimerTask mTimerTask;
private Task mGestureTask;
private final MapPosition mapPosition = new MapPosition();
public MapEventLayer2(Map map) {
super(map);
mTracker = new VelocityTracker();
mTimer = new Timer();
}
@Override
public void onDetach() {
mTimer.cancel();
mTimer.purge();
}
@Override
@ -169,10 +159,9 @@ public class MapEventLayer2 extends AbstractMapEventLayer implements InputListen
final long time = e.getTime();
if (action == MotionEvent.ACTION_DOWN) {
if (mTimerTask != null) {
mTimerTask.cancel();
mTimer.purge();
mTimerTask = null;
if (mGestureTask != null) {
mGestureTask.cancel();
mGestureTask = null;
}
mMap.handleGesture(Gesture.PRESS, e);
mDown = true;
@ -182,7 +171,6 @@ public class MapEventLayer2 extends AbstractMapEventLayer implements InputListen
float my = e.getY(0) - mLastTap.getY();
if (isMinimalMove(mx, my)) {
mTaps = 0;
//log.debug("tap {} {}", mLastTap.getX(), mLastTap.getY());
mMap.handleGesture(Gesture.TAP, mLastTap);
}
} else {
@ -193,21 +181,16 @@ public class MapEventLayer2 extends AbstractMapEventLayer implements InputListen
mTwoFingers = false;
mTwoFingersDone = false;
mTimerTask = new TimerTask() {
mGestureTask = new Task() {
@Override
public void run() {
if (mTwoFingers || mStartMove != -1)
return;
mMap.post(new Runnable() {
@Override
public void run() {
//log.debug("long press {} {}", e.getX(), e.getY());
mMap.handleGesture(Gesture.LONG_PRESS, e);
}
});
public int go(boolean canceled) {
if (canceled || mTwoFingers || mStartMove != -1)
return Task.DONE;
mMap.handleGesture(Gesture.LONG_PRESS, e);
return Task.DONE;
}
};
mTimer.schedule(mTimerTask, LONG_PRESS_THRESHOLD);
mMap.postDelayed(mGestureTask, LONG_PRESS_THRESHOLD);
}
mPrevX1 = e.getX(0);
@ -226,10 +209,9 @@ public class MapEventLayer2 extends AbstractMapEventLayer implements InputListen
}
if (action == MotionEvent.ACTION_UP) {
mDown = false;
if (mTimerTask != null) {
mTimerTask.cancel();
mTimer.purge();
mTimerTask = null;
if (mGestureTask != null) {
mGestureTask.cancel();
mGestureTask = null;
}
if (mStartMove > 0) {
/* handle fling gesture */
@ -248,7 +230,6 @@ public class MapEventLayer2 extends AbstractMapEventLayer implements InputListen
}
if (time - mStartDown > LONG_PRESS_THRESHOLD) {
//log.debug(" not a tap");
// this was not a tap
mTaps = 0;
return true;
@ -257,7 +238,6 @@ public class MapEventLayer2 extends AbstractMapEventLayer implements InputListen
if (mTaps > 0) {
if ((time - mLastTap.getTime()) >= DOUBLE_TAP_THRESHOLD) {
mTaps = 1;
//log.debug("tap {} {}", mLastTap.getX(), mLastTap.getY());
mMap.handleGesture(Gesture.TAP, mLastTap);
} else {
mTaps += 1;
@ -273,47 +253,40 @@ public class MapEventLayer2 extends AbstractMapEventLayer implements InputListen
if (mTaps == 3) {
mTaps = 0;
//log.debug("triple tap {} {}", e.getX(), e.getY());
mMap.handleGesture(Gesture.TRIPLE_TAP, e);
} else if (mTaps == 2) {
mTimerTask = new TimerTask() {
mGestureTask = new Task() {
@Override
public void run() {
public int go(boolean canceled) {
if (canceled)
return Task.DONE;
mTaps = 0;
if (mDragZoom)
return;
mMap.post(new Runnable() {
@Override
public void run() {
//log.debug("double tap {} {}", e.getX(), e.getY());
if (!mMap.handleGesture(Gesture.DOUBLE_TAP, e)) {
/* handle double tap zoom */
final float pivotX = mFixOnCenter ? 0 : mPrevX1 - mMap.getWidth() / 2;
final float pivotY = mFixOnCenter ? 0 : mPrevY1 - mMap.getHeight() / 2;
mMap.animator().animateZoom(300, 2, pivotX, pivotY);
}
}
});
return Task.DONE;
if (!mMap.handleGesture(Gesture.DOUBLE_TAP, e)) {
/* handle double tap zoom */
final float pivotX = mFixOnCenter ? 0 : mPrevX1 - mMap.getWidth() / 2;
final float pivotY = mFixOnCenter ? 0 : mPrevY1 - mMap.getHeight() / 2;
mMap.animator().animateZoom(300, 2, pivotX, pivotY);
}
return Task.DONE;
}
};
mTimer.schedule(mTimerTask, DOUBLE_TAP_THRESHOLD);
mMap.postDelayed(mGestureTask, DOUBLE_TAP_THRESHOLD);
} else {
mTimerTask = new TimerTask() {
mGestureTask = new Task() {
@Override
public void run() {
public int go(boolean canceled) {
if (canceled)
return Task.DONE;
mTaps = 0;
if (!mTwoFingers && mStartMove == -1) {
mMap.post(new Runnable() {
@Override
public void run() {
//log.debug("tap {} {}", e.getX(), e.getY());
mMap.handleGesture(Gesture.TAP, e);
}
});
mMap.handleGesture(Gesture.TAP, e);
}
return Task.DONE;
}
};
mTimer.schedule(mTimerTask, DOUBLE_TAP_THRESHOLD);
mMap.postDelayed(mGestureTask, DOUBLE_TAP_THRESHOLD);
}
return true;
}
@ -328,7 +301,6 @@ public class MapEventLayer2 extends AbstractMapEventLayer implements InputListen
}
if (action == MotionEvent.ACTION_POINTER_UP) {
if (e.getPointerCount() == 2 && !mTwoFingersDone) {
//log.debug("two finger tap");
if (!mMap.handleGesture(Gesture.TWO_FINGER_TAP, e)) {
mMap.animator().animateZoom(300, 0.5, 0f, 0f);
}