Android事件的分发传递机制

本文总结了Android事件的传递顺序、关键方法及重要点,包括事件的分发、处理和拦截机制,帮助开发者解决复杂布局中的事件冲突和失效问题。

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

原文链接 http://blog.youkuaiyun.com/ahence/article/details/45243987

在一些复杂布局中,经常会遇到事件冲突,事件失效等问题,这就需要我们深入理解Android事件的分发传递机制。最好的方法是自己写一个demo,打印事件相关的日志查看其运行流程,然后再结合源码去深入理解。当然这里不会做这些,这里只有总结性的东西,如果你喜欢这种东西,那么请继续往下看。

老规矩,先上图:
事件分发流程图

用户的交互一般发生在触摸屏上,因此Android事件的传递必然涉及到ViewGroup和View,ViewGroup与View包含的处理事件传递的方法分别如下:

ViewGroup:

public boolean dispatchTouchEvent(MotionEvent event)  
public boolean onTouchEvent(MotionEvent event)   
public boolean onInterceptTouchEvent(MotionEvent event)

View:

public boolean dispatchTouchEvent(MotionEvent event)  
public boolean onTouchEvent(MotionEvent event)

其中dispatchTouchEvent负责事件分发,onTouchEvent负责事件处理,onInterceptTouchEvent负责事件拦截。可以看到,只有ViewGroup才拥有onInterceptTouchEvent方法。

了解完事件相关的基本方法后,来看一些关键点:

1.Android事件的传递顺序:Activity—>ViewGroup—>View。

2.如果dispatchTouchEvent中返回true,则不再往下继续分发,事件取消;返回false,则继续传递事件。

3.如果ViewGroup的onInterceptTouchEvent返回true,则表示拦截事件,故不再往下传递给View,交给ViewGroup自身处理;如果返回false,则继续传递给View。

4.如果onTouchEvent返回true,则表示其消费掉事件,但不会响应onClickListener;如果返回false,则会继续响应onClickListener,如果有设置过的话。

5.其他的可以参考上图中的具体描述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值