Android自定义键盘之汉字键盘
每日推荐
Google开源的一款JPEG编码器,据说比libjpeg生成的图片小20%~30%,主要是针对高质量的图片(已经压缩过的图再进行guetzli可能效果并不明显),此外注意生成的是JPG图,不支持alpha通道。有兴趣的可以关注下。
https://github.com/google/guetzli
本文作者
本文由lintax投稿。
lintaxd的博客地址:
http://blog.csdn.net/lintax
实现软键盘主要用到了系统的两个类:Keyboard和KeyboardView。
Keyboard类源码的介绍是: Listener for virtual keyboard events.即用于监听虚拟键盘。
KeyboardView类源码的介绍是: A view that renders a virtual {@link Keyboard}. It handles rendering of keys and detecting key presses and touch movements.即它处理绘制键盘和检测按键和触摸动作。
它里面有很多方法,在我们自定义的软键盘很多属性,就需要我们用这个类来设置。
比如:
了解一些源码,就可以是我们知道我们为什么要这样写,为什么要这样做了!
首先在res下新建xml文件夹,在xml文件夹中新建symbols.xml文件,这个布局文件主要是实现数字软键盘的布局,每一个按键都有一个codes值,在类中就是通过codes值来监听每一个按钮。
数字键盘界面如下:
在上面的键盘定义中,通过Keyboard说明是一个软键盘定义文件,Row元素说明这是一行按键的定义,Key元素说明这是一个按键的定义。
Key元素通过一些属性来定义每个按键,下面是一些常用的属性介绍:
Codes:代表按键对应的输出值,可以为unicode值或者逗号(,)分割的多个值,也可以为一个字符串。在字符串中通过“\”来转义特殊字符,例如 ‘\n’ 或则 ‘\uxxxx’ 。
Codes通常用来定义该键的键码,例如上图中的数字按键1对应的为49;如果提供的是逗号分割的多个值则和普通手机输入键盘一样在多个值之间切换。
keyLabel:代表按键显示的文本内容。
keyIcon:代表按键显示的图标内容,如果指定了该值则在显示的时候显示为图片不显示文本。
keyWidth:代表按键的宽度,可以为精确值或则相对值,对于精确值支持多种单位,例如:像素,英寸 等;相对值为相对于基础取值的百分比,为以% 或%p 结尾,其中%p表示相对于父容器。
keyHeight:代表按键的高度,取值同上。
horizontalGap:代表按键前的间隙(水平方向),取值同上。
isSticky:指定按键是否为sticky的。例如Shift大小写切换按键,具有两种状态,按下状态和正常状态,取值为true或者false。
isModifier:指定按键是否为功能键( modifier key ) ,例如 Alt 或者 Shift ,取值为true或false。
keyOutputText:指定按键输出的文本内容,取值为字符串。
isRepeatable:指定按键是否是可重复的,如果长按该键可以触发重复按键事件则为true,否则为false。
keyEdgeFlags:指定按键的对齐指令,取值为left或right。
我们在设置每一个按键的code时,就是根据keyboard类中定义的一些属性,比如回退,切换,完成等都是固定的。
知道了这些,我们就不会有太多的疑惑了!也是说,我们自定义的每一个按键都将会有一个codes值,比如回退我们就写成:
<Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete" />
在监听处就是:
if (primaryCode == Keyboard.KEYCODE_DELETE){}
这就表示,监听回退事件了!
然后在xml文件夹中新建chinese.xml文件,这个布局文件主要是实现中文软键盘的布局,每一个按键都有一个codes值,这个codes就是一个汉字在utf16标准中的编码值。
查找汉字的编码,有两种方法:
1,直接查找utf16表,可以参考:
http://blog.csdn.net/lintax/article/details/51866861
如果汉字个数比较多,需要将汉字与编码值一个个准确对应的键入xml中,也是一个挺费神的事情。
2,使用程序员的办法,用代码来帮我们实现:
这样,就按照xml中的格式,写好了汉字与编码值的关联语句。
剩下还有一个小问题:在logcat的输出中,还有其他的信息,如时间、log等级等,如下:
07-16 18:20:12.220: I/key(5200): <Key android:codes="29677" android:keyLabel="班" />
我们可以将logcat信息保存到文本文件中,使用一个文本编辑器将前面的不想要的信息(此处是“07-16 18:20:12.220: I/key(5200): ”)全部替换为8个空格即可。
为何是8个空格?是为了xml中的格式对齐。
最终,xml中文件内容如下:
中文键盘最终画面如下:
然后创建一个类,用于处理软键盘事件,文件名为KeyboardUtil.,里面主要完成几件事:
1,构造函数,2,键盘动作监听与处理;3,几个对外控制键盘显隐的接口;
首先定义构造函数:
然后是最核心的键盘动作监听,在这里我只展示了最核心的onKey(),完整的代码,请参考文末的demo。
onKey()中首先是处理了几个特殊键,有“完成”、“删除”、数字与汉字的切换键。
另外,就是字符的键入处理了,代码如下:
另外还有几个函数,是对外的接口,控制键盘的显示与隐藏,已经控制显示哪种键盘,是显示汉字键盘,还是数字键盘。
接下来就是实现activity的视图布局文件了,文件名为main.xml,主体部分就是两个EditText,一个用于输入班级(汉字),一个用于输入分数(数字)。
另外就是我们自定义的KeyboardView了,默认为隐藏的,在我们点击文本输入框时,会显示出来。按照一般的输入习惯,将键盘放于界面的底部。
内容如下:
最后就是在要执行的activity中,添加一些代码就行了,剩下的就和其他控件使用方式一样了,类名为KeydemoActivity.java,内容如下:
最后的运行界面如下:
demo地址:
http://download.csdn.net/detail/lintax/9577994
参考
http://blog.csdn.net/hfsu0419/article/details/7924673
http://blog.csdn.net/acrambler/article/details/13213181
优秀人才不缺工作机会,只缺适合自己的好机会。但是他们往往没有精力从海量机会中找到最适合的那个。
100offer 会对平台上的人才和企业进行严格筛选,让「最好的人才」和「最好的公司」相遇。
扫描下方二维码,注册 100offer,谈谈你对下一份工作的期待。一周内,收到 5-10 个满足你要求的好机会!
如果你有想学习的文章直接留言,我会整理征稿。如果你有好的文章想和大家分享欢迎投稿,直接向我投递文章链接即可。
欢迎长按下图->识别图中二维码或者扫一扫关注我的公众号: