【问题标题】:Catch onTouch event by parent, handle it and pass to children由父级捕获 onTouch 事件,处理并传递给子级
【发布时间】:2012-08-28 22:11:51
【问题描述】:

我试图了解 Android 如何处理触摸事件,但有点困惑。据我了解,触摸事件被发送到根视图并传递给孩子。 我有一个FrameLayout,它是Fragment 的容器。 第一个片段视图是ScrollView,第二个是某种Gallery(Horizo​​ntalListView),最后一个也是FrameLayout。每次布局中只有一个片段。 我想要做的是识别用户在屏幕上的滑动,以供应用程序使用。我想计算滑动次数并在滑动几次后做一些事情。

我尝试将OnTouchListener 放在顶部FrameLayout 上,但是当孩子是ScrollViewGallery 时它不会被调用。我试图在onTouch 的末尾返回falsetrue,但我得到了相同的结果 - 它永远不会被调用。

我该怎么做? 我只想“透明地”处理触摸事件并将它们传递给我,就像我什至没有触摸它们一样。

【问题讨论】:

    标签: android android-layout click touch touch-event


    【解决方案1】:

    我的理解是它实际上走向了另一个方向。子视图首先触发他们的事件(有点)。根视图调用了dispatchTouchEvent(),它将事件向下传播到子级的onTouchEvent(),然后根据它们返回真假,调用父级的onTouchEvent()

    拦截此类事件的正常解决方案是在一个人的活动中覆盖dispatchTouchEvent(MotionEvent ev),如下所示:

    @Override
    public boolean dispatchTouchEvent (MotionEvent ev) {
      // Do your calcluations
      return super.dispatchTouchEvent(ev);
    }
    

    这个文档是here。请注意,您还可以在任何ViewGroup 中覆盖该方法(例如FrameLayout 等)

    【讨论】:

    • 成功了!我扩展了FrameLayout,覆盖了您提到的方法,并将MotionEvent 发送到GestureDetector。所有这些主题都有些令人困惑。谢谢!
    • @Elad92 就像你提到的那样你能帮我改变这个二维滚动代码吗? gist.github.com/LOG-TAG/0505eedccef9e00821da 不知道如何将 MotionEvent 发送到 GestureDetector
    • 所以也许你不会在父级中使用onTouchEvent(MotionEvent me)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 2018-07-31
    • 2018-09-17
    相关资源
    最近更新 更多