博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android事件分发机制
阅读量:4088 次
发布时间:2019-05-25

本文共 1233 字,大约阅读时间需要 4 分钟。

事件分发流程图

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

@Overridepublic 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、事件分发、拦截与消费

类型 相关方法 Activity ViewGroup View
事件分发 dispatchTouchEvent
事件拦截 onInterceptTouchEvent X X
事件消费 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 等事件都不会再接收。

参考

转载地址:http://jskii.baihongyu.com/

你可能感兴趣的文章
教你发布你npm包
查看>>
nvm 和 nrm 的安装与使用
查看>>
React Hooks 一步到位
查看>>
React Redux常见问题总结
查看>>
前端 DSL 实践指南
查看>>
ReactNative: 自定义ReactNative API组件
查看>>
cookie
查看>>
总结vue知识体系之实用技巧
查看>>
PM2 入门
查看>>
掌握 TS 这些工具类型,让你开发事半功倍
查看>>
前端如何搭建一个成熟的脚手架
查看>>
Flutter ListView如何添加HeaderView和FooterView
查看>>
Flutter key
查看>>
Flutter 组件通信(父子、兄弟)
查看>>
Flutter Animation动画
查看>>
Flutter 全局监听路由堆栈变化
查看>>
Android 混合Flutter之产物集成方式
查看>>
Flutter混合开发二-FlutterBoost使用介绍
查看>>
Flutter 混合开发框架模式探索
查看>>
Flutter 核心原理与混合开发模式
查看>>