如果一个code对应多个key,这个key代表的字符取决于这个key接受到的点击数taps,例如,一个键具有63,33,58编码:
-
一次点击就是 ?
-
两次点击就是 !
-
三次点击就是 :
一个 key
还可以有一些可选的属性:
keyEdgeFlags
这个属性的值可以是left
或者right
这个属性通常加在一行中最左边和最右边的键上。
-
keyWidth
这个属性定义了键的宽度,通常是一个百分比的值。 -
isRepeatable
这个属性如果设置为true
,那么当长按该键时就会
重复接受到该键上的动作,在 删除键键 和 空格键 上通常设为true
。
键盘上的键都是按行分组,通常情况下我们每行上的键限制到10个以内
英文键盘建议每个键占整个键盘宽度的10%,我们将键的高度设置为60dp,这个值可以调整,但是不建议设置低于48dp .
有些键的code
是负数,负数等于在Keyboard类
中预定义的常量,例如,-5
等于Keyboard.KEYCODE_DELETE
3. 定义按键声音
创建一个方法,这个方法的作用就是当我们按下某个键时发出一个声音,我们使用 AudioManager
来播放这个声音,Android SDK给我们提供了一些键盘的声效,我们在自己定义的playClick()方法中使用。
private void playClick(int keyCode){
AudioManager am = (AudioManager)getSystemService(AUDIO_SERVICE);
switch(keyCode){
case 32:
am.playSoundEffect(AudioManager.FX_KEYPRESS_SPACEBAR);
break;
case Keyboard.KEYCODE_DONE:
case 10:
am.playSoundEffect(AudioManager.FX_KEYPRESS_RETURN);
break;
case Keyboard.KEYCODE_DELETE:
am.playSoundEffect(AudioManager.FX_KEYPRESS_DELETE);
break;
default:
am.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD);
}
}
4. 处理按键输入
当用户按下键盘上的一个键时,onKey()方法
会被调用,并且发送这个 键的unicode值
,基于这个值,键盘可以执行以下动作:
-
如果code是
KEYCODE_DELETE
,使用deleteSurroundingText()
方法删除光标左边的字符。 -
如果code是
KEYCODE_DONE
,KEYCODE_ENTER
事件会被发送。 -
如果code是
KEYCODE_SHIFT
,boolean类型的caps的值会被改变,并且使用setShifted()
方法改变键盘的换档状态(shift state),当状态改变时,键盘需要重绘,所以的键的label被更新了,invalidateAllKeys()
方法用来重绘所有的键。 -
对于 其他所有的codes,只是 简单的将unicode转化为字符并且发送到输入框里,如果这个code代表了字母表里的一个字母,并且caps变量为true,那么我们需要将字母转化为大写。
修改onKey的代码(这里的功能实现方法跟实例中有偏差):
@Override
public void onKey(int primaryCode, int[] keyCodes) {
InputConnection ic = getCurrentInputConnection();
playClick(primaryCode);
switch(primaryCode){
case Keyboard.KEYCODE_DELETE :
ic.deleteSurroundingText(1, 0);
break;
case Keyboard.KEYCODE_SHIFT:
caps = !caps;
keyboard.setShifted(caps);
kv.invalidateAllKeys();
break;
case Keyboard.KEYCODE_DONE:
ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
break;
default:
char code = (char)primaryCode;
if(Character.isLetter(code) && caps){
code = Character.toUpperCase(code);
}
ic.commitText(String.valueOf(code),1);
}
}
三、实例解析:继承EditText自定义view来实现
保证不遮挡输入框,界面漂亮有动画。数字键盘可随机,支持纯色绘制按键。
1. 效果图
这个程序有点Bug,点击输入法最底部的三个键时,虚拟按键也触发到了。
想解这个Bug的话自行再仔细研究下代码。
1. 功能特点
-
在输入时,保证键盘不会挡住输入框。
-
可以直接通过
Edittext
的属性来配置要显示的键盘布局xml
文件。点击Edittext
输入框即可弹出键盘。 -
支持属性配置 已经写好的键盘
xml
。支持属性配置 是否随机数字。 -
支持纯色绘制按键。默认的
keyboardview
在android2.3等低版本下不能正常显示纯色的按键背景。本示范工程通过重写原有的keyboardview
来解决这个bug。
注:资源里面只有两种键盘样式:数字0-9+"000"
、0-9+.
。你可以通过自己写键盘布局xml,然后通过属性引用来显示自己的键盘。具体可以参考附件的示范工程。
2. 逻辑分析
1) 生成随机数的key
先for循环生成0-9的KeyModel,存储到LinkedList中
LinkedList tempList = new LinkedList();
for (int i = 0; i < count; i++) {
tempList.add(new KeyModel(48 + i, i + “”));
}
后面通过随机数,从 LinkedList
中取出KeyModel放入新的 List
中(这里的代码是 resultList
), 然后这里的 List
就是随机的了。
Random rand = new SecureRandom();
rand.setSeed(SystemClock.currentThreadTimeMillis());
for (int i = 0; i < count; i++) {
int num = rand.nextInt(count - i);
// Log.d(TAG, " rand num"+num);
KeyModel model = tempList.get(num);
// Log.d(TAG, model.toString());
resultList.add(new KeyModel(model.getCode(), model.getLabel()));
tempList.remove(num);
}
四、实例解析:以Dialog的形式来实现
最后
文章不易,如果大家喜欢这篇文章,或者对你有帮助希望大家多多点赞转发关注哦。文章会持续更新的。绝对干货!!!
由于文章篇幅问题 查看详细文章以及获取学习笔记链接:GitHub
- Android进阶学习全套手册
关于实战,我想每一个做开发的都有话要说,对于小白而言,缺乏实战经验是通病,那么除了在实际工作过程当中,我们如何去更了解实战方面的内容呢?实际上,我们很有必要去看一些实战相关的电子书。目前,我手头上整理到的电子书还算比较全面,HTTP、自定义view、c++、MVP、Android源码设计模式、Android开发艺术探索、Java并发编程的艺术、Android基于Glide的二次封装、Android内存优化——常见内存泄露及优化方案、.Java编程思想 (第4版)等高级技术都囊括其中。
-
Android高级架构师进阶知识体系图
关于视频这块,我也是自己搜集了一些,都按照Android学习路线做了一个分类。按照Android学习路线一共有八个模块,其中视频都有对应,就是为了帮助大家系统的学习。接下来看一下导图和对应系统视频吧!!!
-
Android对标阿里P7学习视频
-
BATJ大厂Android高频面试题
这个题库内容是比较多的,除了一些流行的热门技术面试题,如Kotlin,数据库,Java虚拟机面试题,数组,Framework ,混合跨平台开发,等
类。按照Android学习路线一共有八个模块,其中视频都有对应,就是为了帮助大家系统的学习。接下来看一下导图和对应系统视频吧!!!
[外链图片转存中…(img-A3LztRV4-1646472569701)] -
Android对标阿里P7学习视频
[外链图片转存中…(img-xop99BjE-1646472569701)]
- BATJ大厂Android高频面试题
这个题库内容是比较多的,除了一些流行的热门技术面试题,如Kotlin,数据库,Java虚拟机面试题,数组,Framework ,混合跨平台开发,等