Android 总结:自定义键盘实现原理和三种实例详解,2024年最新flask面试知识点

1. 效果图:

在xml文件中定义的自定义键盘效果图

建一个类,用于处理软键盘事件,文件名为 KeyboardUtil.java

2. 定义键盘的键

键盘上键的细节和它的位置我们指定在一个xml文件中,每一个键都有如下的属性,

  • keyLabel 这个属性是指每个键显示的文本

  • codes 这个属性是指这个键代表的字符的unicode

例如,我们定义了一个字母A,

codes 属性的值是97keyLabel属性的值就是A

如果一个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 就是随机的了。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

最后

最后这里放上我这段时间复习的资料,这个资料也是偶然一位朋友分享给我的,里面包含了腾讯、字节跳动、阿里、百度2020-2021面试真题解析,并且把每个技术点整理成了视频和PDF(知识脉络 + 诸多细节)。

还有 高级架构技术进阶脑图、高级进阶架构资料 帮助大家学习提升进阶,这里我也免费分享给大家也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

一起互勉~

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img
学习提升进阶,这里我也免费分享给大家也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

[外链图片转存中…(img-vZYdseIh-1712607366426)]

[外链图片转存中…(img-zrOfiT5i-1712607366426)]

一起互勉~

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-DmipQlln-1712607366426)]

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flask是一个轻量级、灵活和易扩展的Web开发框架。在面试中,会经常涉及到Flask的相关问题,下面是对一些常见的Flask面试题的详细解答。 1. 什么是FlaskFlask是一个基于Python的Web开发框架,它使用简单,灵活,易于扩展,并且没有默认的数据库和模板引擎。Flask提供了快速开发Web应用程序的工具和库,可以帮助开发者快速创建高质量的Web应用程序。 2. Flask和Django有什么区别? - Flask是一个轻量级框架,而Django是一个全栈框架。 - Flask提供了基础的Web开发工具和库,而Django提供了更多的功能,包括ORM、模板引擎、表单处理等。 - Flask没有默认的数据库和模板引擎,而Django自带ORM和模板引擎。 - Flask更加灵活和易于扩展,可以根据需要选择不同的插件和库,而Django更多的是约定优于配置。 3. Flask中的应用工厂模式是什么? Flask中的应用工厂模式是一种创建应用的方法,它将应用的创建和配置分离,使得应用更加灵活和易于管理。应用工厂模式通过一个工厂函数来创建应用,并将配置作为参数传入,这样可以根据不同的配置创建不同的应用实例。 示例代码: ```python from flask import Flask def create_app(config=None): app = Flask(__name__) if config: app.config.from_object(config) return app ``` 在上述代码中,`create_app()`函数是一个工厂函数,用于创建Flask应用。如果传入了配置参数,会将配置参数应用到应用实例中。 4. Flask中的蓝图是什么? 蓝图(Blueprint)是Flask中一种组织和管理路由的方式,它将应用分解为多个模块,每个模块有自己的路由和视图函数。蓝图可以让应用更加模块化和易于扩展,可以将不同的功能放到不同的蓝图中,使得代码更加清晰和易于维护。 示例代码: ```python from flask import Blueprint, render_template bp = Blueprint('main', __name__) @bp.route('/') def index(): return render_template('index.html') @bp.route('/about') def about(): return render_template('about.html') ``` 在上述代码中,`bp`是一个蓝图对象,包含了两个路由:`/`和`/about`。这两个路由分别由`index()`和`about()`视图函数处理。 5. Flask中的上下文是什么? Flask中的上下文是一种保存和共享数据的机制,它可以在应用的不同部分之间共享数据,包括请求上下文、应用上下文和测试上下文。 - 请求上下文(Request Context):保存了当前请求的信息,包括请求的URL、请求参数、请求头等。 - 应用上下文(Application Context):保存了应用的配置信息,包括数据库配置、日志配置等。 - 测试上下文(Test Context):保存了测试环境的信息,包括测试配置、测试数据等。 在Flask中,上下文是通过全局变量和线程局部变量来实现的,可以使用`flask.g`对象来保存和获取上下文中的数据。 6. Flask中如何处理请求和响应? Flask使用视图函数来处理请求和响应,视图函数是一个Python函数,用于处理HTTP请求,并返回HTTP响应。在Flask中,可以使用`@app.route()`装饰器来定义视图函数,指定HTTP请求的路径和请求方法。 示例代码: ```python from flask import Flask, request, jsonify app = Flask(__name__) @app.route('/hello') def hello(): return 'Hello, Flask!' @app.route('/api/data', methods=['POST']) def data(): data = request.get_json() result = process_data(data) return jsonify(result) ``` 在上述代码中,`hello()`和`data()`是两个视图函数,分别处理`/hello`和`/api/data`两个HTTP请求。`request`对象用于获取请求相关的信息,例如请求方法、请求参数等。`jsonify()`函数用于将Python对象转换为JSON格式的响应。 7. Flask中如何处理静态文件? Flask可以通过`static_folder`参数来指定静态文件的目录,静态文件包括CSS、JavaScript、图片等。在应用中,可以使用`url_for()`函数来生成静态文件的URL,可以使用`send_from_directory()`函数来发送静态文件。 示例代码: ```python from flask import Flask, url_for, send_from_directory app = Flask(__name__, static_folder='static') @app.route('/static/') def static_file(): filename = 'example.js' return url_for('static', filename=filename) @app.route('/js/<filename>') def javascript(filename): return send_from_directory(app.static_folder, filename) ``` 在上述代码中,`static_folder`参数指定了静态文件的目录为`static`。`url_for()`函数用于生成静态文件的URL,`send_from_directory()`函数用于发送静态文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值