预备基础知识:
http://source.android.com/porting/keymaps_keyboard_input.html
http://blog.csdn.net/skdev/archive/2010/03/08/5355542.aspx 键盘映射流程,讲的已经很详细了。
http://www.kandroid.org/android_pdk/keymaps_keyboard_input.html
如何实现了一键对应多个字符的输出
如果你的键盘是全键盘(包括了ALT、SHIFT、CAPS_LOCK功能键)基本上用Android默认的键盘映射文件qwerty.kcm,qwerty.kl就可以了。如果需要修改按键映射字符可以修改kcm 文件, 如果不幸遇上NC的产品设计人员,拍脑袋搞出一个残缺不全的键盘出来,就要动点心思改改Android framework层了。无奈,刚好这种事被我碰上了~~~~ 只有SHIFT键位,只好用SHIFT来回切换来实现小写字母、大写字母、数字符号三种输入,就像输入法软件盘一样实现三种输入模式。
一、什么是META Keys:就是ALT、SHIFT、CAPS_LOCK了。
首先,需要理解kcm文件的意义
第一列:keycode,由kernel层发出,经*.kl键盘映射文件得到keycode;
base列:META_KEY没有被激活时的状态,即MetaState==0时映射的字符;
caps列:毫无疑问,是SHIFT或CAPS_LOCK被激活时的状态,此时MetaState==1时,映射的字符;
fn列:ALT被激活,对应MetaState==2时映射的字符;
caps_fn列:ALT,SHIFT或CAPS_LOCK同时被激活时映射的字符;此时MetaState==3;
number列:getNumber(mKeyCode)返回该键代表的数值;
./base/core/java/android/view/KeyEvent.java:871:
public char getNumber() {
return KeyCharacterMap.load(mDeviceId).getNumber(mKeyCode);
Display列:同上,由getDisplay返回;
通过这种方式,实现了一键对应多个字符的输出,
Qwerty键盘映射语句实现位置在:frameworks/base/core/java/android/text/method/QwertyKeyListener.java文件中
int i = event.getUnicodeChar(getMetaState(content));//getMetaState(content)分别为0,1,2,3 对应
getUnicodeChar(int meta)函数实现位于文件frameworks/base/core/java/android/view/KeyEvent.java:
/base/core/java/android/view/KeyCharacterMap.java:139:
unsigned short KeyCharacterMap::get(int keycode, int meta)
您还需关注的文件有MetaKeyKeyListener.java,在该文件中人为地、暴力地改变MetaKey的状态或返回值。
二、 长按按键时,弹出带音标的候选字符
代码:public final int getRepeatCount() { return mRepeatCount; }
'A', ----→ĂÀÁÂÃÅÆĄ
'E', ---→ÈÉÊËĖĘĚ
'I', ---→ ÌÍÎÏ Ī
'O', ---→ÒÓÔÕÖŎŐ
'U',---→ ÙÚÛÜŰŲ
'a', ---→àáâãäåæ
'e',--→ èéêëëě
'o',---→ òóôő
'u', --→ùúûüűųūŭ
可以在edittext放置validation,或者在runtime中搜索当你一个key被按下,或者是一个key具有特殊功能
----------------------------------------------------------------------------------------------------------------------------------------------------
KeyCharacterMap是一个辅助的功能:由于按键码只是一个与UI无关整数,通常用程序对其进行捕获处理,然而如果将按键事件转换为用户可见的内容,就需要经过这个层次的转换了。
KeyCharacterMap需要从本地层传送到Java层,JNI的代码路径如下所示:
frameworks/base/core/jni/android_text_KeyCharacterMap.cpp KeyCharacterMap Java框架层次的代码如下所示:
frameworks/base/core/Java/android/view/KeyCharacterMap.Java android.view.KeyCharacterMap类是Android平台的API可以在应用程序中使用这个类。
android.text.method中有各种Linstener,可以之间监听KeyCharacterMap相关的信息。DigitsKeyListener NumberKeyListener TextKeyListener。
以上关于按键码和按键字符映射的内容是在代码中实现的内容,还需要配合动态的配置文件来使用。在实现Android系统的时候,有可能需要更改这两种文件。
动态的配置文件包括:
KL(Keycode Layout):后缀名为kl的配置文件
KCM(KeyCharacterMap):后缀名为kcm的配置文件
Donut及其之前配置文件的路径为:
development/emulator/keymaps/ Eclair及其之后配置文件的路径为:
sdk/emulator/keymaps/ 这些配置文件经过系统生成后,将被放置在目标文件系统的/system/usr/keylayout/目录或者/system/usr/keychars/目录中。
提示:kl文件将被直接复职到目标文件系统中;由于尺寸较大,kcm文件放置在目标文件系统中之前,需要经过压缩处理。KeyLayoutMap.cpp负责解析处理kl文件,KeyCharacterMap.cpp负责解析kcm文件。