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

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

记下学习过程:

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

如下:

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方法。








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值