2.3.x 事件分发

简述:

在软件层面,读入和分发触摸事件的是系统服务 InputManagerService,实际上是jni层的 NativeInputManager。
NativeInputManager 里的两个对象 EventHub 和 InputManager。
EventHub监听设备节点,收集原始的输入事件。
InputManager 中是生产者消费者模型。InputReader从EventHub读取输入事件存入队列,InputDispatcher从队列事件取出事件分发。
事件由InputChannel跨进程传递,它一端连接作为Server的InputDispatcher,另一端给到作为Client的应用层View。

应用进程添加窗口时[ 关联handleResumeActivity()Activity启动流程],ViewRootImpl 的 setView() 最终调用到 WindowManagerService addWindow() 方法。它初始化了一对 InputChannel 对象,InputChannel 建立socket连接,跨进程传递输入事件。Server端的 InputChannel 注册到 InputManagerService 的 InputDispatcher;Client端则是 ViewRootImpl 的内部类 WindowInputEventReceiver。

dispatchTouchEvent(),事件在ViewGroup中进行分发,如果没有被消耗,则通过onInterceptTouchEvent()判断是否需要拦截,如果拦截则交给本ViewGroup的onTouchEvent()进行处理,如果不拦截则交给子View(或ViewGroup)继续重复dispatchTouchEvent()的过程进行分发,从外向内,以此类推。

详细:

在软件层面,读入和分发触摸事件的是系统服务InputManagerService。
在其构造函数中创建了jni层的对象 NativeInputManager,
而后者 NativeInputManager 的构造函数中又进一步创建了 EventHub 和 InputManager 两个对象。
其中EventHub依赖Linux内核的INotify与Epoll机制监听设备节点,通过 getEvent 函数读取设备节点的增删事件和原始输入事件。

2.3.x 事件分发

WindowInputEventReceiver 的 onBatchedInputEventPending 方法被回调,紧接着通过 postCallback() 方法向编舞者添加了一个类型为 Choreographer.CALLBACK_INPUT 的 ConsumeBatchedInputRunnable 对象,作为回调。
当下一个Vsync信号到来时,FrameDisplayEventReceiver 被回调并进一步调用编舞者的 doFrame 方法,进行当前帧的刷新。这时编舞者会依次对于已注册的 CALLBACK_INPUT,CALLBACK_ANIMATION,CALLBACK_INSETS_ANIMATION,CALLBACK_TRAVERSAL,CALLBACK_COMMIT 类型的callback进行回调,其中 CALLBACK_INPUT 就会包含 WindowInputEventReceiver 之前添加进来的 ConsumeBatchedInputRunnable 对象,而 CALLBACK_TRAVERSAL 对应的就是负责view tree重新measure/layout/draw的performTraversals方法。
ConsumeBatchedInputRunnable被执行时,会去消费之前pending的MOVE事件,后续的流程跟DOWN事件相同。

两者最终都走到了 dispatchTouchEvent(),事件在ViewGroup中进行分发,如果没有被消耗,则通过onInterceptTouchEvent()判断是否需要拦截,如果拦截则交给本ViewGroup的onTouchEvent()进行处理,如果不拦截则交给子View(或ViewGroup)继续重复dispatchTouchEvent()的过程进行分发,从外向内,以此类推。

//todo 为什么
如果事件从上往下传递过程中一直没有被停止,且最底层子View没有消费事件,事件会反向往上传递,这时父View(ViewGroup)可以进行消费,如果还是没有被消费的话,最后会到Activity的onTouchEvent()函数。
//todo 为什么
如果View没有对ACTION_DOWN进行消费,之后的其他事件不会传递过来。

FAQ

move事件里只有一个坐标点吗/p>

关联点

文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91725 人正在系统学习中

来源:拥小抱

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2022年1月9日
下一篇 2022年1月9日

相关推荐