我在MapActivity中实现了OnTouchListener,当然我必须覆盖onTouch()方法。
我希望它只在我点击地图时触发 - 否则我甚至无法移动地图。
这是我的onTouch方法:
@Override
public boolean onTouch(View v, MotionEvent e) {
if (e.getAction() == MotionEvent.ACTION_DOWN) {
// SOME ACTIONS ...
}
return true;
}
答案 0 :(得分:0)
使用:
e.getAction() == MotionEvent.ACTION_UP
和
e.getAction() == MotionEvent.ACTION_MOVE
如果在和ACTION_DOWN之后有ACTION_UP事件,并且之间没有ACTION_MOVE,则点击
更新:
private int mLastMotionEventAction = MotionEvent.ACTION_UP;
@Override
public boolean onTouch(View v, MotionEvent e) {
if (e.getAction() == MotionEvent.ACTION_DOWN) {
// SOME DOWN ACTIONS ...
} else if (e.getAction() == MotionEvent.ACTION_MOVE) {
// SOME MOVE ACTIONS ...
} else if (e.getAction() == MotionEvent.ACTION_UP) {
if (mLastMotionEventAction == MotionEvent.ACTION_DOWN){
// SOME TAP ACTIONS ...
}
}
mLastMotionEventAction = e.getAction();
return true;
}
另一种选择(针对敏感设备):
private long mLastDownEventTime = 0;
@Override
public boolean onTouch(View v, MotionEvent e) {
if (e.getAction() == MotionEvent.ACTION_DOWN) {
mLastDownEventTime = System.currentTimeMillis();
// SOME DOWN ACTIONS ...
} else if (e.getAction() == MotionEvent.ACTION_MOVE) {
// SOME MOVE ACTIONS ...
} else if (e.getAction() == MotionEvent.ACTION_UP) {
if (System.currentTimeMillis() - mLastDownEventTime < 500){
// SOME TAP ACTIONS ...
}
}
return true;
}
仅当自上次向下按下200ms或更短时间后才会触发点击操作。当然,您可以更改最佳用户体验的时间。
答案 1 :(得分:0)
如果您想将事件传递到地图,则必须返回false
。否则,如您所述,地图不会对触摸手势做出反应。这是因为,返回true
表示您消费事件。
答案 2 :(得分:0)
我知道这是一个老问题,但正确的做法是使用getScaledTouchSlop()
,它会在我们认为用户滚动之前返回触摸可以徘徊的距离。
在onTouch方法中实现它:
@Override
public boolean onTouch(final View v, MotionEvent event) {
int mSwipeSlop = ViewConfiguration.get(context).
getScaledTouchSlop();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// DO
break;
case MotionEvent.ACTION_CANCEL:
// DO
break;
case MotionEvent.ACTION_MOVE:
{
float x = event.getX() + v.getTranslationX();
float deltaX = x - mDownX;
float deltaXAbs = Math.abs(deltaX);
float y = event.getY() + v.getTranslationY();
float deltaY = Y - mDownY;
float deltaYAbs = Math.abs(deltaY);
float absDist = Math.sqrt(Math.pow(deltaXAbs, 2) + Math.pow(deltaXAbs, 2));
if (!mSwiping) {
if (absDist > mSwipeSlop) {
mSwiping = true;
}
}
break;
case MotionEvent.ACTION_UP:
{
if (mSwiping) {
// DO MOVE ACTIONS
}
else {
// DO TAP ACTIONS
}
}
break;
default:
return false;
}
return true;
};
开发者页面:http://developer.android.com/reference/android/view/ViewConfiguration.html#getScaledTouchSlop()