IMS:开发者选项Touch点显示
android11-release
开发者选项
frameworks\base\packages\SettingsLib\res\values-zh-rCN\strings.xml
packages\apps\Settings\res\xml\development_settings.xml
packages\apps\Settings\src\com\android\settings\development\ShowTapsPreferenceController.java
packages\apps\Settings\src\com\android\settings\development\PointerLocationPreferenceController.java
- 显示触摸操作(显示点按操作反馈)
show_touches
:Settings.System.SHOW_TOUCHES - 指针位置
pointer_location
:Settings.System.POINTER_LOCATION
- adb查询:
adb shell settings get system show_touches
、adb shell settings get system pointer_location
IMS 监听 registerContentObserver
frameworks\base\services\core\java\com\android\server\input\InputManagerService.java
public void start() {
Slog.i(TAG, "Starting input manager");
nativeStart(mPtr);
// Add ourself to the Watchdog monitors.
Watchdog.getInstance().addMonitor(this);
registerPointerSpeedSettingObserver();
registerShowTouchesSettingObserver();
registerAccessibilityLargePointerSettingObserver();
registerLongPressTimeoutObserver();
mContext.registerReceiver(new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
updatePointerSpeedFromSettings();
updateShowTouchesFromSettings();
updateAccessibilityLargePointerFromSettings();
updateDeepPressStatusFromSettings("user switched");
}
}, new IntentFilter(Intent.ACTION_USER_SWITCHED), null, mHandler);
updatePointerSpeedFromSettings();
updateShowTouchesFromSettings();
updateAccessibilityLargePointerFromSettings();
updateDeepPressStatusFromSettings("just booted");
}
frameworks\base\services\core\jni\com_android_server_input_InputManagerService.cpp
frameworks\native\services\inputflinger\reader\InputReader.cpp
frameworks\native\services\inputflinger\include\InputReaderBase.h
frameworks\native\services\inputflinger\reader\include\EventHub.h
frameworks\native\services\inputflinger\reader\EventHub.cpp
赋值给mLocked.showTouches
,并 InputReader::requestRefreshConfiguration
刷新mEventHub->wake()
唤醒getEvents()
唤起InputReader线程InputReader::loopOnce()
更新
frameworks\native\services\inputflinger\reader\InputReader.cpp
base\services\core\jni\com_android_server_input_InputManagerService.cpp
TouchInputMapper.cpp
看到这比较疑惑,之后IMS:InputReader线程获取输入事件、IMS:InputDispatcher线程分发事件流程,这个没有看到
showTouches
判断显示Touch点显示,代码搜索字段showTouches
、show_touches
最后看到是在TouchInputMapper.cpp。通过IMS:InputReader线程获取输入事件就是触摸事件显示MultiTouchInputMapper
或SingleTouchInputMapper
frameworks\native\services\inputflinger\reader\mapper\SingleTouchInputMapper.cpp
frameworks\native\services\inputflinger\reader\mapper\MultiTouchInputMapper.cpp
frameworks\native\services\inputflinger\reader\mapper\TouchInputMapper.cpp
InputDevice::configure
更新
frameworks\native\services\inputflinger\reader\InputDevice.cpp
void TouchInputMapper::configureSurface(nsecs_t when, bool* outResetNeeded) {
// ... ... ... ...
// Create pointer controller if needed.
if (mDeviceMode == DEVICE_MODE_POINTER ||
(mDeviceMode == DEVICE_MODE_DIRECT && mConfig.showTouches)) {
if (mPointerController == nullptr) {
mPointerController = getContext()->getPointerController(getDeviceId());
}
} else {
mPointerController.clear();
}
// ... ... ... ...
}
TouchInputMapper::cookAndDispatch
设置Touch轨迹,主要就是由PointerController
控制
frameworks\base\libs\input\PointerController.cpp
最后绘制
frameworks/base/libs/input/SpriteController.cpp
PointerController::setSpots设置,并更新绘制
SpriteController设置setVisible显示