Android自定义View

ViewGroup拦截子View点击事件失败

2018-07-12  本文已影响68人  HWilliamgo

流程图整理自Android 触摸事件机制(四) ViewGroup中触摸事件详解 | skywang

事情起因:

要用RelativeLayout去拦截里面的子View的点击事件,因此直接为

relativeLayout.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return true;
    }
});

打算通过返回true来将后续的点击事件消费掉,但是失败了。

在看了源码分析之后,找到原因:

  1. 当ViewGroup有子View的时候,一定能拦截点击事件的入口是onInterceptTouchEvent()
  2. 当ViewGroup有子View能接收点击事件的时候,不会调用ViewGroup任何自己的点击事件监听方法(无论内部还是外部设置的监听器)。
  3. 当ViewGroup没有子View能接收点击事件时,则会调用super.dispatchTouchEvent(),此时将ViewGroup当做View来看,按照View的那一套来。

结论:

我的RelativeLayout里面的子View可以接收点击事件,因此点击事件会直接传给他们,无法通过外部设置监听器去拦截。

上一篇下一篇

猜你喜欢

热点阅读