InputDispatcher 消息窗口傳遞過程

 InputDispatcher.InputDispatcherThread::threadLoop--->

dispatchOnce--->

dispatchOnceInnerLocked--->EventEntry::TYPE_MOTION--->

dispatchMotionLocked--->

findTouchedWindowTargetsLocked---->

findTouchedWindowAtLocked

sp<InputWindowHandle> InputDispatcher::findTouchedWindowAtLocked(int32_t displayId,
        int32_t x, int32_t y) {
    // Traverse windows from front to back to find touched window.
    size_t numWindows = mWindowHandles.size();
    for (size_t i = 0; i < numWindows; i++) {
        sp<InputWindowHandle> windowHandle = mWindowHandles.itemAt(i);
        const InputWindowInfo* windowInfo = windowHandle->getInfo();
        if (windowInfo->displayId == displayId) {
            int32_t flags = windowInfo->layoutParamsFlags;

            if (windowInfo->visible) {
                if (!(flags & InputWindowInfo::FLAG_NOT_TOUCHABLE)) {
                    bool isTouchModal = (flags & (InputWindowInfo::FLAG_NOT_FOCUSABLE
                            | InputWindowInfo::FLAG_NOT_TOUCH_MODAL)) == 0;
                    if (isTouchModal || windowInfo->touchableRegionContainsPoint(x, y)) {
                        // Found window.
                        return windowHandle;
                    }
                }
            }
        }
    }
    return NULL;
}

如果設置了FLAG_NOT_TOUCHABLE 本窗口不處理TP事件,直接傳給下一個窗口。如果FLAG_NOT_FOCUSABLE 和 FLAG_NOT_TOUCH_MODAL 都沒有設置,TP事件不會傳到下一個窗口,即使這個窗口的大小隻有1個像素。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章