今天学习了自定义控件中的事件拦截机制
记下学习过程:
首先要知道事件拦截机制相关的几个方法:
如下:
1、ViewGroup的三个方法:
dispatchTouchEvent:事件分发,该方法先忽略
onInterceptTouchEvent:事件拦截
onTouchEvent:事件触发
2、View的两个方法
dispatchTouchEvent:事件分发,该方法先忽略
onTouchEvent:事件触发
开始拦截机制的学习:
首先:我们自己义两个ViewGroup,和一个View。
ViewGroupA,ViewGroupB,MyView。
关系如下图:
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
事件拦截详细流程如下:
由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方法。