Android笔记-浅析ViewGroup和View的事件拦截机制

时间:2024-03-13 10:25:58

今天学习了自定义控件中的事件拦截机制

记下学习过程:

首先要知道事件拦截机制相关的几个方法:

如下:

1、ViewGroup的三个方法:
dispatchTouchEvent:事件分发,该方法先忽略
onInterceptTouchEvent:事件拦截
onTouchEvent:事件触发



2、View的两个方法
dispatchTouchEvent:事件分发,该方法先忽略
onTouchEvent:事件触发

开始拦截机制的学习:

首先:我们自己义两个ViewGroup,和一个View。

ViewGroupA,ViewGroupB,MyView。

关系如下图:

Android笔记-浅析ViewGroup和View的事件拦截机制

ViewGroupA是父控件,ViewGroupB是中间控件,MyView是子控件。
如果不重写以上事件处理方法,则的完整的事件流程,如下:
* E/touchEvent: MyViewGroupA dispatchTouchEvent
* E/touchEvent: MyViewGroupA onInterceptTouchEvent
* E/touchEvent: MyViewGroupB dispatchTouchEvent
* E/touchEvent: MyViewGroupB onInterceptTouchEvent
* E/touchEvent: MyView dispatchTouchEvent
* E/touchEvent: MyView onInterceptTouchEvent
* E/touchEvent: MyView onTouchEvent
* E/touchEvent: MyViewGroupB onTouchEvent
* E/touchEvent: MyViewGroupA onTouchEvent
我们看到事件传递过程如下:
1、首先是父控件发起,执行dispatchTouchEvent方法和onInterceptTouchEvent方法
2、逐渐层向子控件传递,执行子控件dispatchTouchEvent方法和onInterceptTouchEvent方法
3、最后的子控件执行onTouchEvent触发后,
4、再次逐层返回给父控件,执行父控件的onTouchEvent。

由于dispatchTouchEvent方法我们拦截的时候一般不会重写,为了更好理解,所以我们先忽略它。
事件传递机制如下图,x代表返回false,勾代表返回true
Android笔记-浅析ViewGroup和View的事件拦截机制
事件拦截详细流程如下:
由ViewGroupA开始事件拦截处理:
ViewGroupA中:
如果onInterceptTouchEvent返回true:
则执行ViewGroupA中的onTouchEvent方法,
而且ViewGroupB中的onInterceptTouchEvent,onTouchEvent都不会执行。
而且MyView中的onTouchEvent也不会执行。
如果onInterceptTouchEvent返回false:
则执行ViewGroupB中的onInterceptTouchEvent方法。


ViewGroupB中:
如果onInterceptTouchEvent返回true:
则执行ViewGroupB中的onTouchEvent方法。
而且MyView中的onTouchEvent不会执行。
如果onInterceptTouchEvent返回false:
则执行MyView中的onTouchEvent方法。

返回流程如下:
MyView中:
如果onTouchEvent返回true:
则不会执行ViewGroupB中的onTouchEvent方法。
而且不会执行ViewGroupA的onTouchEvent方法。
如果onTouchEvent返回false:
则执行执行ViewGroupB的onTouchEvent方法。


ViewGroupB中:
如果onTouchEvent返回true:
则不会执行ViewGroupA的onTouchEvent方法。
如果onTouchEvent返回false:
则执行ViewGroupA的onTouchEvent方法。






Android笔记-浅析ViewGroup和View的事件拦截机制