开发者选项-指针位置
应用设置部分
搜索对应字串,在SettingsLib中搜到“指针位置”字串,其id名为pointer_location
根据id在Settings中搜索布局相关(res/xml/development_settings.xml)
查看其key(pointer_location)相关代码
显然,在点击指针位置的控件时,在设置中会对应在Settings.System表中pointer_location字段写入1/0(启用/不启用)
框架监听获取
在WindowManagerService的构造方法中有如下代码(创建一个SettingsObserver对象)
这里SettingsObserver是WindowManagerService的一个内部类
在其构造方法中有注册自身为监听器
查看其onChange方法
从上面SettingsObserver相关代码可看出,在设置中操作指针位置的控件时,设置Settings.System.POINTER_LOCATION的值后,WindowManagerService中SettingsObserver会监听到变更,然后调用updatePointerLocation方法
查看updatePointerLocation方法,这里先根据DisplayPolicy::setPointerLocationEnabled方法和获取的mPointerLocationEnabled状态值生成了一个PooledCOnsumer变量,然后将其作为参数调用了mRoot.forAllDisplayPolicies方法
这里mRoot是RootWindowContainer变量,查看其forAllDisplayPolicies方法
这里mChildren是一个列表,里面元素是DisplayContent对象,一般单屏幕机器就一个屏幕,mChildren也就只有一个元素,其getDisplayPolicy方法返回的也就是DisplayPolicy的对象
上面updatePointerLocation最后会调用DisplayPolicy的setPointerLocationEnabled方法
一般只有一个屏幕时isDefaultDisplay肯定时true,从上面代码看这里主要发送了个消息MSG_ENABLE_POINTER_LOCATION/MSG_DISABLE_POINTER_LOCATION(启用/不启用),查看消息处理代码
先看下启用时逻辑:
显然这里主要是添加了一个根节点控件为PointerLocationView的窗口(窗口名为PointerLocation – display 0)(窗口只显示了指针位置和上方显示坐标等信息的横条,其他基本是透明的,且该窗口不拦截事件,使其透传到下方),并添加了事件分发的监听,在监听到事件时,进行重绘,在其onDraw方法中有相关绘制逻辑,具体绘制这里不详述
在关闭启用时调用disablePointerLocation,这里和启用是相对的,这里会移除添加的窗口,取消事件分发的监听
标签:选项,控件,SettingsObserver,启用,开发者,方法,监听,指针 From: https://www.cnblogs.com/luoliang13/p/18250716