Android事件分发和传递

本文详细解析了Android中触摸事件的传递流程,从Activity到View的层级,包括dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent三个关键方法的作用及交互。通过实例展示了不同场景下事件的分发、拦截和消费过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传递流程

Activity -> PhoneWindow -> DecorView -> ViewGroup -> View

三大事件

1.dispatchTouchEvent
2.onInterceptTouchEvent
Activity 和View 都没有此方法,因为Activity将事件传递给了PhoneWindow-> DecorView 由DecorView来分发
而View是因为没有子View不需要拦截
3.onTouchEvent

所有人都不处理
D/Activity: dispatchTouchEvent 0
D/MyViewGroup: dispatchTouchEvent 0
D/MyViewGroup: onInterceptTouchEvent 0
D/MyView: dispatchTouchEvent 0
D/MyView: onTouchEvent 0
D/MyViewGroup: onTouchEvent 0
D/Activity: onTouchEvent 0
D/Activity: dispatchTouchEvent 2
D/Activity: onTouchEvent 2
D/Activity: dispatchTouchEvent 1
D/Activity: onTouchEvent 1
中间层拦截了

中间层不消费

D/Activity: dispatchTouchEvent 0
D/MyViewGroup: dispatchTouchEvent 0
D/MyViewGroup: onInterceptTouchEvent 0
D/MyViewGroup: onTouchEvent 0
D/Activity: onTouchEvent 0
D/Activity: dispatchTouchEvent 2
D/Activity: onTouchEvent 2
D/Activity: dispatchTouchEvent 1
D/Activity: onTouchEvent 1

中间层消费

D/Activity: dispatchTouchEvent 0
D/MyViewGroup: dispatchTouchEvent 0
D/MyViewGroup: onInterceptTouchEvent 0
D/MyView: dispatchTouchEvent 0
D/MyView: onTouchEvent 0
D/MyViewGroup: onTouchEvent 0
D/Activity: dispatchTouchEvent 2
D/MyViewGroup: dispatchTouchEvent 2
D/MyViewGroup: onTouchEvent 2
D/Activity: dispatchTouchEvent 1
D/MyViewGroup: dispatchTouchEvent 1
D/MyViewGroup: onTouchEvent 1

可以看到ViewGroup 后续的事件没有在执行onInterceptTouchEvent,说明实在dispatchTouchEvent时已经决定了不再下发。

View层消费
D/Activity: dispatchTouchEvent 0
D/MyViewGroup: dispatchTouchEvent 0
D/MyViewGroup: onInterceptTouchEvent 0
D/MyView: dispatchTouchEvent 0
D/MyView: onTouchEvent 0
D/Activity: dispatchTouchEvent 2
D/MyViewGroup: dispatchTouchEvent 2
D/MyViewGroup: onInterceptTouchEvent 2
D/MyView: dispatchTouchEvent 2
D/MyView: onTouchEvent 2
D/Activity: dispatchTouchEvent 1
D/MyViewGroup: dispatchTouchEvent 1
D/MyViewGroup: onInterceptTouchEvent 1
D/MyView: dispatchTouchEvent 1
D/MyView: onTouchEvent 1
ViewGroup 和 View 同时想消费,例如同时设置了点击事件

此时逻辑是如果ViewGroup没有拦截 ,那么就会先分发 给子View,child会消费调此次事件 ,但同一动作的接下来的事件,也是同样的会经过ViewGroup分发。

D/Activity: dispatchTouchEvent 0
D/MyViewGroup: dispatchTouchEvent 0
D/MyViewGroup: onInterceptTouchEvent 0
D/MyView: dispatchTouchEvent 0
D/MyView: onTouchEvent 0
D/Activity: dispatchTouchEvent 1
D/MyViewGroup: dispatchTouchEvent 1
D/MyViewGroup: onInterceptTouchEvent 1
D/MyView: dispatchTouchEvent 1
D/MyView: onTouchEvent 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值