我知道对于Android视图,如果我将true
返回到onTouchEvent
,则表示您希望继续接收当前手势的事件。如果您返回false
,则不应为当前手势处理更多事件
但是我想尝试检测一个手势是点击还是保持/拖动事件,所以我将true
返回到初始ACTION_DOWN
事件,直到经过了几个毫秒,此时我暂停并将手势识别为保持/拖动而不是点击。
超时结束后,我想将false
返回到onTouchEvents,以便我可以停止接收事件并让父视图管理其余的拖动。
但是我似乎注意到,一旦您为第一个事件返回true
,那么即使我不断返回false
,它也会收到带有关联手势的所有更多事件以后的事件。似乎返回值仅对第一个事件很重要,之后它将被忽略。
有没有办法停止接收onTouchEvent
,并因此在您接受手势中的第一个事件后将其传递给父母?
答案 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,但如果你只是检测到长按,它可能比你需要的更复杂。