Android 总结:自定义键盘实现原理和三种实例详解,熬夜整理Android高频面试题

本文详细介绍了Android自定义键盘的实现原理,包括按键声音定义、按键输入处理,以及提供了两种不同形式的实例解析:继承EditText的自定义View和以Dialog形式实现。此外,还提及了Android面试中的高频知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如果一个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. 效果图

继承EditText自定义view来实现

这个程序有点Bug,点击输入法最底部的三个键时,虚拟按键也触发到了。

想解这个Bug的话自行再仔细研究下代码。

1. 功能特点

  1. 在输入时,保证键盘不会挡住输入框。

  2. 可以直接通过 Edittext 的属性来配置要显示的键盘布局 xml 文件。点击 Edittext 输入框即可弹出键盘。

  3. 支持属性配置 已经写好的键盘 xml支持属性配置 是否随机数字。

  4. 支持纯色绘制按键。默认的 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 ,混合跨平台开发,等
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值