Android 事件分发机制总结

View和ViewGroup的事件回调方法

ViewdispatchTouchEvent,onTouchEvent
ViewGroupdispatchTouchEvent,onInterceptTouchEvent,onTouchEvent

DispatchTouchEvent的作用

dispatchTouchEvent负责事件的分发,调用super.dispatchTouchEvent才会往下传递事件。
View的DispatchTouchEvent方法的默认实现就是去调用onTouchEvent,将事件分发给自己处理。
ViewGroup的DispatchTouchEvent方法的默认实现就是去调用onInterceptTouchEvent,来判断是否拦截事件。

dispatchTouchEvent返回True时:事件停止传递,没继续往下传递,事件被消费了。
dispatchTouchEvent返回False时:回传给父控件的onTouchEvent处理。事件停止往子View传递和分发,同时开始往父控件回传(父控件的onTouchEvent开始从下往上回传直到某个onTouchEvent return True),
事件分发机制就像递归,return False的意思就是递归停止然后开始回传。

onInterceptTouchEvent的作用

onInterceptTouchEvent负责事件的拦截,在每个ViewGroupdispatchTouEvent的分发过程中会调用onInterceptTouchEvent来判断是否拦截事件,让自己的onTouchEvent来消费处理。

onInterceptTouchEvent返回True时:拦截事件,交给自己的onTouchEvent处理,事件被消费了。
onInterceptTouchEvent返回False时:不拦截事件,事件继续往子控件往下传。

onTouchEvent的作用

onTouchEvent负责事件的消费处理,事件的业务逻辑处理在这里执行。

onTouchEvent返回True时:事件停止传递,事件被消费了。
onTouchEvent返回False时:事件不处理,回传给父控件的onTouchEvent处理。不消费事件,并让事件继续往父控件的方向从下往上传递。

super的默认实现

ViewGroup:
super.dispatchTouchEvent方法的默认实现就是去调用onInterceptTouchEvent,通过Intercept把事件拦截下来,分发到自己的onTouchEvent处理。
onInterceptTouchEvent 默认是不拦截的, super.onInterceptTouchEvent ()==false

View:
super.dispatchTouchEvent方法的默认实现就是把事件分发给自己的onTouchEvent处理。

View,ViewGroup:
super.onTouchEvent默认是返回false,不消费事件。

ACTION_MOVE和ACTION_UP总结

对于在onTouchEvent消费事件的情况:在哪个View的onTouchEvent返回True,那么ACTION_MOVE和ACTION_UP的事件从上往下传递到这个View后就终结传递了,不再往下传递了,而是直接传给该view的onTouchEvent处理消费并结束本次事件传递过程。

ACTION_DOWN事件是在哪个控件被消费了(return True),那么ACTION_MOVE和ACTION_UP就会从上往下(通过DispatchTouchEvent)做事件分发往下传,就只会传到这个控件,不会继续往下传,如果ACTION_DOWN事件是在DispatchTouchEvent消费,那么事件到此为止停止传递,如果ACTION_DOWN事件是在onTouchEvent消费的,那么会把ACTION_MOVE或ACTION_UP事件传给该控件的onTouchEvent处理并终止传递。

注:消费的意思就是事件走到这里就是终点了,不会继续往下传,没有谁能再收到这个事件了。

这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值