1 鍵掃描碼Scancode是由Linux的Input驅(qū)動框架定義的整數(shù)類型。include/uapi/linux/input.h中有定義: [cpp] view plaincopy
2 鍵掃描碼Scancode經(jīng)過一次轉(zhuǎn)化后,形成按鍵的標(biāo)簽KeycodeLabel->literal,是一個字符串的表示形式。2.1 KCM(KeyCharacterMap):按鍵字符映射文件,位于/system/usr/keychars/目錄,由KeyCharacterMap.cpp解析。按鍵字符映射文件片段:[cpp] view plaincopy
Keyboard Type Declaration一個鍵盤的type聲明描述了鍵盤的總體行為。一個字符映射文件必須包含一個鍵盤type聲明。為清楚起見,它通常被訪者文件頂部。可識別的鍵盤type如下: (1) NUMERIC: 一個數(shù)字鍵盤(12個按鍵)。 一個數(shù)字鍵盤支持多次單擊形式的文本輸入。這對重復(fù)點擊一個按鍵來產(chǎn)生期望的字母或符合的情況可能是必需的。 該鍵盤type通常是為了拇指輸入設(shè)計的。 (2) PREDICTIVE: 一個帶有全字母的鍵盤,每個按鍵代表一個以上的字母。 該鍵盤type通常是為了拇指輸入設(shè)計的。 (3) ALPHA: 一個帶有全字母的鍵盤,也可能有一些數(shù)字。 一個字母鍵盤支持直接的文本編輯,但也可能有一個小型化的濃縮布局。與FULL鍵盤相反,一些符號只能使用屏幕上特殊的字符選擇器進(jìn)行編輯。此外,為了提高輸入速度和精確度,framework為字符鍵盤提供了特殊的支持,例如自動大寫和切換/鎖定SHIFT和ALT按鍵。該鍵盤type通常是為了拇指輸入設(shè)計的。 (4) FULL: 一個全PC樣式的鍵盤。 一個完整的鍵盤像一個PC鍵盤。所有符號都可以用鍵盤上的按鍵直接訪問,不再有屏幕支持的字符選擇器,也不再提供類似自動大寫的支持。 (5) SPECIAL_FUNCTION: 一個鍵盤只用于執(zhí)行系統(tǒng)的控制函數(shù),而不用于輸入。 一個特殊功能鍵盤只包括沒有輸入功能的按鍵,比如HOME和POWER并不是用來做輸入的。 The Generic.kcm and Virtual.kcm key character maps are both FULL keyboards. Key Declarations每個key聲明包括一個關(guān)鍵字key,隨后是一個android key code name,一個{,設(shè)置 properties and behaviors,最后一個}。(A) Properties每個key屬性建立一個從key到behavior的映射。為了更緊密地創(chuàng)建按鍵字符映射文件,一些屬性可以被映射到同一behavior,用逗號分隔。可識別的屬性如下: (1) label: 指定按鍵上物理打印的標(biāo)簽,它由單一字符組成,轉(zhuǎn)換成為的顯示內(nèi)容。 number: 指定數(shù)字文本視圖獲得焦點的行為(字符必須被輸入),例如當(dāng)用戶輸入一個電話號碼。轉(zhuǎn)換成為的顯示數(shù)字。緊密結(jié)合的鍵盤常常在一個按鍵上合并多個符號,這樣同一個按鍵可以被用作'1' and 'a' or '#' and 'q' 進(jìn)行輸入??赡埽瑢τ谶@些按鍵,如果需要的話,它們的數(shù)字屬性被用來指明在數(shù)字上下文中輸入的是哪個信號。 一些典型的“數(shù)字”信號是數(shù)字'0' through '9', '#', '+', '(', ')', ',', and '.'。 (2) base: 指定沒有modifier 被按下的行為(字符必須被輸入)。 <modifier> or <modifier1>+<modifier2>+...: 指定按鍵被按下和所以的指定modifier 被激活的行為(字符必須被輸入)。 例如,modifier 屬性shift指定了一個應(yīng)用LEFT SHIFT or RIGHT SHIFT 修飾符被按下的行為。 同樣地,modifier 屬性rshift+ralt指定了應(yīng)用RIGHT SHIFT and RIGHT ALT modifiers 一起被按下的行為。 (3) modifiers屬性中可識別的modifiers如下: shift: Applies when either the LEFT SHIFT or RIGHT SHIFT modifier is pressed. lshift: Applies when the LEFT SHIFT modifier is pressed. rshift: Applies when the RIGHT SHIFT modifier is pressed. alt: Applies when either the LEFT ALT or RIGHT ALT modifier is pressed. lalt: Applies when the LEFT ALT modifier is pressed. ralt: Applies when the RIGHT ALT modifier is pressed. ctrl: Applies when either the LEFT CONTROL or RIGHT CONTROL modifier is pressed. lctrl: Applies when the LEFT CONTROL modifier is pressed. rctrl: Applies when the RIGHT CONTROL modifier is pressed. meta: Applies when either the LEFT META or RIGHT META modifier is pressed. lmeta: Applies when the LEFT META modifier is pressed. rmeta: Applies when the RIGHT META modifier is pressed. sym: Applies when the SYMBOL modifier is pressed. fn: Applies when the FUNCTION modifier is pressed. capslock: Applies when the CAPS LOCK modifier is locked. numlock: Applies when the NUM LOCK modifier is locked. scrolllock: Applies when the SCROLL LOCK modifier is locked. 這些屬性按順序被列出是有意義的,當(dāng)一個按鍵映射到一個行為,系統(tǒng)按順序掃描所以相關(guān)的屬性,并且返回最后一個發(fā)現(xiàn)的應(yīng)用行為。 因此,給定一個按鍵,晚指定的屬性會覆蓋早指定的屬性。 (B) Behaviors每一個屬性映射一種行為,大多數(shù)的行為都是輸入一個字符,但是也有其他的。一些其他的可識別行為如下:(1) none: 不輸入一個字符。當(dāng)沒有字符指定的時候,這種行為是默認(rèn)的。node是一個可選項,指定了none能提高清晰度。 (2) 'X': 輸入一個指定的文字字符。 這種行為產(chǎn)生是由于一個指定的字符被輸入到文本視圖的焦點。這個文字字符可以是任何的ASCII字符或者是下列轉(zhuǎn)義字符之一: '\\': Type a backslash character.反斜杠。 '\n': Type a new line character (use this for ENTER / RETURN).換行。 '\t': Type a TAB character. '\'': Type an apostrophe character.單引號。 '\"': Type a quote character.引號。 '\uXXXX': Type the Unicode character whose code point is given in hex by XXXX.unicode字符,XXXX'指向一個十六進(jìn)制的數(shù)。 (3) fallback <Android key code name>: Perform a default action if the key is not handled by the application.如果按鍵沒有被應(yīng)用程序處理,就執(zhí)行一個默認(rèn)的動作。 該行為產(chǎn)生的原因是當(dāng)應(yīng)用程序本身不處理指定的按鍵時,系統(tǒng)模擬不同的按鍵按下。它是用來支持一個不是所有應(yīng)用程序都知道怎么處理的新按鍵的默認(rèn)行為,例如轉(zhuǎn)義或者沒有按下大小寫鎖定鍵的數(shù)字鍵盤按鍵。 當(dāng)一個fallback行為被執(zhí)行,應(yīng)用程序?qū)邮盏?個按鍵:一個是原始的按鍵,一個是所選的 fallback按鍵。如果應(yīng)用程序在按鍵抬起的時候處理原始按鍵,那么fallback按鍵時間將被取消。 系統(tǒng)保留兩個unicode編碼執(zhí)行特殊的函數(shù): '\uef00': 當(dāng)該行為被執(zhí)行,文本視圖取消并移除光標(biāo)前的四個字符,將該編碼當(dāng)做十六進(jìn)制數(shù)字,插入到相應(yīng)的unicode編碼點。 '\uef01': 當(dāng)該行為被執(zhí)行,文本視圖顯示一個包含各種符號的字符選擇對話框。 系統(tǒng)可以識別下列unicode編碼作為dead key(與相關(guān)字符組合使用的修飾符鍵)按鍵字符的組合字符: '\u0300': Grave accent.tab沉音符“`”,tab鍵上面的鍵。 '\u0301': Acute accent.尖音符。 '\u0302': Circumflex accent.長音符號。 '\u0303': Tilde accent.波浪線。 '\u0308': Umlaut accent. 當(dāng)一個dead key接著另一個字符被輸入,那么dead key和它跟隨的字符是組合的。例如,當(dāng)用戶跟著字母'a'輸入grave accent dead key,結(jié)構(gòu)是'à'。 2.2 KL(Keycode Layout):按鍵布局文件,位于 /system/usr/keylayout/ 目錄,由KeyLayoutMap.cpp解析。按鍵布局文件片段如下:[cpp] view plaincopy
base/include/androidfw/KeycodeLabels.h中第3列flag定義: [cpp] view plaincopy
2.3 轉(zhuǎn)換按鍵碼native/include/android/keycodes.h中的枚舉值定義了整數(shù)格式的按鍵碼。[cpp] view plaincopy
[cpp] view plaincopy
[cpp] view plaincopy
按鍵的標(biāo)簽KeycodeLabel->literal經(jīng)過轉(zhuǎn)換后,再次形成整數(shù)型的按鍵碼keycode。在Android應(yīng)用程序?qū)?,主要使用按鍵碼keycode來區(qū)分。 3 按鍵的添加在系統(tǒng)需要增加按鍵的時候,一種簡易的做法是使用Android中已經(jīng)定義的“生僻”按鍵碼作為這個新增按鍵的鍵碼。使用這種方式Android的框架層不需要做任何改動。這種方式的潛在問題是當(dāng)某些第三方的應(yīng)用可能已經(jīng)使用那些生僻按鍵時,將意外激發(fā)系統(tǒng)的這種新增的按鍵。(1) include/uapi/linux/input.h中添加自定義的掃描碼。 [cpp] view plaincopy
[cpp] view plaincopy
[cpp] view plaincopy
[cpp] view plaincopy
[cpp] view plaincopy
(6) base/core/res/res/values/attrs.xml配置文件,增加按鍵信息。 [cpp] view plaincopy
isSystem()->native_isSystemKey(mKeyCode)-> base/core/jni/android_view_KeyEvent.cpp [cpp] view plaincopy
|
|