本文最后更新于:星期四, 六月 18日 2020, 9:01 上午

流程图整理自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可以接收点击事件,因此点击事件会直接传给他们,无法通过外部设置监听器去拦截。


View     

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

RecyclerView的复用 上一篇
android自定义View中用NinePatch类画9图 下一篇