我有一个覆盖整个屏幕的 View (假设 ParentView ),以及仅覆盖其中一部分的子内部 View ChildView
我想让 ChildView 响应 onSingleTapUp() ,而 ParentView 响应 onFling() 。我试图通过在 SimpleOnGestureListener 上附加一个 ChildView 和在 SimpleOnGestureListener 上附加一个 ParentView 来做到这一点。

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

如何让父 View 的监听器捕捉到滑动手势,而 subview 的监听器捕捉点击手势?

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

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

一种解决方法可能是让 ParentViewChildView 的监听器都处理 onFling() 而只有 ChildView 的监听器处理 onSingleTapUp() ,但在这种情况下,fling 将无法跨 ChildView 发生(例如在 child 之外开始然后结束在 child 内),我相信。

最佳答案

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

正如我在问题中所描述的,问题在于手势监听器的工作方式。对于捕获 onSingleTapUp() 事件的 subview ,您在 onDown() 上返回 true 。但是一旦你这样做了,即使你的 subview 的 onTouch() 声明它不再对事件感兴趣,随后的一系列事件也不会进入父 View 。如果您在其手势检测器返回 false 时在 child 的 onTouch() 中强行调用父级的 onTouch() ,是的,将调用父级的 onFling() 但第一个 MouseEvent 参数将为 NULL ,因为它被 subview 的 onTouch() 消耗了。

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

因此,我的解决方法是将 TouchListenerService 设为单例。

subview 和父 View 都有这一行 :

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

由于是同一个事件处理器,父 View 成功捕获onFling()事件,而 subview 可以设置SingleTapUpHandler来处理点击事件。

关于android - 如何在内部 View 上接受 onSingleTapUp() 而在外部 View 上接受 onFling()?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12443390/

10-12 02:21