3

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

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

一旦超时过去,我想false进一步返回 onTouchEvents,这样我就可以停止接收事件并让父视图管理其余的拖动。

但是,我似乎注意到,一旦您返回true第一个事件,它就会收到所有带有相关手势的进一步事件,即使在我不断返回false以后的事件之后也是如此。似乎返回值只对第一个事件很重要,之后它被忽略了。

onTouchEvent一旦您接受了手势中的第一个事件,有什么方法可以停止接收并因此将其传递给父级?

4

1 回答 1

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,但如果你只是检测长按,它可能比你需要的更复杂。

于 2012-05-12T23:41:30.790 回答