Android事件分发机制

Android事件分发机制解析
本文详细解析了Android中事件分发的流程,包括事件如何从Activity传递到View,以及事件的分发、拦截和消费过程。介绍了责任链模式在事件传递中的应用,以及事件在不同层级被拦截和消费的条件。

事件分发流程图

1、当 UI 主线程收到触摸 input 事件,经过一系列处理,最终会走到 DecorView 的 dispatchTouchEvent 方法。

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    final Window.Callback cb = mWindow.getCallback();
    return cb != null && !mWindow.isDestroyed() && mFeatureId < 0
        ? cb.dispatchTouchEvent(ev) : super.dispatchTouchEvent(ev);
}

Activity 实现了 Window.Callback 接口,所以接下来会调用 Activity 的 dispatchTouchEvent,所以可以将 Activity 作为原始的事件分发者。

2、事件分发、拦截与消费

类型相关方法ActivityViewGroupView
事件分发dispatchTouchEvent
事件拦截onInterceptTouchEventXX
事件消费onTouchEvent

其中,Activity 与 View 没有事件拦截,主要原因是:

Activity 作为原始的事件分发者,如果 Activity 拦截了事件会导致整个屏幕无法响应事件,不是我们想要的效果;View 作为事件传递的最末端,要么消费事件,要么不处理事件进行回传,根本没必要拦截。

3、事件分发流程

Android View 是树形结构,事件分发流程采用的是责任链模式。

事件传递:

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

事件回传:

Activity <- PhoneWindow <- DecorView <- ViewGroup <- ... <- View

4、onInterceptTouchEvent 返回 true 表示事件拦截,onTouchEvent 返回 true 表示事件消费,

5、事件在从 Activity.dispatchTouchEvent 往下分发的过程中。

如果中间的 ViewGroup 都不拦截,进入最底层的 View 后,由View.onTouchEvent 处理,如果 View 也没有消费事件,最后会返回到 Activity.onTouchEvent。

如果中间任何一层 ViewGroup 拦截事件,则事件不再往下分发,交由拦截的 ViewGroup 的 onTouchEvent 来处理。

6、如果 View 没有消费 ACTION_DOWN 事件,则之后的 ACTION_MOVE 等事件都不会再接收。

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JaqenNg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值