如何在第一次返回true后停止接收onTouchEvents以获取手势

时间:2012-05-12 23:25:19

标签: android

我知道对于Android视图,如果我将true返回到onTouchEvent,则表示您希望继续接收当前手势的事件。如果您返回false,则不应为当前手势处理更多事件

但是我想尝试检测一个手势是点击还是保持/拖动事件,所以我将true返回到初始ACTION_DOWN事件,直到经过了几个毫秒,此时我暂停并将手势识别为保持/拖动而不是点击。

超时结束后,我想将false返回到onTouchEvents,以便我可以停止接收事件并让父视图管理其余的拖动。

但是我似乎注意到,一旦您为第一个事件返回true,那么即使我不断返回false,它也会收到带有关联手势的所有更多事件以后的事件。似乎返回值仅对第一个事件很重要,之后它将被忽略。

有没有办法停止接收onTouchEvent,并因此在您接受手势中的第一个事件后将其传递给父母?

1 个答案:

答案 0 :(得分:2)

请记住,onTouchEvent的布尔返回值仅指示事件是否已被处理 - 当用户处于手势中时,您仍应接收事件。

通常,您可以根据需要在处理程序中定制行为:

private boolean hasHandledGesture = false;

public boolean onTouchEvent( MotionEvent event ){

    if( !hasHandledGesture ){
        // Do your actual handling here for the first event
        return true;
    } else {
        return super.onTouchEvent( event );
    }
}

但是,我认为在你的情况下你最好创建一个通过setOnLongClickListener注册的处理程序。它不仅可以让您的生活更轻松,还可以让操作系统决定长按需要多长时间。如果您想使印刷机的长度与系统的其他部分相匹配,这是最佳选择,有助于整个应用程序的原生外观。

如果你想捕捉一些更复杂的事件,你可能希望看一下使用GestureDetector,但如果你只是检测到长按,它可能比你需要的更复杂。