Android之硬键盘映射----字符映射KeyCharacterMap

来源:互联网 发布:三星s7开发者选项优化 编辑:程序博客网 时间:2024/05/21 12:40


预备基础知识:
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文件。


 

原创粉丝点击