鍵盤版面配置檔案 (.kl
檔案) 會將 Linux 按鍵程式碼和軸程式碼對應至 Android 按鍵程式碼和軸程式碼,並指定相關的政策標記。裝置專屬的按鍵版面配置檔案如下:
- 對於內部 (內建) 輸入裝置 (含有按鍵),此屬性為必要,包括音量、電源和耳機媒體按鍵等特殊按鍵。
- 對於其他輸入裝置,此為選填屬性,但對於專用鍵盤和搖桿,則建議使用。
如果沒有可用的裝置專屬按鍵版面配置檔案,系統會改為選擇預設值。
位置
按鍵版面配置檔案會根據 USB 供應商、產品 (和選版本) ID 或輸入裝置名稱來定位。系統會依序查詢下列路徑:
/odm/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
/vendor/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
/system/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
/data/system/devices/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
/odm/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
/vendor/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
/system/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
/data/system/devices/keylayout/Vendor_XXXX_Product_XXXX.kl
/odm/usr/keylayout/DEVICE_NAME.kl
/vendor/usr/keylayout/DEVICE_NAME.kl
/system/usr/keylayout/DEVICE_NAME.kl
/data/system/devices/keylayout/DEVICE_NAME.kl
/odm/usr/keylayout/Generic.kl
/vendor/usr/keylayout/Generic.kl
/system/usr/keylayout/Generic.kl
/data/system/devices/keylayout/Generic.kl
建構包含裝置名稱的檔案路徑時,裝置名稱中所有字元 (除了 '0'-'9'、'a'-'z'、'A'-'Z'、'-' 或 '_') 都會替換為 '_'。
通用鍵盤配置檔案
系統提供名為 Generic.kl
的特殊內建通用鍵版面配置檔案。這個按鍵配置旨在支援各種標準外接鍵盤和搖桿。請勿修改一般鍵版面配置!
語法
鍵版面配置檔案是純文字檔案,包含鍵或軸宣告和標記。
鍵宣告
鍵宣告包含 key
關鍵字,後面接著 Linux 鍵碼號碼和 Android 鍵碼名稱,或是關鍵字用法,後面接著 HID 用法和 Android 鍵碼名稱。HID 使用量會以 32 位元整數表示,其中高位元 16 位元代表 HID 使用量頁面,低位元 16 位元代表 HID 使用 ID。這兩種聲明後面都可能會附帶一組空格分隔的政策旗標。
key 1 ESCAPE key 114 VOLUME_DOWN key 16 Q VIRTUAL key usage 0x0c006F BRIGHTNESS_UP
系統會辨識下列政策旗標:
FUNCTION
:系統應將按下該鍵視為同時按下 FUNCTION 鍵。GESTURE
:使用者手勢 (例如用手掌輕拍觸控螢幕) 產生的鍵。VIRTUAL
:這是主觸控螢幕旁邊的虛擬軟體鍵 (電容式按鈕)。這會導致啟用特殊的去抖邏輯 (請參閱下文)。
軸宣告
每個軸宣告都包含關鍵字 axis
,後方依序為 Linux 軸程式碼編號和用於控制軸行為的限定詞,包括至少一個 Android 軸程式碼名稱。
基本軸
基本軸只會將 Linux 軸程式碼對應至 Android 軸程式碼名稱。以下宣告會將 ABS_X
(由 0x00
表示) 對應至 AXIS_X
(由 X
表示)。
axis 0x00 X
在上述範例中,如果 ABS_X
的值為 5
,則 AXIS_X
會設為 5
。
分割軸
分割軸會將 Linux 軸程式碼對應至兩個 Android 軸程式碼名稱,以便在對應時將小於或大於閾值的值分割成兩個不同的軸。當裝置回報的單一實體軸編碼為兩個互斥的邏輯軸時,這項對應就很實用。
下列宣告會將 ABS_Y
軸的值 (以 0x01
表示) 對應至 AXIS_GAS
(小於 0x7f
) 或 AXIS_BRAKE
(大於 0x7f
)。
axis 0x01 split 0x7f GAS BRAKE
在上述範例中,如果 ABS_Y
的值為 0x7d
,則 AXIS_GAS
會設為 2
(0x7f - 0x7d
),而 AXIS_BRAKE
會設為 0
。反之,如果 ABS_Y
的值為 0x83
,則 AXIS_GAS
會設為 0
,而 AXIS_BRAKE
會設為 4
(0x83 - 0x7f
)。最後,如果 ABS_Y
的值等於 0x7f
的拆分值,則 AXIS_GAS
和 AXIS_BRAKE
都會設為 0
。
反轉軸
反向軸會將軸值的符號反轉。以下宣告會將 ABS_RZ
(由 0x05
表示) 對應至 AXIS_BRAKE
(由 BRAKE
表示),並透過否定的方式反轉輸出內容。
axis 0x05 invert BRAKE
在上述範例中,如果 ABS_RZ
的值為 2
,則 AXIS_BRAKE
會設為 -2
。
置中平面選項
即使搖桿裝置未使用,也可能會因雜訊而回報輸入事件。這類雜訊通常來自左側和/或右側搖桿,並導致驅動程式回報的位移值接近 0。「center flat」值會指定控制器在靜止時的預期雜訊量。
Linux 輸入通訊協定提供一種方式,讓輸入裝置驅動程式指定搖桿軸的中心平坦值,但並非所有驅動程式都會回報這項資訊,而且有些驅動程式會提供錯誤的值。如要解決這個問題,您可以在軸宣告後方加上 flat
選項,指定軸的中心位置周圍區域的寬度,以便系統判斷該區域是否應視為置中。
舉例來說,如果裝置驅動程式回報的 AXIS_X
值介於 0 和 100 之間,Android 輸入系統會將 0 對應至 -1,將 100 對應至 1。範圍的中心值在未經縮放的座標中為 50,在經過縮放的座標中為 0。如果平面值等於 10,開發人員應假設在 -0.1 和 0.1 (在未經縮放的座標中介於 40 和 60 之間) 之間回報的任何 AXIS_X
值都是雜訊,並將來自搖桿的這些值視為零。
注意:雖然按鍵版面配置檔案會指定驅動程式座標空間的值,但 android.view.InputDevice.MotionRange#getFlat() 所回報的值是在 Android 座標空間中。
axis 0x03 Z flat 4096
在上述範例中,中心平坦值設為 4096
。
留言
註解行以 # 開頭,並延伸至行尾:
# A comment!
系統會忽略空行。
範例
鍵盤
# This is an example of a key layout file for a keyboard. key 1 ESCAPE key 2 1 key 3 2 key 4 3 key 5 4 key 6 5 key 7 6 key 8 7 key 9 8 key 10 9 key 11 0 key 12 MINUS key 13 EQUALS key 14 DEL # etc...
系統控制項
# This is an example of a key layout file for basic system controls, # such as volume and power keys which are typically implemented as GPIO pins # the device decodes into key presses. key 114 VOLUME_DOWN key 115 VOLUME_UP key 116 POWER
電容式按鈕
# This is an example of a key layout file for a touch device with capacitive buttons. key 139 MENU VIRTUAL key 172 HOME VIRTUAL key 158 BACK VIRTUAL key 217 SEARCH VIRTUAL
耳機插孔媒體控制選項
# This is an example of a key layout file for headset mounted media controls. # A typical headset jack interface might have special control wires or detect known # resistive loads as corresponding to media functions or volume controls. # This file assumes that the driver decodes these signals and reports media # controls as key presses. key 163 MEDIA_NEXT key 165 MEDIA_PREVIOUS key 226 HEADSETHOOK
搖桿
# This is an example of a key layout file for a joystick. # These are the buttons that the joystick supports, represented as keys. key 304 BUTTON_A key 305 BUTTON_B key 307 BUTTON_X key 308 BUTTON_Y key 310 BUTTON_L1 key 311 BUTTON_R1 key 314 BUTTON_SELECT key 315 BUTTON_START key 316 BUTTON_MODE key 317 BUTTON_THUMBL key 318 BUTTON_THUMBR # Left and right stick. # The reported value for flat is 128 in a range of -32767 to 32768, which is absurd. # This confuses applications that rely on the flat value because the joystick # actually settles in a flat range of +/- 4096 or so. We override it here. axis 0x00 X flat 4096 axis 0x01 Y flat 4096 axis 0x03 Z flat 4096 axis 0x04 RZ flat 4096 # Triggers. axis 0x02 LTRIGGER axis 0x05 RTRIGGER # Hat. axis 0x10 HAT_X axis 0x11 HAT_Y
虛擬軟體鍵
輸入系統提供特殊功能,可在下列用途中實作虛擬軟體鍵:
- 如果虛擬軟體鍵是以圖形顯示在螢幕上 (例如 Galaxy Nexus),則會由系統 UI 套件中的導覽列元件實作。由於圖形虛擬軟體鍵是在系統的高層級別實作,因此不涉及按鍵版面配置檔案,因此不適用下列資訊。
- 如果虛擬軟體鍵是以擴充的觸控區域 (屬於主要觸控螢幕的一部分,例如 Nexus One) 實作,輸入系統會使用虛擬鍵對應檔案將 X/Y 觸控座標轉譯為 Linux 鍵碼,然後使用鍵盤版面配置檔將 Linux 鍵碼轉譯為 Android 鍵碼 (如需瞭解虛擬鍵對應檔案的詳細資訊,請參閱「觸控裝置」)。觸控螢幕輸入裝置的按鍵版面配置檔案必須指定適當的按鍵對應,並為每個按鍵加入
VIRTUAL
標記。 - 如果虛擬軟體鍵是以與主觸控螢幕分開的電容式按鈕實作 (例如 Nexus S),則核心裝置驅動程式或韌體會負責將觸控動作轉譯為 Linux 按鍵代碼,然後輸入系統會使用按鍵版面配置檔將這些代碼轉譯為 Android 按鍵代碼。電容式按鈕輸入裝置的按鍵版面配置檔案必須指定適當的按鍵對應,並納入每個按鍵的
VIRTUAL
標記。
如果虛擬軟體鍵位於觸控螢幕內或附近,使用者在觸碰螢幕底部附近,或是在螢幕上以手指由上往下或由下往上滑動時,很容易不小心按下按鈕。為避免這種情況發生,輸入系統會稍微延遲回應,在觸控螢幕上最近一次觸碰後,系統會在短暫時間內忽略虛擬軟體鍵按下事件 (這段延遲時間稱為「虛擬鍵靜默時間」)。
如要啟用虛擬軟體鍵去抖功能,請按照下列步驟操作:
- 為觸控螢幕或電容式按鈕輸入裝置提供按鍵版面配置檔案,並為每個按鍵設定
VIRTUAL
標記。key 139 MENU VIRTUAL key 172 HOME VIRTUAL key 158 BACK VIRTUAL key 217 SEARCH VIRTUAL
- 在架構
config.xml
資源的資源疊加層中,設定虛擬鍵靜音時間的值。<!-- Specifies the amount of time to disable virtual keys after the screen is touched to filter out accidental virtual key presses due to swiping gestures or taps near the edge of the display. May be 0 to disable the feature. It is recommended that this value be no more than 250 ms. This feature should be disabled for most devices. --> <integer name="config_virtualKeyQuietTimeMillis">250</integer>