相关阅读:矢山代码阅读器
从onTouchEvent向上搜索
android.view.ViewRootImpl.ConsumeBatchedInputRunnable.run:::
android.view.ViewRootImpl.doConsumeBatchedInput::long:
android.view.ViewRootImpl.doProcessInputEvents:::
android.view.ViewRootImpl.deliverInputEvent::ViewRootImpl.QueuedInputEvent:
android.view.ViewRootImpl.InputStage.deliver::ViewRootImpl.QueuedInputEvent:
android.view.ViewRootImpl.InputStage.onProcess::ViewRootImpl.QueuedInputEvent:#-override
android.view.ViewRootImpl.ViewPostImeInputStage.onProcess::ViewRootImpl.QueuedInputEvent:
android.view.ViewRootImpl.ViewPostImeInputStage.processPointerEvent::ViewRootImpl.QueuedInputEvent:
android.view.View.dispatchPointerEvent::MotionEvent:
android.view.View.dispatchTouchEvent::MotionEvent:
android.view.View.performOnTouchCallback::MotionEvent:
android.view.View.onTouchEvent::MotionEvent:
ConsumeBatchedInputRunnable继承自Runnbale,只有一个实例:ViewRootImpl.mConsumedBatchedInputRunnable,那么下一步就是搜索数据流动,但是他的数据流动与ViewRootImpl.mTraversalRunnable的一模一样,因此不在这里重复了。请阅读 调用栈之从vsync到ondraw 查看ViewRootImpl.mTraversalRunnable的数据流。
MontionEvent从哪里来
从onTouchEvent::MotionEvent:event向上搜索,
// 在函数:android.view.ViewRootImpl.doProcessInputEvents::: 中使用 mPendingInputEventHead
android.view.ViewRootImpl.mPendingInputEventHead
android.view.ViewRootImpl.QueuedInputEvent-reference
android.view.ViewRootImpl.QueuedInputEvent.mNext
android.view.ViewRootImpl.deliverInputEvent::ViewRootImpl.QueuedInputEvent:q
android.view.ViewRootImpl.InputStage.deliver::ViewRootImpl.QueuedInputEvent:q
android.view.ViewRootImpl.InputStage.onProcess::ViewRootImpl.QueuedInputEvent:q
android.view.ViewRootImpl.ViewPostImeInputStage.onProcess::ViewRootImpl.QueuedInputEvent:q
android.view.ViewRootImpl.ViewPostImeInputStage.processPointerEvent::ViewRootImpl.QueuedInputEvent:q
android.view.ViewRootImpl.QueuedInputEvent-reference
android.view.ViewRootImpl.QueuedInputEvent.mEvent
android.view.View.dispatchPointerEvent::MotionEvent:event
android.view.View.dispatchTouchEvent::MotionEvent:event
android.view.View.performOnTouchCallback::MotionEvent:event
android.view.View.onTouchEvent::MotionEvent:event
ViewRootImpl.mPendingInputEventHead有两个数据来源
来源1
// 从这里向上再没有找到哪个函数在调用他了
android.view.Window.injectInputEvent::InputEvent:event
com.android.internal.policy.PhoneWindow.injectInputEvent::InputEvent:event
android.view.ViewRootImpl.dispatchInputEvent::InputEvent:event
android.view.ViewRootImpl.dispatchInputEvent::InputEvent,InputEventReceiver:event
android.os.Handler.obtainMessage::int,Object:return#
android.os.Handler.sendMessage::Message:return#
android.view.ViewRootImpl.ViewRootHandler-reference
android.view.ViewRootImpl.mHandler
// msg:MSG_DISPATCH_INPUT_EVENT
android.view.ViewRootImpl.ViewRootHandler.handleMessage::Message:msg
android.view.ViewRootImpl.ViewRootHandler.handleMessageImpl::Message:msg
android.os.Message-reference
android.os.Message.obj
android.view.ViewRootImpl.enqueueInputEvent::InputEvent,InputEventReceiver,int,boolean:event
android.view.ViewRootImpl.obtainQueuedInputEvent::InputEvent,InputEventReceiver,int:return
android.view.ViewRootImpl.mPendingInputEventHead
来源2
// Called from native code.
android.view.InputEventReceiver.dispatchInputEvent::int,InputEvent:event
android.view.InputEventReceiver.onInputEvent::InputEvent:event
android.view.ViewRootImpl.WindowInputEventReceiver.onInputEvent::InputEvent:event
android.view.ViewRootImpl.enqueueInputEvent::InputEvent,InputEventReceiver,int,boolean:event
android.view.ViewRootImpl.obtainQueuedInputEvent::InputEvent,InputEventReceiver,int:return#
android.view.ViewRootImpl.mPendingInputEventHead
另附文档 Batched consumption
部分原文与翻译:
Most apps draw once per vsync. Therefore, apps can only respond to 1 input event per frame. If multiple input events come in during the period of 1 vsync, it would be wasteful to deliver them all at once to the app. For this reason, input events are batched to only deliver 1 event per frame to the app.
大多数应用每垂直同步绘制一次。因此,应用每帧只能响应 1 个输入事件。如果在 1 个垂直同步期间有多个输入事件,则将它们全部一次性传送给应用会很浪费。因此,输入事件会分批处理,每帧仅向应用传送 1 个事件。
上面这句话对我来说很模糊,既说了“分批处理”,又说了“每帧1个事件”,我没有读懂他到底是怎么个意思。难道意思是每批只有1个事件吗?(显然不是)还需要读代码才能知道。