一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

按鍵映射

 寫意人生 2014-06-27

1 鍵掃描碼Scancode是由Linux的Input驅(qū)動框架定義的整數(shù)類型。

include/uapi/linux/input.h中有定義:

  1. ......  
  2. #define KEY_VOLUMEDOWN      114  
  3. #define KEY_VOLUMEUP        115  
  4. #define KEY_POWER       116 /* SC System Power Down */#define KEY_MENU      139 /* Menu (show menu) */  
  5. #define KEY_BACK        158 /* AC Back */  
  6. ......  

2 鍵掃描碼Scancode經(jīng)過一次轉(zhuǎn)化后,形成按鍵的標(biāo)簽KeycodeLabel->literal,是一個字符串的表示形式。

2.1 KCM(KeyCharacterMap):按鍵字符映射文件,位于/system/usr/keychars/目錄,由KeyCharacterMap.cpp解析。

按鍵字符映射文件片段:
  1. type FULL  
  2. key A {  
  3.     label:                              'A'  
  4.     base:                               'a'  
  5.     shift, capslock:                    'A'  
  6. }  
  7. key SPACE {  
  8.     label:                              ' '  
  9.     base:                               ' '  
  10.     alt, meta:                          fallback SEARCH  
  11.     ctrl:                               fallback LANGUAGE_SWITCH  
  12. }  

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解析。

按鍵布局文件片段如下:
  1. key 158   BACK  
  2. key 139   MENU  
  3. key 108   DPAD_DOWN  
  4. key 103   DPAD_UP  
  5. key 102   HOME  
  6. key 115   VOLUME_UP         WAKE  
  7. key 114   VOLUME_DOWN       WAKE  
  8. key 116   POWER             WAKE  
第一列為按鍵的掃描碼,是一個整數(shù)值;第2列為按鍵的標(biāo)簽,是一個字符串。第3列表示按鍵的Flag,經(jīng)過*.kl即完成了按鍵信息的第1次轉(zhuǎn)化,將整型的掃描碼,轉(zhuǎn)換成字符串類型的按鍵標(biāo)簽。
base/include/androidfw/KeycodeLabels.h中第3列flag定義:
  1. static const KeycodeLabel FLAGS[] = {  
  2.     { "WAKE", 0x00000001 }, //可以喚醒休眠,并通知應(yīng)用層  
  3.     { "WAKE_DROPPED", 0x00000002 }, //可以喚醒休眠,不通知應(yīng)用層  
  4.     { "SHIFT", 0x00000004 }, //自動附加SHIFT  
  5.     { "CAPS_LOCK", 0x00000008 }, //自動附加CAPS_LOCK  
  6.     { "ALT", 0x00000010 }, //自動附加ALT  
  7.     { "ALT_GR", 0x00000020 },  
  8.     { "MENU", 0x00000040 },  
  9.     { "LAUNCHER", 0x00000080 },  
  10.     { "VIRTUAL", 0x00000100 },  
  11.     { "FUNCTION", 0x00000200 },  
  12.     { NULL, 0 }  
  13. };  

2.3 轉(zhuǎn)換按鍵碼

native/include/android/keycodes.h中的枚舉值定義了整數(shù)格式的按鍵碼。
  1. enum {  
  2.     AKEYCODE_UNKNOWN         = 0,  
  3.     AKEYCODE_SOFT_LEFT       = 1,  
  4.   AKEYCODE_SOFT_RIGHT      = 2,  
  5.   ......  
  6.     AKEYCODE_ASSIST          = 219,  
  7.     AKEYCODE_BRIGHTNESS_DOWN = 220,  
  8.     AKEYCODE_BRIGHTNESS_UP   = 221,  
  9.   
  10.     // NOTE: If you add a new keycode here you must also add it to several other files.  
  11.     //       Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.  
  12. };  
base/include/androidfw/KeycodeLabels.h中KEYCODES[]數(shù)組定義了按鍵標(biāo)簽KeycodeLabel->literal和按鍵碼KeycodeLabel->value的映射關(guān)系。
  1. static const KeycodeLabel KEYCODES[] = {  
  2.     { "SOFT_LEFT", 1 },  
  3.   { "SOFT_RIGHT", 2 },  
  4.   ......  
  5.     { NULL, 0 }  
  6. };  
這些按鍵碼與keycodes.h中枚舉值的按鍵碼是一致的。base/core/java/android/view/KeyEvent.java 中定義了android.view.KeyEvent類,其中定義的key code整型常量與按鍵碼也是一致的。
  1. public class KeyEvent extends InputEvent implements Parcelable {  
  2.     /** Key code constant: Unknown key code. */  
  3.     public static final int KEYCODE_UNKNOWN         = 0;  
  4.     /** Key code constant: Soft Left key. 
  5.      * Usually situated below the display on phones and used as a multi-function 
  6.      * feature key for selecting a software defined function shown on the bottom left 
  7.      * of the display. */  
  8.     public static final int KEYCODE_SOFT_LEFT       = 1;  
  9.     /** Key code constant: Soft Right key. 
  10.      * Usually situated below the display on phones and used as a multi-function 
  11.      * feature key for selecting a software defined function shown on the bottom right 
  12.      * of the display. */  
  13.   public static final int KEYCODE_SOFT_RIGHT      = 2;  
  14.   ......  
  15. }  
經(jīng)過按鍵布局文件*.kl轉(zhuǎn)換后,形成按鍵的標(biāo)簽KeycodeLabel->literal。根據(jù)KEYCODES[]的定義,通過這個標(biāo)簽可以找到對應(yīng)的按鍵碼KeycodeLabel->value。
按鍵的標(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中添加自定義的掃描碼。
  1. /* Code 255 is reserved for special needs of AT keyboard driver */  
  2. #define KEY_CUSTOM      249   
(2) *.kl按鍵布局文件中添加鍵值信息,不要與已有信息重復(fù)。
  1. key 249   CUSTOM  
(3) native/include/android/keycodes.h中添加鍵值,這是給native空間用的。
  1. enum {  
  2.     AKEYCODE_UNKNOWN         = 0,  
  3.     AKEYCODE_SOFT_LEFT       = 1,  
  4.   AKEYCODE_SOFT_RIGHT      = 2,  
  5.   ......  
  6.   AKEYCODE_CUSTOM      = 222,  
  7. };  
(4) base/include/androidfw/KeycodeLabels.h中KEYCODES[]數(shù)組里添加按鍵標(biāo)簽和鍵值映射信息。
  1. static const KeycodeLabel KEYCODES[] = {  
  2.     { "SOFT_LEFT", 1 },  
  3.   { "SOFT_RIGHT", 2 },  
  4.   { "CUSTOM", 222 },  
  5.     { NULL, 0 }  
  6. };  
(5) base/core/java/android/view/KeyEvent.java中添加按鍵編碼,這個給android空間用的。
  1. public class KeyEvent extends InputEvent implements Parcelable {  
  2.     public static final int KEYCODE_UNKNOWN         = 0;  
  3.     public static final int KEYCODE_SOFT_LEFT       = 1;  
  4.   public static final int KEYCODE_SOFT_RIGHT      = 2;  
  5.   ......  
  6.   public static final int KEYCODE_CUSTOM      = 222;  
  7. }  
一般需要修改private static final int LAST_KEYCODE = KEYCODE_CUSTOM;
(6) base/core/res/res/values/attrs.xml配置文件,增加按鍵信息。
  1. <enum name="KEYCODE_CUSTOM" value="222" />  
(7) 如果是系統(tǒng)按鍵base/core/java/android/view/KeyEvent.java中
isSystem()->native_isSystemKey(mKeyCode)->
base/core/jni/android_view_KeyEvent.cpp
  1. bool KeyEvent::isSystemKey(int32_t keyCode) {  
  2.     switch (keyCode) {  
  3.         case AKEYCODE_MENU:  
  4.         case AKEYCODE_SOFT_RIGHT:  
  5.         case AKEYCODE_HOME:  
  6.         case AKEYCODE_BACK:  
  7.         case AKEYCODE_CALL:  
  8.         case AKEYCODE_CUSTOM:  
  9.             return true;  
  10.     }  
  11.       
  12.     return false;  
  13. }  
(8) 如果需要修改external/webkit/WebKit/android/plugins/ANPKeyCodes.h。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    人妻少妇久久中文字幕久久| 中文字幕人妻一区二区免费| 国产老熟女超碰一区二区三区| 久久精视频免费视频观看| 国产不卡的视频在线观看| 日韩aa一区二区三区| 自拍偷拍福利视频在线观看| 日木乱偷人妻中文字幕在线| 国产日韩欧美专区一区| 欧美激情中文字幕综合八区| 国产熟女高清一区二区| 午夜精品国产一区在线观看| 日本高清一道一二三区四五区| 国产精品推荐在线一区| 不卡免费成人日韩精品| 国产高清精品福利私拍| 亚洲男人天堂网在线视频| 欧美成人黄色一级视频| 日本少妇中文字幕不卡视频| 日本和亚洲的香蕉视频| 精品一区二区三区中文字幕| 白丝美女被插入视频在线观看| 黄色av尤物白丝在线播放网址| 日本欧美在线一区二区三区| 观看日韩精品在线视频| 日本人妻精品中文字幕不卡乱码| 亚洲视频一级二级三级| 日韩精品你懂的在线观看| 91熟女大屁股偷偷对白| 精品推荐国产麻豆剧传媒| 欧美午夜一区二区福利视频| 欧美不卡高清一区二区三区| 神马午夜福利一区二区| 中国美女草逼一级黄片视频| 国产午夜精品福利免费不| 91一区国产中文字幕| 五月婷婷缴情七月丁香| 极品熟女一区二区三区| 91午夜少妇极品福利| 亚洲天堂精品一区二区| 精品国产亚洲av成人一区|