处理程序长按不会收到消息

时间:2012-12-10 17:41:17

标签: android

尝试通过从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;
    }
}

1 个答案:

答案 0 :(得分:1)

即使你的手非常稳定,你也可能会创建一个ACTION_MOVE事件:

case MotionEvent.ACTION_MOVE:
    handler.removeMessages(LONG_PRESS);
    break;

你的手指只会移动几个像素,但这足以消除长按回调。

Android使用一对静态变量标签___SLOP并计算第一个ACTION_DOWN事件与当前事件之间的距离。一旦MotionEvent超出了slop阈值,那么它才会取消回调。我建议使用相同的方法。