首页 > 其他分享 >开发者选项-显示点按操作反馈

开发者选项-显示点按操作反馈

时间:2024-06-16 15:59:41浏览次数:15  
标签:选项 调用 这里 代码 反馈 InputReader 开发者 cpp 方法

开发者选项-显示点按操作反馈

Settings设置入口

首先查看界面中字串“显示点按操作反馈”:

在SettingsLib中,有字串show_touches

根据字串id查看对应的布局和代码调用

在Settings中,有对应的使用上述字串的布局文件res/xml/development_settings.xml

查看代码中操作控件后行为

显然在点击switch按钮后,会将0/1表示不启用/启用的状态写入到settings.system表中(show_touches)

框架监听获取

然后便是查看监听并获取该值的地方,查找代码在frameworks/base/services/core/java/com/android/server/input/InputManagerService.java中,有对Settings.System.SHOW_TOUCHES添加监听其

从上面截图代码可知,在InputManagerService启动的时候会对Settings.System.SHOW_TOUCHES添加监听(查看android14版本添加监听的地方有变更,这里以android12为例讲解,大致逻辑应该差别不大),在监听到变化时,会获取该值然后调用nativeSetShowTouches方法

nativeSetShowTouches

nativeSetShowTouches是个native方法查看其对应native方法(frameworks/base/services/core/jni/com_android_server_input_InputManagerService.cpp)

从上面代码看到nativeSetShowTouches会调用NativeInputManager的setShowTouches方法,而setShowTouches方法主要做了两件事,一是将新的是否显示点按操作反馈的状态赋值给mLocked.showTouches,然后是调用了InputReader的requestRefreshConfiguration方法(这里mInputManager.getReader获取的就是inputflinger中的InputReader的对象)

在InputReader的requestRefreshConfiguration方法中主要也就将InputReaderConfiguration::CHANGE_SHOW_TOUCHES赋值给了mConfigurationChangesToRefresh

InputReader使用mConfigurationChangesToRefresh

在InputManagerService启动的时候会调用nativeStart方法,其会调用到inputflinger的InputManager的start方法,然后会调用InputReader的start方法如上,然后有创建InputThread,如上图在InputThread的构造方法中会创建InputThreadImpl并调用其run方法,InputThreadImpl继承Thread,所以创建InputThread后即会循环调用上面传入的loopOnce方法(这里分析了下inputflinger的部分启动逻辑,主要是因为其涉及InputReader相关调用与上面mConfigurationChangesToRefresh相关,所以简要介绍下逻辑)

这里回到InputReader中,在其loopOnce方法中

显然在InputReader中的loopOnce方法中,这里如果mConfigurationChangesToRefresh有变化,则会调用refreshConfigurationLocked方法

上面代码中与这里要讲的场景相关的逻辑主要就下面两行代码,

mPolicy->getReaderConfiguration(&mConfig);

device->configure(now, &mConfig, changes);

mPolicy->getReaderConfiguration(&mConfig)

这里mPolicy根据创建过程,即是NativeInputManager对象(com_android_server_input_InputManagerService.cpp)而其getReaderConfiguration方法,这里相关的主要是将前面开关的状态赋值给了InputReader的mConfig

device->configure(now, &mConfig, changes)

然后再看下device->configure(now, &mConfig, changes);的逻辑(InputDevice.cpp)

这里在这里的场景下主要会调用mapper.configure方法,这里mapper是InputMapper类型,根据这里的场景和手机一般的输入设备触屏,之类的mapper应该是TouchInputMapper类型,查看其configure方法

这里重新见到了前面change变化的项CHANGE_SHOW_TOUCHES,这里会调用configureSurface方法

在configureSurface中如果是打开显示点按操作反馈,则必然会对mPointerController赋值

而在touch事件时,会走到TouchInputMapper的cookAndDispatch方法,该方法中有调用updateTouchSpots

这里其实已经快到机器上看到的圆点了,这里对mPointerController的调用就是对圆点的相关设置

我们先看下这个mPointerController到底是什么

TouchInputMapper.cpp

InputReader.cpp

这里有看到mPolicy,前面分析过,是在native的cpp文件中

显然mPointerController就是PointerController的create方法创建的一个对象

而查看相关方法,如setSpots方法其又会调用到TouchSpotController::setSpots,然后会调用到SpriteController.cpp,在这里,终于看到了其显示相关的逻辑,在其doUpdateSprites方法中

在doUpdateSprites方法中有调用obtainSurface方法,而其看代码会调用到surfaceflinger接口去创建显示相关逻辑

在SpriteController的doUpdateSprites方法中还能看到如下代码

其中icon是SpriteIcon对象,其会绘制图片,这里图片是通过jni调到框架java层从framework-res系统资源中获取的(android_view_PointerIcon_getSystemIcon、android_view_PointerIcon_loadSystemIcon)

小节

分析到这里其实大部分逻辑都已经走读过了,剩下的一些细节暂不继续分析,其总体大致逻辑是设置打开开关后会通知到inputflinger,然后在分发事件时会刷新相关显示,不过整体涉及模块较多,包括设置应用,framework的java层,jni,inputflinger,libinputservice,还有系统资源等,所以相对比较复杂

标签:选项,调用,这里,代码,反馈,InputReader,开发者,cpp,方法
From: https://www.cnblogs.com/luoliang13/p/18250715

相关文章

  • 开发者选项-显示指针位置
    开发者选项-指针位置应用设置部分搜索对应字串,在SettingsLib中搜到“指针位置”字串,其id名为pointer_location根据id在Settings中搜索布局相关(res/xml/development_settings.xml)查看其key(pointer_location)相关代码显然,在点击指针位置的控件时,在设置中会对应在Settings.System表中p......
  • 博客园商业化之路-众包平台:继续召集早期合作开发者
    会员、周边、广告是园子现在维持生存的主要收入来源,而众包平台是园子未来实现商业化规模增长的希望所在。今年5月开始的众包平台建设是万里长征,不仅需要融资,还需要找到合伙人组建新的团队。虽然当前既没有钱又没人,但万里长征已经迈出了第一步,采用企业微信+自己搭建的gitlab以原......
  • 视频生成模型 Dream Machine 开放试用;微软将停止 Copilot GPTs丨 RTE 开发者日报 Vol.
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编......
  • 深入探索Chrome开发者工具:开发者的利器
    前言作为一名测试,我们经常需要对web页面进行测试,很多时候我们都需要借助Chrome开发者工具(ChromeDevTools)来进行测试,无论是前端开发还是调试问题,都是必不可少的利器。本文就来给大家介绍一下Chrome开发者的使用。什么是Chrome开发者工具?Chrome开发者工具(DevTools)是GoogleChro......
  • 发布会后苹果股价创历史新高;商汤 Embedding 模型拿下 SOTA丨 RTE 开发者日报 Vol.223
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编......
  • 【实际-有功-无功控制器的动态性能】【两级电压源变流器VSC】【采用电流控制的实际/无
     ......
  • 为开发者提供有力帮助(电商API接口大全,封装接口:商品详情,视频详情,订单详情等)
    为开发者提供有力帮助的电商API接口大全API接口接入(taobao2024api)及封装接口介绍如下:一、电商API接口大全在电商领域,API接口是开发者与电商平台进行交互的桥梁。以下是一些常见的电商API接口及其功能:支付接口:如支付宝支付、微信支付、银联支付等,用于实现电商平台的支付功能......
  • 在Linux中,当用户反馈网站访问慢,如何处理?
    当用户反馈网站访问慢时,在Linux环境中进行问题排查和解决可以遵循以下步骤:确认问题存在:首先,尝试复现问题。自己或让同事从不同地点和网络环境下访问网站,看是否同样慢。使用浏览器的开发者工具(如Chrome的Network面板)检查页面加载时间,识别哪个资源加载慢。定位问题源头:......
  • js逆向-2-chrome开发者工具
    你真的认识浏览器吗?DevTool官方文档:ChromeDevTools | ChromeforDevelopers使用Chrome开发者工具调试和优化Web应用。https://developers.google.cn/web/tools/chrome-devtools/打开chrome开发者工具有一些网站会禁用右键检查和键盘事件,但是我们有很多方法可以打......
  • AD8009ARZ-REEL7高速电流反馈放大器中文资料PDF数据手册引脚图产品参数特性
    AD8009是一款超高速电流反馈放大器,具有惊人的5,500V/μs压摆率,上升时间为545ps,非常适合作为脉冲放大器使用。高转换速率降低了转换速率限制的影响,并导致高分辨率视频图形系统所需的440MHz大信号带宽。信号质量在宽带宽内保持,最坏情况下失真为-40dBc@250MHz(G=+10,1......