ViewGroup的事件传递、分发

这篇博客详细探讨了Android中ViewGroup的事件传递和分发机制,从根布局开始,描述了事件如何从父组件传递到子组件,以及在不同情况下的处理流程。涉及的关键步骤包括dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent,讨论了如何根据需求拦截和处理事件,以及在多层嵌套布局中事件的分发顺序。文章通过实例代码和测试结果进行了深入解析。
摘要由CSDN通过智能技术生成

ViewGroup事件传递、分发

(注:本文旨在相互印证,探讨,因为我也是总结自己的想法,可能有错误的地方,希望有前辈发现问题能帮我指正,感谢!)

1)

  • 1.1)事件由根布局向内(顶)层传递

在这里插入图片描述

  • 1.2)大致传递过程:

view :
1.dispatchTouchEvent
2.onTouch (touchListener)
3.touchEvent (包含其他事件,如click)

viewGroup:
1.dispatchTouchEvent
2.onInterceptTouchEvent
3.onTouch
4.touchEvent

(补充:viewGroup extends View !)

  • 2) 事件先由根布局ViewGroup接收:dispatchTouchEvent

  • 2.1) 先判断是否是按压事件,如果是,初始化参数

在这里插入图片描述
其中有很多过程,我拿出了一个对下文比较重要的一个参数:
mFirstTouchTAarget 一定会被制为null。

  • 2.2) 紧接着,确定当前ViewGroup是否被拦截。

在这里插入图片描述

  • 2.2.1) 如果不是则事件继续向下传递,(内容转接 下文 标题3))

  • 2.2.2) 如果被拦截,则会把当前的ViewGroup当作一个View处理,调取

super.dispatchTouchEvent();

在这里插入图片描述

其中dispatchTransFormTouchEvevt方法中,当传递的child为null时,会直接调取基类的dispatchTouchView方法

在这里插入图片描述

  • 3)

如果viewGroup 的拦截器中(我就那么一叫.),没有设置拦截,那么他默认是false,就会判断当前的ViewGroup的按压地方,存在几个View(就像最上面的xml布局图中,button1,与 button2,有一块重叠的部分,当点击这个部分的时候,两个child都会被分发到事件)

在这里插入图片描述

图中的代码是被删减过的,我把其中的主干提出来了。

  • 3.1 )

获取按压中的子view,并从上自下,顺序排列。也就是说,等下分发按压事件的时候,会先分发给button2这个按钮

  • 3.2)分发事件:

在这里插入图片描述

这里要说明一点的是,如果是好多层viewGroup嵌套,流程是一样,都是这个一样的流程,一样的代码,因为红框里面不是继续会调子部件的dispatchTouchEvent方法么。

  • 3.3)
  • 3.3.1)如果分发过后,没有子部件能消耗掉本次按压事件,则会一路返还,把事件还给父容器ViewGroup处理。

父容器则调取自己的super.dispatchTouchEvent,消耗事件。
这时,mFirstTouchTarget还是null;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值