设为首页 加入收藏

TOP

Android源码阅读技巧--查找开发者选项中显示触摸操作源码(二)
2019-09-14 00:53:03 】 浏览:129
Tags:Android 源码 阅读 技巧 查找 开发者 选项 显示 触摸 操作
nput_InputManagerService.cpp 文件,

static void nativeSetShowTouches(JNIEnv* /* env */,
        jclass /* clazz */, jlong ptr, jboolean enabled) {
    NativeInputManager* im = reinterpret_cast<NativeInputManager*>(ptr);

    im->setShowTouches(enabled);
}

    看看 setShowTouches 里面做了啥,

void NativeInputManager::setShowTouches(bool enabled) {
    { // acquire lock
        AutoMutex _l(mLock);

        if (mLocked.showTouches == enabled) {
            return;
        }

        ALOGI("Setting show touches feature to %s.", enabled ? "enabled" : "disabled");
        mLocked.showTouches = enabled;
    } // release lock

    mInputManager->getReader()->requestRefreshConfiguration(
            InputReaderConfiguration::CHANGE_SHOW_TOUCHES);
}

    其中 mLocked.showTouches = enabled; 中 showTouches 是关键字,还有 CHANGE_SHOW_TOUCHES 也很关键。

 

    4. 输入

 grep -rn "CHANGE_SHOW_TOUCHES" --include "*.cpp" ./frameworks/ 

    搜到

./frameworks/native/services/inputflinger/InputReader.cpp:3177: | InputReaderConfiguration::CHANGE_SHOW_TOUCHES

    打开 InputReader.cpp ,在 CHANGE_SHOW_TOUCHES 中看不出啥东西,太费力了。

这时可以在 InputReader.cpp 中搜 showTouches ,

    输入

 grep -rn "showTouches" --include "*.cpp" ./frameworks/ 

    搜到

./frameworks/native/services/inputflinger/InputReader.cpp:3476: (mDeviceMode == DEVICE_MODE_DIRECT && mConfig.showTouches)) {
./frameworks/native/services/inputflinger/InputReader.cpp:4334: && mConfig.showTouches && mPointerController != NULL) {

    如何把 CHANGE_SHOW_TOUCHES 与 showTouches 关联起来呢?在 InputReader.cpp 中,

if (!changes || (changes & (InputReaderConfiguration::CHANGE_DISPLAY_INFO
        | InputReaderConfiguration::CHANGE_POINTER_GESTURE_ENABLEMENT
        | InputReaderConfiguration::CHANGE_SHOW_TOUCHES
        | InputReaderConfiguration::CHANGE_EXTERNAL_STYLUS_PRESENCE))) {
    // Configure device sources, surface dimensions, orientation and
    // scaling factors.
    configureSurface(when, &resetNeeded);
}

 

    进入configureSurface 发现以下关键代码

    // Create pointer controller if needed.
    if (mDeviceMode == DEVICE_MODE_POINTER ||
            (mDeviceMode == DEVICE_MODE_DIRECT && mConfig.showTouches)) {
        if (mPointerController == NULL) {
            mPointerController = getPolicy()->obtainPointerController(getDeviceId());
        }
    } else {
        mPointerController.clear();
    }

    这段注释耐人寻味 // Create pointer controller if needed.

所以可以肯定,后续就在 InputReader.cpp 里面围绕 showTouches 来搞事情,果然 showTouches 在另外一出显现它的重要,

        if (mDeviceMode == DEVICE_MODE_DIRECT
                && mConfig.showTouches && mPointerController != NULL) {
            mPointerController->setPresentation(PointerControllerInterface::PRESENTATION_SPOT);
            mPointerController->fade(PointerControllerInterface::TRANSITION_GRADUAL);

            mPointerController->setButtonState(mCurrentRawState.buttonState);
            mPointerController->setSpots(mCurrentCookedState.cookedPointerData.pointerCoords,
                    mCurrentCookedState.cookedPointerData.idToIndex,
                    mCurrentCookedState.cookedPointerData.touchingIdBits);
        }

    学了多年的英语要发挥它的作用了,可知 setSpots 中 spots的中文意思为“斑点,小圆点”,所以就是走这里了,setSpots传的参数

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇深入理解 ThreadLocal 下一篇将Android封装库通过gradle部署到..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目