【问题标题】:How do I allow clicks to bubble up in onTouchEvent如何允许点击在 onTouchEvent 中冒泡
【发布时间】:2014-09-20 00:14:09
【问题描述】:

我有一个可以包含两种视图的 ViewPager。一种视图类型有按钮,一种视图类型没有。为了平移和缩放图像,无按钮视图类型必须在 onTouchEvent 中捕获触摸。但我想让点击冒泡到 ViewPager(附加了一个 clickListener)

我必须在视图的 onTouchEvent ACTION_DOWN 中返回 true,否则它不会看到未来的事件。

我不能在 ViewPager 中使用 onInterceptTouchEvent() 来捕获点击,因为其中一个视图确实有按钮,而这些按钮需要点击

那么我的视图如何捕获滑动,让点击冒泡呢?

【问题讨论】:

    标签: android touch-event


    【解决方案1】:

    正确的方法可能是只拦截您想要拦截的事件,仅在需要时在 onInterceptTouchEvent 中返回 true。

    但如果你想走黑暗面,有一个肮脏的选择,它可能会引诱你,你以后可能会后悔:拦截所有事件,然后在需要时将它们传递下去。

    例如在你的观点里面有类似的东西

         public boolean canInterceptTouch(MotionEvent ev) {
           // return true if you are interested in this touch event, e.g. it falls into
           // a clickable area
    }
    

    以及处理触摸事件的东西,例如

        public void interceptTouch(MotionEvent ev) {
           // here you react to the event
    }
    

    在您的浏览器中

     @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
    
            return true;
        }
    

    视图寻呼机将以如下肮脏的方式处理事件:

    @Override
        public boolean onTouchEvent(MotionEvent ev) {
    
        if (yourView.canInterceptTouch(ev))) {
                yourView.interceptTouch(ev);
                return true;
        } else {
             return doSomethingElse();
        }
    }
    

    注意:虽然我做过类似的事情,但效果不错,但我不推荐它作为解决方案,除非你在处理运动事件时有非常简单的逻辑,否则它会变得一团糟。如果你现在花一些时间正确地去做,你未来的自己会更快乐。

    编辑:代码尚未经过测试,只是为了让您了解您需要什么。很抱歉有任何错别字。

    【讨论】:

    • 我爱未来的自己,绝不会故意做一些惹恼他的事。但我认为你给了我一个暗示......我是在倒退。我应该拦截我想要的一切,然后让点击通过。不,该死的,只有 ViewGroup 有 onIntercept。不好。
    • 让我们这样说吧。 onitercepttouch 在这里接收事件。如果您返回 false,它们会继续传递到这里,但会被分派到子视图。如果您返回 true,则事件将转到 viewpager ontouchevent。我不得不在developer.android.com/reference/android/view/… 阅读文档几次以了解它应该如何工作,同时我已经处于黑暗面......
    • 好的,现在我坐在办公桌前,可以更好地看到这个......这实际上是我要取出的 :) 我希望容器不需要知道细节,这样我就可以在其他地方重用视图。
    【解决方案2】:

    尝试使用这个ViewGroup.onInterceptTouchEvent(MotionEvent)。这允许 ViewGroup 在事件被分派到子视图时观察事件`

    【讨论】:

    • 如问题中所述,我不能那样做。但是感谢您抽出宝贵的时间:)
    • 尝试使用接口并实现它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-30
    • 1970-01-01
    • 2017-02-15
    相关资源
    最近更新 更多