(十 )View的事件分发机制

本文详细解析了Android中点击事件的分发机制,包括MotionEvent的传递过程、ViewGroup与View之间的事件处理流程,以及如何通过不同方法的返回值控制事件的流向。

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

点击事件的事件分发,其实就是对MotionEvent事件的分发,即当一个MotionEvent产生后,系统需要把这个事件传递给一个具体的View,而这个传递过程就是分发过程。








ViewGroup包含三个方法:dispatchTouchEvevt()、onInterceptTouchEvent()(默认返回false)、onTouchEvent()
View包含两个方法:dispatchTouchEvevt()、onTouchEvent()(默认返回true,除非是不可点击的,除非clickable和longclickable同时为false)
当一个View需要处理事件时,若它设置了OnTouchListener,则该OnTouchListener中的onTouch方法会被调用,若onTouch返回false,则onTouchEvent方法被调用,若返回true,则onTouchEvent不被调用。

dispatchTouchEvevt():
返回true,事件停止分发,交由当前View的dispatchTouchEvent方法处理,意味着终止。
返回false,事件交由上层的OnTouchEvent进行处理。上层为Activity则交由Activity的OnTouchEvent,为View,则交由View的OnTouchEvent处理。
返回默认super.dispatchTouchEvent,则交由OnInterceptTouchEvent方法处理。

onInterceptTouchEvent():
返回true,事件交由当前View的OnTouchEvent方法处理
返回false,事件放行,交由子view的dispatchTouchEvent方法处理。
返回默认的super.onInterceptTouchEvevt方法,若有子View,事件交由子View的dispatchTouchEvent方法处理,若无子View,事件交由当前view的OnTouchEvent方法处理。

对于public boolean onInterceptTouchEvent(MotionEvent ev) 函数:
1当触摸点落在该控件中时不管该函数返回什么都会调用OnTouchEvent函数
2当触摸点落在该控件中的子控件上时
1>返回true会拦截该事件交给OnTouchEvent函数处理
2>返回false或者super.onInterceptTouchEvent(ev) 不会拦截事件交给OnTouchEvent函数处理而是交给子控件dispatchTouchEvent函数处理

onTouchEvent():
返回true,事件被消费。
返回false,事件一级一级上传,都有上层的view的onTouchEvent方法接受,若上层该方法也返回false,则一直上传,直至消失。并且接收不到下次事件。
返回默认super.onTouchEvent,与返回false相同。


Activity传给Window,Window的惟一实现类是PhoneWindow,PhoneWindow传给DectorView(继承自Framlayout,是父View),父传子View,注意的是onTouchListener,若设置,则屏蔽onTouchEvent事件。

下图为他人博客所做的流程图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值