InputDispatcher::dispatchMotionLocked中查詢派發(fā)的窗口 findTouchedWindowTargetsLocked
派發(fā)的窗口確定后空繁, 還會添加monitor窗口addMonitoringTargetsLocked(inputTargets);
此處addMonitoringTargetsLocked添加的channel就是WindowManagerService中創(chuàng)建的, 如下代碼:
final InputChannel inputChannel = mInputManager.monitorInput(TAG_WM);
mPointerEventDispatcher = inputChannel != null ? new PointerEventDispatcher(inputChannel) : null;
最后派發(fā)的時(shí)候,通過for循環(huán),按照inputTargets的順序派發(fā),
因?yàn)閙onitor是最后添加的, 所以是最后派發(fā).
系統(tǒng)手勢SystemGesturesPointerEventListener 注冊到windowmanagerservice中袱吆,
最終注冊到PointerEventDispatcher中, 而PointerEventDispatcher繼承InputEventReceiver,
收到onInputEvent事件后相恃,進(jìn)行手勢計(jì)算辜纲。
需求:
要接收到手勢后, cancel掉畫面的事件
方案:
畫面動作是在up事件中進(jìn)行才能cancel掉豆茫, 如果是在down中進(jìn)行侨歉, 無法滿足需求。
手勢計(jì)算并派發(fā)后揩魂,補(bǔ)發(fā)一個(gè)cancel事件出來幽邓, 應(yīng)用收到cancel事件,進(jìn)行處理火脉。