纯血鸿蒙APP实战开发——自定义安全键盘案例

2024-05-07 18:52

本文主要是介绍纯血鸿蒙APP实战开发——自定义安全键盘案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

介绍

金融类应用在密码输入时,一般会使用自定义安全键盘。本示例介绍如何使用TextInput组件实现自定义安全键盘场景,主要包括TextInput.customKeyboard绑定自定义键盘、自定义键盘布局和状态更新等知识点。

效果图预览

实现思路

1. 使用TextInput的customKeyboard的属性方法来设置自定义键盘

当设置自定义键盘时,输入框激活后不会打开系统输入法,而是加载应用指定的自定义组件,针对系统键盘的enterKeyType属性设置将无效。自定义键盘采用覆盖原始界面的方式呈现,不会对应用原始界面产生压缩或者上提。默认在输入控件失去焦点时,关闭自定义键盘,开发者也可以通过TextInputController.stopEditing方法控制键盘关闭。

2. 自定义键盘布局

键盘枚举类型:

  • 键盘类型分为数字键盘,大写、小写键盘,特殊字符键盘
  • 键盘按键类型分为输入操作INPUT、删除操作DELETE、切换数字键盘操作NUMERIC、切换大小写键盘CAPSLOCK、切换数字键盘SPECIAL共五种类型
/*** 键盘类型枚举*/
export enum EKeyboardType {NUMERIC,    //数字键盘UPPERCASE,  // 大写字母键盘LOWERCASE,  // 小写字母键盘SPECIAL,    // 特殊字符键盘
}/*** 键盘按键类型枚举*/
export enum EKeyType {INPUT,   // 输入类型,输入具体的值DELETE,  // 删除一个输入字符NUMERIC, // 切换数字键盘CAPSLOCK, // 切换大小写键盘SPECIAL, //  切换特殊字符键盘
}

在真实业务场景下,自定义安全键盘数据包括值、UI属性、位置等都通过数据请求来下发,键盘按键数据接口定义如下:


/*** 键盘按键数据接口*/
export interface IKeyAttribute {label: string | Resource;value?: string;type?: EKeyType;fontSize?: number;fontColor?: string | Color;backgroundColor?: string | Color;position?: [number, number, number, number];
}

自定义键盘布局:分为标题栏和键盘两部分,键盘使用Grid布局,每个按键GridItem的值、UI属性和位置都通过数据请求下发,不需要额外计算。

数字键盘为4*3的网格布局,但是大小写键盘和特殊字符键盘的布局为不规则布局,如果设置为4 * 10的网格,有的按键占用1 * 1.5,但是GridItem属性不支持占用非整数列。本文将该场景下将网格拆分为更小的单元,为4 * 20网格布局,每个字母按键占1 * 2,删除按键则占1 * 3,空格则占1 * 10,这样就保证每个按键都要占用整数单元。

Column() {this.titleBar();Grid() {ForEach(this.items, (item: IKeyAttribute) => {GridItem() {this.myGridItem(item)}.width('100%').height(this.itemHeight).rowStart(item?.position?.[0]).columnEnd(item?.position?.[1]).columnStart(item?.position?.[2]).columnEnd(item?.position?.[3]).backgroundColor(item.backgroundColor).borderRadius($r("app.integer.key_border_radius")).onClick(() => {....})}, (item: IKeyAttribute, index: number) => JSON.stringify(item) + index)}.margin({ bottom: $r("app.integer.key_board_marin_bottom") }).columnsTemplate(this.curKeyboardType === EKeyboardType.NUMERIC ? "1fr 1fr 1fr" :"1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr 1fr").rowsTemplate("1fr 1fr 1fr 1fr") // Grid高度均分成4份.rowsGap(this.rowSpace) // 设置行间距.columnsGap(this.columnSpace) // 设置列间距.width('100%').height(this.itemHeight * this.rowCount + this.rowSpace * (this.rowCount - 1))
}
.width('100%')
.padding({ left: this.columnSpace, right: this.columnSpace })
.backgroundColor(Color.Black)
}
3. 状态更新

主要是子组件自定义键盘的按键事件如何传递到父组件,可以在父组件定义好键盘按键事件响应函数onKeyboardEvent,传递给子组件,然后子组件按键时调用父组件传递过来的onKeyboardEvent即可。需要注意的是,在子组件中,必须定义inputValue且使用@Link装饰器,这样能保证子组件调用时onKeyboardEvent时inputValue不为空,父子组件数据双向更新。

@Component
export struct CustomSafeKeyboardView {@State inputValue: string = '';@State items: IKeyAttribute[] = numericKeyData;@State curKeyboardType: EKeyboardType = EKeyboardType.NUMERIC;controller: TextInputController = new TextInputController();/*** 键盘按键事件响应函数* @param item*/onKeyboardEvent(item: IKeyAttribute) {switch (item.type) {// 输入类型,更新输入内容case EKeyType.INPUT:this.inputValue += item.value;break;// 删除一个已输入的末尾字符case EKeyType.DELETE:this.inputValue = this.inputValue.slice(0, -1);break;// 切换数字字符键盘case EKeyType.NUMERIC:if (this.curKeyboardType !== EKeyboardType.NUMERIC) {this.curKeyboardType = EKeyboardType.NUMERIC;this.items = numericKeyData;}break;// 切换大小写case EKeyType.CAPSLOCK:if (this.curKeyboardType === EKeyboardType.LOWERCASE) {// 切换大写字母键盘this.curKeyboardType = EKeyboardType.UPPERCASE;this.items = upperCaseKeyData;} else {// 切换小写字母键盘this.curKeyboardType = EKeyboardType.LOWERCASE;this.items = lowerCaseKeyData;}break;// 切换特殊字符键盘case EKeyType.SPECIAL:if (this.curKeyboardType !== EKeyboardType.SPECIAL) {this.curKeyboardType = EKeyboardType.SPECIAL;this.items = specialKeyData;}break;default:console.info(`Sorry, we are out of input type.`);}}/*** 自定义键盘组件Builder*/@BuildercustomKeyboardBuilder() {CustomKeyboard({items: this.items,inputValue: this.inputValue,curKeyboardType: this.curKeyboardType,onKeyboardEvent: this.onKeyboardEvent,controller: this.controller})}build() {Column() {Row().height($r("app.integer.row_height"))Image($r("app.media.avatar")).width($r("app.integer.avatar_weight")).height($r("app.integer.avatar_height")).objectFit(ImageFit.Fill)Text($r("app.string.account_name")).fontSize($r("app.integer.text_font_size")).margin({ top: $r("app.integer.common_margin_padding") })TextInput({text: this.inputValue,placeholder: $r("app.string.placeholder"),controller: this.controller})// 绑定自定义键盘.type(InputType.Password).customKeyboard(this.customKeyboardBuilder())// 绑定自定义安全键盘.height($r("app.integer.text_input_height")).border(null).margin({ top: $r("app.integer.common_margin_padding") })Button($r("app.string.login_button_label")).type(ButtonType.Capsule).fontSize($r("app.integer.login_button_font_size")).width($r("app.integer.login_button_width")).height($r("app.integer.login_button_height")).margin({ top: $r("app.integer.login_button_margin") }).backgroundColor(Color.Pink).onClick(() => {this.controller.stopEditing();})}.width($r("app.string.one_hundred_percent")).height($r("app.string.one_hundred_percent")).padding($r("app.integer.common_margin_padding"))}
}

高性能知识点

不涉及

工程结构&模块类型

customsafekeyboard              // har类型
|---components                  // 自定义组件
|   ---CustomKeyboard.ets  
|---model                       // 模型层
|   ---Constants                // 定义常量数据
|---CustomSafeKeyboardView.ets  // 主页面

模块依赖

  1. 依赖common模块来实现日志的打印
  2. 依赖路由模块,供entry模块实现路由导航

参考资料

TextInput

鸿蒙全栈开发全新学习指南

也为了积极培养鸿蒙生态人才,让大家都能学习到鸿蒙开发最新的技术,针对一些在职人员、0基础小白、应届生/计算机专业、鸿蒙爱好者等人群,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线【包含了大厂APP实战项目开发】

本路线共分为四个阶段:

第一阶段:鸿蒙初中级开发必备技能

第二阶段:鸿蒙南北双向高工技能基础:gitee.com/MNxiaona/733GH

第三阶段:应用开发中高级就业技术

第四阶段:全网首发-工业级南向设备开发就业技术:https://gitee.com/MNxiaona/733GH

《鸿蒙 (Harmony OS)开发学习手册》(共计892页)

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

开发基础知识:gitee.com/MNxiaona/733GH

1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……

基于ArkTS 开发

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

鸿蒙开发面试真题(含参考答案):gitee.com/MNxiaona/733GH

鸿蒙入门教学视频:

美团APP实战开发教学:gitee.com/MNxiaona/733GH

写在最后

  • 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请移步前往小编:gitee.com/MNxiaona/733GH

这篇关于纯血鸿蒙APP实战开发——自定义安全键盘案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/968104

相关文章

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Java MQTT实战应用

《JavaMQTT实战应用》本文详解MQTT协议,涵盖其发布/订阅机制、低功耗高效特性、三种服务质量等级(QoS0/1/2),以及客户端、代理、主题的核心概念,最后提供Linux部署教程、Sprin... 目录一、MQTT协议二、MQTT优点三、三种服务质量等级四、客户端、代理、主题1. 客户端(Clien