開發者選項-顯示指標位置

luoliang_13發表於2024-06-16

開發者選項-指標位置

應用設定部分

開發者選項-顯示指標位置

搜尋對應字串,在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,這裡和啟用是相對的,這裡會移除新增的視窗,取消事件分發的監聽

相關文章