Android GestureDetector 无法检测到 FrameLayout 的 onScroll 事件

发布于 2025-01-04 13:55:33 字数 1200 浏览 2 评论 0原文

我有一个扩展 FrameLayout 的视图,需要通知其上的滚动事件。 该视图有一个实现 GestureDetector 的类的实例,该类由重写的 onInterceptTouchEvent 方法调用。

    private class HorizontalScrollListener implements OnGestureListener {
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        ...
        return false;
    }
    @Override
    public boolean onDown(MotionEvent e) { 
         ...
         return false; 
    }
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
        return false;
    }
    @Override
    public void onLongPress(MotionEvent e) {
        ...
        System.out.println();
    }
    @Override
    public void onShowPress(MotionEvent e) {}
    @Override
    public boolean onSingleTapUp(MotionEvent e) { return false; }
}

唯一的问题是,当我尝试滚动时,可能会调用 onDown 和 onLongPress 方法,但实际的 onScroll 方法永远不会被调用。

    @Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    boolean result = super.onInterceptTouchEvent(event);

    if (gestureDetector.onTouchEvent(event)) {
        return result;
    } else {
        return false;
    }       
}

I have a view that extends FrameLayout and need to be notified of the scrolling events on it.
this view has an instance of a class that implements the GestureDetector which is invoked by the overriden onInterceptTouchEvent method.

    private class HorizontalScrollListener implements OnGestureListener {
    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        ...
        return false;
    }
    @Override
    public boolean onDown(MotionEvent e) { 
         ...
         return false; 
    }
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
        return false;
    }
    @Override
    public void onLongPress(MotionEvent e) {
        ...
        System.out.println();
    }
    @Override
    public void onShowPress(MotionEvent e) {}
    @Override
    public boolean onSingleTapUp(MotionEvent e) { return false; }
}

The only problem is that the onDown and onLongPress methods could get called wheen I try to scroll but the actual onScroll methods never gets invoked.

    @Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    boolean result = super.onInterceptTouchEvent(event);

    if (gestureDetector.onTouchEvent(event)) {
        return result;
    } else {
        return false;
    }       
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

命硬 2025-01-11 13:55:33

一旦返回 true,就不会再次为运动序列调用 onInterceptTouchEvent。之后事件会直接发送到 onTouchEvent (因为它们现在被子级拦截)。

您需要在此处进行两处更改:

  • OnGestureListener.onDown() 应返回 true,以便检测器可以处理更复杂的手势,例如滚动
  • onInterceptTouchEvent 应始终返回 < code>false 以保持事件流流向此方法

onInterceptTouchEvent is not called again for a motion sequence once it returns true. Events are sent to onTouchEvent directly afterwards (since they are now being intercepted from the children).

You need two changes here:

  • OnGestureListener.onDown() should return true so the detector can process more complex gestures like scrolls
  • onInterceptTouchEvent should always return false to keep the stream of events flowing to this method
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文