Android 如何在内部视图上接受onSingleTapUp(),而在外部视图上接受onFling()?

Android 如何在内部视图上接受onSingleTapUp(),而在外部视图上接受onFling()?,android,gesture,ontouchlistener,Android,Gesture,Ontouchlistener,我有一个覆盖整个屏幕的视图(比如说ParentView),以及仅覆盖部分屏幕的子内部视图ChildView。 我想让ChildView响应onsingletapp(),而ParentView响应onFling()。我试图通过在ChildView上附加一个SimpleOnGestureListener和在ParentView上附加一个SimpleOnGestureListener来实现 要从ChildView接受onSingleTapUp(),其侦听器的onDown()必须返回true。 但是一旦

我有一个覆盖整个屏幕的视图(比如说
ParentView
),以及仅覆盖部分屏幕的子内部视图
ChildView
。 我想让
ChildView
响应
onsingletapp()
,而
ParentView
响应
onFling()
。我试图通过在
ChildView
上附加一个
SimpleOnGestureListener
和在
ParentView
上附加一个
SimpleOnGestureListener
来实现

要从
ChildView
接受
onSingleTapUp()
,其侦听器的
onDown()
必须返回true。 但是一旦我这样做了,绑定到
ParentView
的侦听器就不会再听到任何运动事件,因为它是由
ChildView
的侦听器执行的。即使
ChildView
onFling()
返回false,事件也不会流到
ParentView
的侦听器

ChildView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        return singleTapGestureDetector.onTouchEvent(motionEvent);
    }
});
如何使父视图的侦听器捕捉投掷手势,而子视图的侦听器捕捉轻触手势?

我不认为需要任何源代码来解释这种情况,但这里有一个片段可以设置我的
ChildView
监听器

ChildView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        return singleTapGestureDetector.onTouchEvent(motionEvent);
    }
});

一种解决方法是让
ParentView
ChildView
的监听器处理
onFling()
,而只有
ChildView
的监听器处理
onsingletaup()
,但在这种情况下,
ChildView
(就像从孩子外部开始,然后在孩子内部结束),我相信。

我不喜欢我的解决方案,但我找到了一种方法。希望将来有人会给出更好的答案,或者至少我的解决方法对其他人有用

正如我在问题中所描述的,问题在于手势监听器如何工作。要让子视图捕捉
onSingleTapUp()
事件,您在
onDown()
上返回true。但是一旦这样做,即使在子视图的
onTouch()之后,后续的一系列事件也不会转到父视图
声明它对该事件不再感兴趣。如果您在孩子的
onTouch()
中强制调用家长的
onTouch()
,当其手势检测器返回false时,则是家长的onFling()将被调用,但第一个
MouseEvent
参数将为NULL,因为它已被子视图的
onTouch()
使用

我一定错过了一些东西,因为这似乎是一个非常基本的手势检测场景。无论如何,我找不到一个合理的方法来做到这一点

所以,我的解决办法是将TouchListenerService作为一个单体

子视图和父视图都有这一行

view.setOnTouchListener(TouchListenerService.Instance());
TouchListenerService的启动方式如下:

public class TouchListenerService
    extends GestureDetector.SimpleOnGestureListener
    implements View.OnTouchListener {

    // some code to implement singleton

    public SingleTapUpHandler SingleTapUpHandler;
    public FlingHandler FlingHandler;

    private View _touchingView;

    GestureDetector gestureDetector;

    @Override
    public boolean onTouch(View view, MotionEvent motionEvent) {
        if (gestureDetector == null)
            gestureDetector =  new GestureDetector(_touchListenerService);

        _touchingView = view;
        boolean result = gestureDetector.onTouchEvent(motionEvent);
        _touchingView = null;
        return result;
    }
    // and some more code

因为它是同一个事件处理程序,所以父视图捕获
onFling()
事件成功,而子视图可以设置
SingleTapUpHandler
来处理单击事件。

这对我来说很有效,我尝试了其他方法,但没有成功,比如使用FrameLayout-同样的问题。接受这个答案-希望它将来能帮助其他人,或者其他人会注意到更好的方法。