尝试通过从GestureDetector借用代码实现长按我得到了一个最小的样本,当onTouchEvent()返回true时,它不会在GestureHandler中接收消息。返回false时,消息确实已传递,但事件处理结束,长按不会被取消。
有没有办法让这个代码与onTouchEvent()一起使用,返回true?
public class OverlayView extends View {
private static final int LONG_PRESS = 1;
private Handler handler;
private static final String TAG = OverlayView.class.getName();
private class GestureHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case LONG_PRESS:
dispatchLongPress();
break;
default:
throw new RuntimeException("Unknown message " + msg);
}
}
}
public OverlayView(Context context, AttributeSet attrs) {
super(context, attrs);
handler = new GestureHandler();
}
private void dispatchLongPress() {
Toast.makeText(getContext(), "Long Press", Toast.LENGTH_SHORT).show();
}
@Override
public boolean onTouchEvent(MotionEvent e) {
Log.d(TAG, e.toString());
switch (e.getAction()) {
case MotionEvent.ACTION_DOWN:
handler.removeMessages(LONG_PRESS);
handler.sendEmptyMessageAtTime(LONG_PRESS, e.getDownTime() + 1000);
break;
case MotionEvent.ACTION_MOVE:
handler.removeMessages(LONG_PRESS);
break;
case MotionEvent.ACTION_UP:
handler.removeMessages(LONG_PRESS);
break;
default:
break;
}
return true;
}
}
答案 0 :(得分:1)
即使你的手非常稳定,你也可能会创建一个ACTION_MOVE
事件:
case MotionEvent.ACTION_MOVE:
handler.removeMessages(LONG_PRESS);
break;
你的手指只会移动几个像素,但这足以消除长按回调。
Android使用一对静态变量标签___SLOP
并计算第一个ACTION_DOWN
事件与当前事件之间的距离。一旦MotionEvent超出了slop阈值,那么它才会取消回调。我建议使用相同的方法。