Android事件分发机制解析

安卓的事件传递机制,是由Activity分发->ViewGroup分发->ViewGroup拦截->View分发->View响应,然后在逐级回退,如果中间有操作,则会提前消费或者回退,先看一下流程图。

下面结合源码来说明这张图。

首先由Activity的dispatchTouchEvent开始,

可以看到Activity的onTouchEvent触不触发完全由getWindow的superDispatchTouchEvent决定,如果返回true,走到if里retrun掉,下面就不能响应了。

getWindow的superDispatchTouchEvent又是个什么东东呢,点进去看是个抽象方法,我们知道,window的唯一实现类是PhoneWindow,而PhoneWindow的源码如下:


这个mDecor是个什么呢,没错,就是activity的view显示的最外层。实际上Activity的层级是由Activity->Window->DecorView这个再布局文件添加的view都会添加到它上面,其本身是个继承自FrameLayout,属于ViewGroup,superDispatchTouchEvent即调用ViewGroup的dispatchTouchEvent,这个的dispatch里是如何分发的呢?

如果拦截自己消费,如果没拦截,子View分发,如果没有子view,自己消费。

下面看view的事件分发,可以看到view是否执行onTouchEvent取决于上面的,事件是否过滤,ontouchListener是否为空,ontouch事件的返回值,是否可点击。

1.即如果设置了onTouchListener且回调事件为true,那下面的onTouch也不会执行。

2.如果onTouchEvent返回真,则分发返回真,事件结束。

3.如果返回false,则分发返回false,ViewGroup响应onTouch。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值