在 Android 9 以下版本中,您無法透過觸控與多個螢幕互動,因為螢幕和輸入裝置之間沒有關聯機制。舉例來說,觸控螢幕顯示器可提供 HDMI 視訊輸出 (會在 Android 上註冊為顯示器),以及觸控螢幕的 USB 輸出 (會註冊為輸入裝置)。如果以這種方式連接多部裝置,就無法判斷哪個輸入裝置屬於哪個螢幕。同樣的問題也適用於內建多個螢幕的摺疊式裝置。
Android 10 新增了一種機制,可指定哪些輸入裝置屬於哪些螢幕。此關聯是透過通訊埠編號完成,其中 port 是指螢幕所連接的實體通訊埠。
舉例來說,如果 Android 裝置有兩個 HDMI 連接埠,分別標示為 hdmi1
和 hdmi2
,則顯示埠值可能為 1
和 2
。即使不同的螢幕 (例如不同的顯示型號或製造商) 連上同一個實體 HDMI 連接埠,連接埠值仍會保持不變。這可讓裝置製造商提供組裝和升級螢幕的指示。
關聯是在 /vendor/etc/input-port-associations.xml
中設定。例如:
<ports>
<port display="0" input="usb-xhci-hcd.0.auto-1.1/input0" />
<port display="1" input="usb-xhci-hcd.0.auto-1.2/input0" />
</ports>
在上述範例中,display="0"
會指定螢幕連線的通訊埠。input="usb-xhci-hcd.0.auto-1.1/input0"
指定輸入裝置所連接的通訊埠。如要判斷與特定裝置相關聯的連接埠,請使用下列終端機指令,然後查看 Event Hub 狀態中這些裝置的 location
屬性。
adb shell dumpsys input
如果有多部裝置處於連線狀態,請輕觸特定裝置,檢查輸入調度器狀態中的 RecentQueue
陣列。接著,您可以找出產生最近事件的裝置。然後,您可以在事件中心狀態中找到對應的裝置。
如要判斷指派給已連結螢幕的顯示通訊埠,請使用 adb shell dumpsys display
,然後在「Display Devices」底下找出每個螢幕的 DisplayDeviceInfo
的 address
屬性。或者,您也可以使用 adb shell dumpsys SurfaceFlinger --display-id
將所有已連線顯示器的 ID 資訊轉儲。另請參閱「靜態顯示 ID」一文。
如果您為特定輸入裝置指定關聯,但系統中沒有對應的顯示畫面,輸入裝置會停用,直到顯示畫面出現為止。只能與觸控裝置建立關聯。
動態多螢幕轉送
您可以使用 Android 10 設定靜態多螢幕裝置。尚未啟用動態關聯。不過,您可以為不一定會出現或使用虛擬輸入裝置的螢幕和輸入面板提供路由資訊,然後為這些虛擬裝置提供額外的路由資訊,以解決某些用途。如果裝置導入方式支援:
- 與媒體站相關的操作體驗與站點服務類似,您可以提供轉送設定,將連接到座架的輸入配件 (依通訊埠識別) 傳送至外部螢幕 (以連接埠識別) 的目標輸入做為目標輸入。
- 當主要螢幕連接至外部螢幕時,會充當輸入來源 (例如觸控板),然後提供路由設定,將從虛擬觸控面板 (以獨特虛擬 ID 識別) 指定的輸入內容,轉送至外部螢幕 (以通訊埠識別)。
實作
- 對於實體裝置,輸入裝置連接的連接埠和螢幕連接的連接埠,用於將螢幕與觸控螢幕配對。
- 對應關係會儲存在
InputReaderConfiguration
中。 TouchInputMapper.mViewport
會設為與InputDevice.location
指定的通訊埠相符的可視區域。- 如果對應檔案中指定了輸入裝置埠,但目前沒有任何檢視區域具有相符的顯示埠,則該埠上的輸入裝置會停用。
- 如果未為特定輸入裝置指定通訊埠,系統會根據現有規則設定視區。
- 輸入驅動程式不需要進行核心變更。
- 輸入裝置連接埠是由 EVIOCGPHYS ioctl 決定。