事件分发,事件到底是先到DecorView还是先到Window的?
这里的window可以理解为PhoneWindow,事件分发在Activity、DecorView、PhoneWindow中的顺序。
当屏幕被触摸,首先会通过硬件产生触摸事件传入内核,然后走到FrameWork层,最后经过一系列事件处理到达ViewRootImpl的processPointerEvent方法,接下来就是我们要分析的内容了:
//ViewRootImpl.javaprivate int processPointerEvent(QueuedInputEvent q) {final MotionEvent event = (MotionEvent)q.mEvent;...//mView分发Touch事件,mView就是DecorViewboolean handled = mView.dispatchPointerEvent(event);...}//DecorView.javapublic final boolean dispatchPointerEvent(MotionEvent event) {if (event.isTouchEvent()) {//分发Touch事件return dispatchTouchEvent(event);} else {return dispatchGenericMotionEvent(event);}}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {//cb其实就是对应的Activityfinal Window.Callback cb = mWindow.getCallback();return cb != null && !mWindow.isDestroyed() && mFeatureId < 0? cb.dispatchTouchEvent(ev) : super.dispatchTouchEvent(ev);}//Activity.javapublic boolean dispatchTouchEvent(MotionEvent ev) {if (ev.getAction() == MotionEvent.ACTION_DOWN) {onUserInteraction();}if (getWindow().superDispatchTouchEvent(ev)) {return true;}return onTouchEvent(ev);}//PhoneWindow.java@Overridepublic boolean superDispatchTouchEvent(MotionEvent event) {return mDecor.superDispatchTouchEvent(event);}//DecorView.javapublic boolean superDispatchTouchEvent(MotionEvent event) {return super.dispatchTouchEvent(event);}
我们来看一下 上文中 Window.Callback cb = mWindow.getCallback()
cb其实就是对应的Activity
在Activity的attach方法中,创建了PhoneWindow,并且设置了callback,windowManager。
final void attach() {//初始化PhoneWindowmWindow = new PhoneWindow(this, window, activityConfigCallback);mWindow.setWindowControllerCallback(mWindowControllerCallback);mWindow.setCallback(this);//和WindowManager关联mWindow.setWindowManager((WindowManager)context.getSystemService(Context.WINDOW_SERVICE),mToken, mComponent.flattenToString(),(info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);mWindowManager = mWindow.getWindowManager();
}
事件的分发流程就比较清楚了:
ViewRootImpl——>DecorView——>Activity——>PhoneWindow——>DecorView——>ViewGroup
(这其中就用到了getCallback参数,也就是之前addView中传入的callback,也就是Activity本身)
但是这个流程确实有些奇怪,为什么绕来绕去的呢,光DecorView就走了两遍。
主要原因就是解耦。
ViewRootImpl并不知道有Activity这种东西存在,它只是持有了DecorView。所以先传给了DecorView,而DecorView知道有AC,所以传给了AC。
Activity也不知道有DecorView,它只是持有PhoneWindow,所以这么一段调用链就形成了。
事件分发,事件到底是先到DecorView还是先到Window的?相关推荐
- Android系统分析之带着问题看事件分发机制
Android 触摸事件分发机制? Android系统分析之带着问题看事件分发机制 一 事件分发机制 1 什么是事件分发机制? 1.1 什么是事件? 答:当用户触摸屏幕时,每一次的点击,按下,移动,抬 ...
- Android事件分发机制:ViewRootImpl篇(前传)
我们都知道View事件的分发顺序是Activity->Window->View. //Activity public boolean dispatchTouchEvent(MotionEv ...
- 【Android 事件分发】MotionEvent.ACTION_DOWN 按下事件分发流程( Activity | ViewGroup | View )
Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...
- Android事件分发机制五:面试官你坐啊
前言 很高兴遇见你~ 事件分发系列文章已经到最后一篇了,先来回顾一下前面四篇,也当个目录: Android事件分发机制一:事件是如何到达activity的? : 从window机制出发分析了事件分发的 ...
- 事件分发机制并不是洪水猛兽
文章目录 OnTouchListener与OnClickListener的优先级 事件分发 滑动冲突 处理滑动冲突 1. 内部拦截法 2.外部拦截法 当MotionEvent产生后,系统总归要将其传递 ...
- 浅谈Android事件分发机制
在Android实际开发过程中经常会遇到View之间的滑动冲突,如ScrollView与Listview.RecyclerView之间的嵌套使用.在很好的解决此类问题之前,我们应深入的了解Androi ...
- 你需要掌握的事件分发高阶知识
戳蓝字"CSDN云计算"关注我们哦! 系列前作 1. Android输入系统的事件传递流程和IMS的诞生 2. 只了解View的事件分发是不够的,来看下输入系统对事件的处理 1.I ...
- Andriod事件分发的事件从何而来(三)
Andriod事件分发的事件从何而来(三) 我们已经知道了事件分发是从InputDispatcher->InputManagerService->WMS->ViewRootImpl. ...
- 【Android 事件分发】事件分发源码分析 ( Activity 中各层级的事件传递 | Activity -> PhoneWindow -> DecorView -> ViewGroup )
Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...
最新文章
- Linux只列出目录的几种方式
- 城市是否可以坐车到达问题
- SpringCloud微服务(04):Turbine组件,实现微服务集群监控
- 无法打开、创建WEB项目,VS2003有寄生性?
- 致运维——运维军团告诉你如何走过七年之痒
- PHP 中 strpos(), stripos(),strrpos(), strripos() 的区别
- Matplotlib - 中文字体
- K8S 还没用,K9S 又是什么鬼?
- 2、那智机器人时序基板的TBEX1、TBEX2连接
- 阿里图标库使用(在线使用)
- 计算机系统:系统级I/O
- C++中c_str()函数的用法
- Python3正则表达式:match函数
- Modbus从站读写数据
- CentOS7安装 SGE
- java ant配置环境变量
- 基于图数据库、图算法、图神经网络的 ID Resolution/ID Mapping 大数据分析方法与代码示例
- Freemarker模板框架页面css样式等不起效
- THead USB适配方案
- matlab 多通道余弦调制镜像滤波器组_滤波器基础:抗混叠