Android 如何在第一次返回true后停止接收手势的onTouchEvents

Android 如何在第一次返回true后停止接收手势的onTouchEvents,android,Android,我知道,对于Android视图,如果我将true返回到onTouchEvent,则表示您希望继续接收当前手势的事件。如果返回false,则不应为当前手势处理更多事件 但是,我想尝试检测一个手势是单击还是按住/拖动事件,因此我将true返回到初始ACTION\u DOWN事件,直到过了一些毫秒,此时我超时并将该手势识别为按住/拖动而不是单击 超时结束后,我想返回false以进一步了解事件,这样我就可以停止接收事件,并让父视图管理其余的拖动 然而,我似乎注意到,一旦您为第一个事件返回true,那么它

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

但是,我想尝试检测一个手势是单击还是按住/拖动事件,因此我将
true
返回到初始
ACTION\u DOWN
事件,直到过了一些毫秒,此时我超时并将该手势识别为按住/拖动而不是单击

超时结束后,我想返回
false
以进一步了解事件,这样我就可以停止接收事件,并让父视图管理其余的拖动

然而,我似乎注意到,一旦您为第一个事件返回
true
,那么它将接收所有带有相关手势的进一步事件,即使在我连续将
false
返回到以后的事件之后也是如此。似乎返回值只对第一个事件起作用,之后它将被忽略


是否有任何方法停止接收onTouchEvent,从而将其传递给父级,一旦你在手势中接受了第一个事件,

记住,<代码>的BooLealRealEnter值OnTouChEngult只指示事件是否已被处理,当用户处于手势的中间时,仍然应该接收事件。

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

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 );
    }
}
但是,我认为在您的情况下,最好创建一个通过注册的处理程序。这不仅会让你的生活更轻松,而且你还可以让操作系统决定长时间按下按钮所需的时间。如果你想让媒体的长度与系统的其他部分相匹配,这是最好的选择,有助于整个应用程序的原生外观


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

删除了我的第一条评论,我最初误读了你的答案。我将研究longClickListener,尽管我认为您的代码示例可能没有帮助。如果我第一次返回true后返回false或调用super.onTouchEvent,则父视图将永远看不到手势的其余部分,即使我从原始onTouchEvent返回false。@Tim-在这种情况下,手势检测器可能正是您所需要的。如果在进行所有自定义处理之前将事件传递给检测器,则应该可以不使用现有的处理程序,只在长按触发时接收回调。当然,我将查看GestureDetector。