Android的事件分发(没有源码分析适合面试用)

本文详细解析了Android中点击事件的分发流程,包括事件序列的概念、传递顺序及主要方法的作用。阐述了Activity、Window、View之间的事件传递机制,以及ViewGroup和View在事件分发中的具体行为。

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

1、明确几个概念

事件分发对象:指的是motionevent即点击事件。所谓点击事件的事件分发,其实就是对motionevent事件的分发过程,即当一个motionevent产生以后,系统需要把这个事件传递给一个具体的view,而这个传递的过程就是分发过程。

时间序列:指从手指接触屏幕的那一刻起,到手指离开屏幕的那一刻结束,在这个过程产生的一系列事件,这个事件序列以down事件开始,中间含有数量不定的move事件,最终以up事件结束。

传递顺序:Activity -> Window -> View

主要调用的三个方法:dispatchTouchEvent(是否分发)、onInterceptTouchEvent(是否拦截)、onTouchEvent(是否消耗)。

当一个点击操作发生时,事件最先传递给当前Activity,由Activity的dispatchTouchEvent来进行事件派发---事件起点;

Activity中的dispatchTouchEvent调用Window的superDispatchTouchEvent方法进行派发-----事件到达Window;

Window的superDispatchTouchEvent调用DecorView的superDispatchTouchEvent方法进行派发----事件到达DecorView;

DecorView的superDispatchTouchEvent调用自己的dispatchTouchEvent方法进行派发;

DecorView的dispatchTouchEvent调用ViewGroup的dispatchTouchEvent方法----事件到达ViewGroup;

2、一些简写

由于DecorView和PhoneWindows不好打印,但是DecorView是一个FrameLayout,FrameLayout的继承ViewGroup,可以推测出是否经过DecorView,但是PhoneWindows我只能猜测,如果猜测不对还请联系我。

2、全部返回的是super

 

3、ViewGroup分发事件的情况

(1)、ViewGroup拦截DOWN事件时

  

 

 

(2)、ViewGroup不拦截DOWN事件时

不消耗DOWN事件时,和情况2一样;

消耗DOWN事件时,和情况3中的(1)消耗DOWN事件一样。

4、View分发事件的情况(GroupView返回的都是super)

(1)消耗DOWN事件

(2)不消耗DOWN事件

和情况2一样

5、FLAG_DISALLOW_INTERCEPT标记

这个标记位通过requestDisallowInterceptTouchEvent方法来设置的,一般用于子View中。这个标记位一旦后,ViewGroup将无法拦截除了DOWN以外的其它点击事件。由于点击事件是DOWN时,会重置这个标记位导致这个标记位无效,所以这个标记位一般在子View的onTouchEvent事件中设置在构造函数中设置一般无效。

6、onTouch方法

当GroupView拦截事件后mOnTouchListener==1时调用onTouch方法,不在执行onTouchEvent方法了。

7、onClick方法

当mOnClickListener== 1时,在onTouchEvent方法中调用onClick方法。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值