热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

Android之硬键盘映射----字符映射KeyCharacterMap预备基础知识:http:source.android.comportingkeymaps_keyboard_inp

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

预备基础知识:
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', --→ùúûüűųūŭ

三、附表:本人做的俄文键盘
[type=QWERTY]                                          
                                                       
# keycode       display number  base    caps    fn      caps_fn
                                                       
A               'A'     0x00     'a'     'A'     0x0424    0x0444
B               'B'     0x00     'b'     'B'     0x0418   0x0438
C               'C'     0x00     'c'     'C'     0x0421     0x0441
D               'D'     0x00     'd'     'D'     0x0412     0x0432
E               'E'     '3'           'e'     'E'     0x0423     0x0443
F               'F'     0x00        'f'     'F'     0x0410     0x0430
G               'G'     0x00     'g'     'G'     0x041F     0x043F
H               'H'     0x00     'h'     'H'     0x0420    0x0440
I                 'I'      '8'              'i'     'I'      0x0428    0x0448
J               'J'     0x00         'j'     'J'     0x041E    0x043E
K               'K'     0x00      'k'     'K'     0x041B    0x043B
L               'L'     0x00        'l'     'L'     0x0414    0x0434
M               'M'     0x00     'm'     'M'     0x042C    0x044C
N               'N'     0x00     'n'     'N'     0x0422    0x0442
O               'O'     '9'          'o'     'O'      0x0429    0x0449
P               'P'     '0'           'p'     'P'      0x0417    0x0437
Q               'Q'     '1'          'q'     'Q'      0x0419    0x0439
R               'R'     '4'          'r'     'R'      0x041A    0x043A
S               'S'     0x00     's'     'S'     0x042B    0x044B
T               'T'     '5'            't'     'T'      0x0415    0x0435
U               'U'     '7'          'u'     'U'      0x0413    0x0433
V               'V'     0x00     'v'     'V'       0x041C    0x043C
W               'W'     '2'        'w'     'W'      0x0426    0x0446
X               'X'     0x00      'x'     'X'     0x0427    0x0447
Y               'Y'     '6'            'y'     'Y'      0x041D    0x043D
Z               'Z'     0x00         'z'     'Z'     0x042F    0x044F
                                                       
# on pc keyboards
COMMA           ','     ','     ','     ';'     ';'     '|'
PERIOD          '.'     '.'     '.'     ':'     ':'     0x2026
AT              '@'     '0'     '@'     '0'     '0'     0x2022
SLASH           '/'     '/'     '/'     '?'     '?'     '/'


                                                    
SPACE           0x20    0x20    0x20    0x20    0xEF01  0xEF01   //注:   Android接收到字符值 0xEF01 时,弹出特别字符选择框

ENTER         0xa     0xa     0xa     0xa     0xa     0xa
                                                       
TAB             0x9     0x9     0x9     0x9     0x9     0x9
0               '0'     '0'     '0'     ')'     ')'     ')'
1               '1'     '1'     '1'     '!'     '!'     '!'
2               '2'     '2'     '2'     '@'     '@'     '@'
3               '3'     '3'     '3'     '#'     '#'     '#'
4               '4'     '4'     '4'     '$'     '$'     '$'
5               '5'     '5'     '5'     '%'     '%'     '%'
6               '6'     '6'     '6'     '^'     '^'     '^'
7               '7'     '7'     '7'     '&'     '&'     '&'
8               '8'     '8'     '8'     '*'     '*'     '*'
9               '9'     '9'     '9'     '('     '('     '('
                                                       
GRAVE           '`'     '`'     '`'     '~'     '`'     '~'
MINUS           '-'     '-'     '-'     '_'     '-'     '_'
EQUALS          '='     '='     '='     '+'     '='     '+'
LEFT_BRACKET    '['     '['     '['     '{'     '['     '{'
RIGHT_BRACKET   ']'     ']'     ']'     '}'     ']'     '}'
BACKSLASH       '/'     '/'     '/'     '|'     '/'     '|'
SEMICOLON       ';'     ';'     ';'     ':'     ';'     ':'
APOSTROPHE      '''     '''     '''     '"'     '''     '"'
STAR            '*'     '*'     '*'     '*'     '*'     '*'
POUND           '#'     '#'     '#'     '#'     '#'     '#'
PLUS            '+'     '+'     '+'     '+'     '+'     '+'


推荐阅读
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 使用在线工具jsonschema2pojo根据json生成java对象
    本文介绍了使用在线工具jsonschema2pojo根据json生成java对象的方法。通过该工具,用户只需将json字符串复制到输入框中,即可自动将其转换成java对象。该工具还能解析列表式的json数据,并将嵌套在内层的对象也解析出来。本文以请求github的api为例,展示了使用该工具的步骤和效果。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 猜字母游戏
    猜字母游戏猜字母游戏——设计数据结构猜字母游戏——设计程序结构猜字母游戏——实现字母生成方法猜字母游戏——实现字母检测方法猜字母游戏——实现主方法1猜字母游戏——设计数据结构1.1 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文介绍了在Linux下安装和配置Kafka的方法,包括安装JDK、下载和解压Kafka、配置Kafka的参数,以及配置Kafka的日志目录、服务器IP和日志存放路径等。同时还提供了单机配置部署的方法和zookeeper地址和端口的配置。通过实操成功的案例,帮助读者快速完成Kafka的安装和配置。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
author-avatar
xiaobei爱吃肉
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有