鸿蒙HarmonyOS应用开发-自定义实现验证码框_鸿蒙开发字母验证码(1) ...

打印 上一主题 下一主题

主题 510|帖子 510|积分 1530

深知大多数程序员,想要提升技能,往往是自己摸索发展,但自己不成体系的自学结果低效又漫长,而且极易遇到天花板技能停滞不前!



既有适合小白学习的零底子资料,也有适合3年以上履历的小同伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比较多,这里只是将部门目录截图出来,全套包罗大厂面经、学习笔记、源码讲义、实战项目、大纲门路、解说视频,而且后续会持续更新
需要这份系统化的资料的朋友,可以戳这里获取
.fontSize(25) // 设置字体大小
.height(“100%”) // 设置高度为100%
.type(InputType.Number) // 设置输入范例为数字
.align(Alignment.Center) // 设置文本居中对齐
.key(code${index}) // 为每个输入框设置唯一的键
.onChange((value) => {
if (value.length <= 1) {
this.codeKids[index] = value // 存储用户输入的字符
}
if (index - 1 < this.codeKids.length) {
let nextIndex = index + 1
// 将焦点主动移动到下一个输入框
focusControl.requestFocus(code${nextIndex})
} else {
// 触发验证码完成回调函数
this.inputResultCallback(this.codeKids.join(“”))
}
})
}, (item: string) => item)
}
.backgroundColor(Color.Black) // 设置整个行的背景颜色为玄色
.height(80) // 设置行的高度为80
}
}
在新的代码中:
1. inputResultCallback属性:新增了一个名为 inputResultCallback 的属性,用于在用户完成输入后将结果传递给父组件。
2. TextInput的onChange变乱:在每个 TextInput 组件中添加了 onChange 变乱处理程序。当用户输入内容时,这个变乱处理程序会被触发。在变乱处理程序内部,会进行以下操作:


  • 检查输入的值长度是否小于等于1,如果是则将该值存储在 codeKids 数组的相应位置上,以保证每个输入框只能输入一个字符。
  • 检查是否另有下一个输入框(index + 1 是否小于 codeKids 数组的长度)。如果有下一个输入框,将焦点主动移动到下一个输入框,以方便用户一连输入。
  • 如果没有下一个输入框,触发 inputResultCallback 回调函数,将输入的值传递给父组件或其他调用者。
3. key属性:为每个 TextInput 组件添加了 key 属性,以确保focusControl.requestFocus的正确触发,这里我们使用了 index 来生成唯一的键。
希奇的问题


  • 输入框没有焦点
第一次初始化的时候并没有获取焦点,系统也不知道焦点给谁。
我们只需要在TextInput中加入:
.defaultFocus(index == 0)

  • 删除onChange方法并不会触发
整个流程都已经完成了,包括删除验证码!
if (value.length <= 1) {
this.codeKids[index] = value 
}
这段代码赋予了当被删除的时候,数组中的值也会正确的改变。但是!
令人希奇的是,在当前版本中当进行删除操作的时候,onChange方法并不会触发(平板、模仿器、手机均不会),所以我们需要另寻它法。
监听onKeyEvent!
.onKeyEvent((event)=>{
if (event.keyCode == KeyCode.KEYCODE_DEL) {
}
})
事实上,想法是优美的,这个方法也不会触发(模仿器、平板不触发、手机触发非常)

  • 软键盘体现非常
focusControl.requestFocus(nextKeyStr)
使用requestFocus的确可以将焦点切换到下一个输入框,但是软键盘确收起来了!
在这里我试了很多种办法。都没法做到精致绝伦。
多方查证,也觉得TextInput来做这个应该是不可行的,只能等官方下场修复。
那怎么办呢?
反过来想 Text() + TextInput()

如果多个输入框有问题,那么我用一个输入框不就行了?于是我就想到了使用多个Text(),一个TextInput的方案。
多个Text()用于排列体现,TextInput用于处理输入。
只要体现正常,感知正常,那就没人知道怎么输入进去的~
@Preview
@Component
struct CodeInputView {
// 用于存储用户输入的字符的数组,初始值为5个空字符串
@State codeKids: Array = new Array(5).fill(‘’)
// 回调函数,用于传递输入结果给父组件
inputResultCallback: (string) => void
build() {
// 使用 Stack 结构组织界面元素
Stack() {
if (this.codeKids != null) {
// 创建一个横向排列的行,每个字符之间有肯定的间隔
Row({ space: vp(10) }) {
// 使用 ForEach 循环遍历 codeKids 数组
ForEach(this.codeKids, (item: string, index: number) => {
// 体现用户输入的字符
Text(item)
.backgroundColor($r(‘app.color.white_80’)) // 设置背景颜色
.height(match()) // 设置高度匹配内容
.layoutWeight(1) // 设置结构权重
.fontSize(fp(25)) // 设置字体大小
.textAlign(TextAlign.Center) // 设置文本水平居中对齐
.align(Alignment.Center) // 设置垂直居中对齐
.borderRadius(vp(15)) // 设置圆角
.focusable(false) // 不可得到焦点
.defaultFocus(false) // 默认不得到焦点
.focusOnTouch(false) // 不在触摸时得到焦点
}, (item: string) => item)
}
.height(match()) // 设置行的高度匹配内容
.width(match()) // 设置行的宽度匹配内容
// 创建一个输入框用于用户输入
TextInput()
.maxLength(this.viewSize) // 设置最大输入长度
.fontSize(fp(25)) // 设置字体大小
.borderRadius(vp(15)) // 设置圆角
.type(InputType.Number) // 设置输入范例为数字
.key(this.inputKey) // 设置唯一的键
.onChange((value) => {
// 将输入的字符拆分并分别体现在 Text 组件中
let a = value.split(‘’)
this.codeKids.forEach((value, index) => {
this.codeKids[index] = a[index] || ‘’
})
if (a.length >= this.viewSize) {
// 当达到验证码长度时,触发回调函数传递输入结果
this.inputResultCallback(value)
}
// 控制光标体现/隐蔽
this.showCaret = (a.length == 0)
})
.copyOption(CopyOptions.None) // 禁用复制操作
.caretColor(this.showCaret ? Color.Black : Color.Transparent) // 设置光标颜色
.fontColor(Color.Transparent) // 设置文本颜色为透明
.backgroundColor(Color.Transparent) // 设置背景颜色为透明
.height(match()) // 设置高度匹配内容
.width(match()) // 设置宽度匹配内容
}
}
.height(vp(80)) // 设置整个 Stack 的高度
}
}

  • TextInput添补结构,置于顶层。笔墨和背景设置为透明,隐蔽光标。
.copyOption(CopyOptions.None) // 禁用复制操作
.caretColor(Color.Transparent) // 设置光标为透明
.fontColor(Color.Transparent) // 设置文本颜色为透明
.backgroundColor(Color.Transparent) // 设置背景颜色为透明

  • 添加对应数目的Text,用作体现验证码。这一步实在就是将之前的ForEach中添加的TextInput换为Text即可.
  • 在onChange中分隔字符串,并存入对应下标的数组中。
// 将输入的字符拆分并分别体现在 Text 组件中
let a = value.split(‘’)
this.codeKids.forEach((value, index) => {
this.codeKids[index] = a[index] || ‘’
})
if (a.length >= this.viewSize) {
// 当达到验证码长度时,触发回调函数传递输入结果
this.inputResultCallback(value)
}
使用也很简单:
CodeInputView({inputResultCallback: (code) => {
//做点什么
})
最终结果如下:

末了

只需要轻微的封装下,将输入框的宽度、高度、圆角、颜色、输入范例、数目等包裹在一个对象中,使用@State修饰,并逐一对应应用,即可将这个组件做成一个很尺度的任意发挥的输入框啦。
唯一的遗憾是,现在没法去除TextInput点击的样式,除非你是纯色(纯色变化看不出来…)
以下就是该例子代码啦:
@Preview
@Component
export struct CodeInputView {
@State viewSize: number = 4
inputResultCallback: (string) => void
@Link codeKids: Array
@State showCaret: boolean = true
private inputKey = “code_input”
aboutToAppear() {
if (this.codeKids == null) {
this.codeKids = new Array(this.viewSize).fill(‘’);
}
}
build() {
Stack() {
if (this.codeKids != null) {
Row({ space: vp(10) }) {
ForEach(this.codeKids, (item: string, index: number) => {
Text(item)
.backgroundColor($r(‘app.color.white_80’))
.height(match())
.layoutWeight(1)
.fontSize(fp(25))
.textAlign(TextAlign.Center)
.align(Alignment.Center)
.borderRadius(vp(15))
.focusable(false)
.defaultFocus(false)
.focusOnTouch(false)
.onClick(() => {
focusControl.requestFocus(this.inputKey)
})
}, (item: string) => item)
}
.height(match())
.width(match())
TextInput()
.maxLength(this.viewSize)
.fontSize(fp(25))
.borderRadius(vp(15))
.type(InputType.Number)
.key(this.inputKey)
.onChange((value) => {
let a = value.split(‘’)
this.codeKids.forEach((value, index) => {
this.codeKids[index] = a[index] || ‘’
})
if (a.length >= this.viewSize) {
this.inputResultCallback(value)
}
this.showCaret = (a.length == 0)
})
.copyOption(CopyOptions.None)
.caretColor(this.showCaret ? Color.Black : Color.Transparent)
.fontColor(Color.Transparent)
.backgroundColor(Color.Transparent)
//TODO 系统问题,如果背景色是透明的也没用,非透明可以
// .stateStyles({ pressed: {.backgroundColor(“跟背景一样的颜色(纯透明会玄色闪一下)”)}})
.height(match())
.width(match())
}
}
.height(vp(80))
}
}
小结

这个需求大概就告一段了,如果各位有什么想加的功能啥的,可以在批评区告知哦。
总之,HarmonyOS ArkUI的文档还是太少了,很多API都需要摸索,很多写法、操作都不习惯。以及很多坑!,Android的头脑不适用在HarmonyOS。希望能跟上这个变化吧。阿弥陀佛。
末了,有很多小同伴不知道学习哪些鸿蒙开发技能?不知道需要重点把握哪些鸿蒙应用开发知识点?而且学习时频仍踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(Harmony NEXT)资料用来跟着学习好坏常有必要的。
这份鸿蒙(Harmony NEXT)资料包罗了鸿蒙开发必把握的核心知识要点,内容包罗了(**ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony****多媒体技能、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)**技能知识点。
如果你是一名有履历的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行职员,可以直接领取这份资料
获取这份完备版高清学习门路,请点击→纯血版全套鸿蒙HarmonyOS学习资料****
鸿蒙(Harmony NEXT)最新学习门路




  • HarmonOS底子技能



  • HarmonOS就业必备技能 

  • HarmonOS多媒体技能
深知大多数程序员,想要提升技能,往往是自己摸索发展,但自己不成体系的自学结果低效又漫长,而且极易遇到天花板技能停滞不前!



既有适合小白学习的零底子资料,也有适合3年以上履历的小同伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比较多,这里只是将部门目录截图出来,全套包罗大厂面经、学习笔记、源码讲义、实战项目、大纲门路、解说视频,而且后续会持续更新
需要这份系统化的资料的朋友,可以戳这里获取
s://img-blog.csdnimg.cn/direct/743b668910224b259a5ffe804fa6d0db.png)
[外链图片转存中…(img-YLtl0G9V-1715443650970)]
[外链图片转存中…(img-Mln24FUx-1715443650970)]
既有适合小白学习的零底子资料,也有适合3年以上履历的小同伴深入学习提升的进阶课程,涵盖了95%以上鸿蒙开发知识点,真正体系化!
由于文件比较多,这里只是将部门目录截图出来,全套包罗大厂面经、学习笔记、源码讲义、实战项目、大纲门路、解说视频,而且后续会持续更新
需要这份系统化的资料的朋友,可以戳这里获取

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

立聪堂德州十三局店

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表