HarmonyOS 实战开发 —— 基于ArkUI的验证码实现

鸿蒙Harmony应用开发—ArkTS声明式开发(通用属性:组件标识) ArkTS声明式开发(通用属性:组件标识) 阅读详情

📚往期笔录记录🔖:

🔖鸿蒙(HarmonyOS)北向开发知识点记录~
🔖鸿蒙(OpenHarmony)南向开发保姆级知识点汇总~
🔖鸿蒙应用开发与鸿蒙系统开发哪个更有前景?
🔖嵌入式开发适不适合做鸿蒙南向开发?看完这篇你就了解了~
🔖对于大前端开发来说,转鸿蒙开发究竟是福还是祸?
🔖鸿蒙岗位需求突增!移动端、PC端、IoT到底该怎么选?
🔖记录一场鸿蒙开发岗位面试经历~
🔖持续更新中……


场景描述

  • 场景一:基于自定义键盘的验证码实现,进入页面后直接输入验证码,第一个验证码输入完后可自动跳到下一个,拉起的键盘是自定义数字键盘,验证码的输入框带选中效果。

  • 场景二:基于系统键盘的验证码实现,进入页面后直接输入验证码,第一个验证码输入完后可自动跳到下一个,验证码的输入框带选中效果。

方案描述

场景一:

基于自定义键盘的验证码实现,进入页面后直接输入验证码,第一个验证码输入完后可自动跳到下一个,拉起的键盘是自定义数字键盘,验证码的输入框带选中效果。

方案

每个验证码都是通过text实现的,而不是textInput。
在页面中写一个textInput将其隐藏,通过sendEventByKey方法将textInput的点击事件转移给text,同时给textInput绑定自定义键盘,这样点击text即可拉起自定义键盘。
将输入框的值赋值给text,通过text将其展示出来。

核心代码

1.写一个TextInput将其隐藏,给TextInput设置id后,在Text的点击事件中通过sendEventByKey方法将TextInput的点击事件转移到Text上,这样就可以点击Text拉起软键盘。

2.在onChange中对codeTxt进行赋值,将输入框的值赋给codeTxt,再通过codeTxt的下标进行展示。

3.对codeTxt进行监听,showMouse是一个布尔类型的数组,当前验证码处于输入状态时,将其值改为true,这样就可改变输入框的选中状态。

//展示在页面上的文本
@State @Watch('setValue') codeTxt: string = '';
@State Index: number[] = [0, 1, 2, 3, 4, 5]
//控制选中文本样式
@State showMouse: boolean[] = [];
 
@Builder
buildAEnterCodeInput() {
  Flex({
    direction: FlexDirection.Row,
    alignItems: ItemAlign.Center,
    justifyContent: FlexAlign.SpaceBetween
  }) {
    Column(){
      Row(){
        //text将拿到的值进行逐个展示
        Text(this.codeTxt[0])
          .fontSize(18)
          .fontWeight(600)
          .textAlign(TextAlign.Center)
          .width(50)
          .height(50)
          .margin({ left: 5, right: 5 })// .border({ width: 0.5, color:  Color.Grey ,style: BorderStyle.Solid })
            //设置验证码选中的样式
          .border(this.showMouse[this.Index[0]] ? this.btnCancelBorderActive : this.btnCancelBorder)
          .borderRadius(5)
        ……
      }
      .onClick(()=>{
        //通过sendEventByKey方法将输入框的点击事件转移给text
        sendEventByKey('TextInput',10,'')
      })
      //写一个输入框,将其隐藏
      TextInput({ controller: this.controller })
        .width('100%')
        .height(100)// .zIndex(1)
        .opacity(0)
        .id('TextInput')
        .customKeyboard(this.CustomKeyboardBuilder())
        .onChange((value) => {
          //将隐藏的输入框的value值赋值给codeTxt 
          this.codeTxt = value
          if (this.codeTxt.length >= 6) {
            return
          }
        })
    }
  }
  .backgroundColor(Color.White)
  .height(50)
  .margin({ left: 15, right: 15 })
  .id("customInput")
  .defaultFocus(false)
}
//对codeTxt进行监听,
setValue() {
  if (this.codeTxt) {
    this.handelInputTxt(this.codeTxt.length, this.codeTxt);
  } else {
    this.handelInputTxt(0, '');
  }
}
 
//改变输入框选中的值,showMouse是一个布尔类型的数组,当前验证码处于输入状态时,将其值改为true
handelInputTxt(length: number, val: string) {
  length === this.maxLength ? this.showMouse.fill(false) : this.showMouse.fill(false).splice(length - 1, 0, true);
  console.log('----length', length)
  console.info("----this.showMouse", JSON.stringify(this.showMouse));
}

设置的公共页面,点击即可拉起半模态。

//公共页面,点击即可拉起半模态
@Builder
buildTitleName() {
  CommonPage()
    .onClick(() => {
      //模态弹窗是否展示
      this.isShow = true
    })
    .bindSheet($$this.isShow, this.bindSheetBuilder, {
      height: '70%',
      // detents:[SheetSize.MEDIUM,SheetSize.LARGE,500],
      // backgroundColor:Color.Gray,
      blurStyle: BlurStyle.Thick,
      showClose: false,
      // title:{title:""},
      preferType: SheetType.CENTER
    })
  ……

场景二:

基于系统键盘的验证码实现,进入页面后直接输入验证码,第一个验证码输入完后可自动跳到下一个,验证码的输入框带选中效果。

方案

1.验证码均是通过六个text实现。

2.通过输入法框架拉起系统键盘,对系统键盘进行监听,即可做到输入和删除的效果。

3.进行条件判断,符合条件时就对输入法进行绑定和监听,否则就解绑输入法。

核心代码

展示在页面上的六个Text,通过输入法框架拉起键盘。

@Builder
buildAEnterCodeInput() {
  Flex({ direction: FlexDirection.Row, alignItems: ItemAlign.Center, justifyContent: FlexAlign.SpaceBetween }) {
    Text(this.codeTxt[0])
      .fontSize(18)
      .fontWeight(600)
      .textAlign(TextAlign.Center)
      .width((this.screenWidth - 110) / 6)
      .height("100%")
      .margin({ left: 5, right: 5 })
      .border({
        width: 0.5,
        color:  Color.Grey ,
        style: BorderStyle.Solid
      })
      .borderRadius(5)
  }
  .backgroundColor(Color.White)
  .height(50)
  .margin({ left: 15, right: 15 })
  .id("customInput")
  .defaultFocus(false)
  .onVisibleAreaChange([0.0, 1.0], (isVisible: boolean, currentRatio: number) => {
    if (isVisible && currentRatio >= 1.0) {
      //绑定输入法
      this.attachAndListener();
    }
    if (!isVisible && currentRatio <= 0.0) {
      //解绑输入法
      this.dettach()
    }
  })
  //点击即通过输入法的控制拉起键盘
  .onClick(async () => {
    if (this.isAttached && this.keyboardStatus != 2) {
      // 输入法配置项
      let textConfig: inputMethod.TextConfig = {
        inputAttribute: {
          textInputType: inputMethod.TextInputType.NUMBER,
          enterKeyType: inputMethod.EnterKeyType.GO
        }
      };
 
      // 控件绑定输入法
      await this.inputController.attach(true, textConfig)
      return
    }
  })
}

实现思路:对输入法进行绑定和监听,通过输入法框架拉起软键盘,可以订阅输入法应用插入、删除文本事件等。

//解绑输入法
dettach() {
  this.inputController.off('insertText');
  this.inputController.off('deleteLeft');
  this.inputController.off('sendKeyboardStatus');
  this.inputController.detach((err: BusinessError) => {
    if (err) {
      console.error(`Failed to detach: ${JSON.stringify(err)}`);
      return;
    }
    this.isAttached = false
    console.log('Succeeded in detaching inputMethod.');
  });
}
 
// 绑定和设置监听
async attachAndListener() {
  // 输入法配置项
  let textConfig: inputMethod.TextConfig = {
    inputAttribute: {
      //拉起数字键盘
      textInputType: inputMethod.TextInputType.NUMBER,
      enterKeyType: inputMethod.EnterKeyType.GO
    }
  };
 
  // 控件绑定输入法
  await this.inputController.attach(true, textConfig)
  this.isAttached = true
  this.attachListener()
}
 
/**
 * 订阅输入法回调
 */
attachListener(): void {
  // 订阅输入法应用插入文本事件
  this.inputController.on('insertText', (text) => {
    if (this.codeTxt.length >= 6) {
      return
    }  
    this.codeTxt += text;
    console.info("this.inputText", "insertText this.inputText===" + this.codeTxt)
  })
 
  // 订阅输入法应用向左删除事件
  this.inputController.on('deleteLeft', (length) => {
    this.codeTxt = this.codeTxt.substring(0, this.codeTxt.length - 1);
    console.info("this.inputText", "deleteLeft  this.inputText===" + this.codeTxt,'length'+length)
  })
 
  // 订阅输入法应用发送输入法软键盘状态事件
  this.inputController.on('sendKeyboardStatus', (keyboardStatus: inputMethod.KeyboardStatus) => {
    this.keyboardStatus = keyboardStatus
    console.info("ImsaKit this.inputText keyboardStatus= " + this.keyboardStatus)
  })
}
鸿蒙ArkTS声明式开发:跨平台支持列表【组件标识】 通用属性 id为组件的唯一标识,在整个应用内唯一。本模块提供组件标识相关接口,可以获取指定id组件的属性,也提供向指定id组件发送事件的功能。从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 阅读详情

相关推荐

鸿蒙(HarmonyOS)实战开发篇——基于ArkUI的验证码实现

基于自定义键盘的验证码实现,进入页面后直接输入验证码,第一个验证码输入完后可自动跳到下一个,拉起的键盘是自定义数字键盘,验证码的输入框带选中效果。

lc748258的博客 1396

基于ArkUI的验证码实现

hongxiaomeng的博客 559

【鸿蒙实战开发】基于ArkUI的验证码实现

1.写一个TextInput将其隐藏,给TextInput设置id后,在Text的点击事件中通过sendEventByKey方法将TextInput的点击事件转移到Text上,这样就可以点击Text拉起软键盘。:基于自定义键盘的验证码实现,进入页面后直接输入验证码,第一个验证码输入完后可自动跳到下一个,拉起的键盘是自定义数字键盘,验证码的输入框带选中效果。基于自定义键盘的验证码实现,进入页面后直接输入验证码,第一个验证码输入完后可自动跳到下一个,拉起的键盘是自定义数字键盘,验证码的输入框带选中效果。

HarmonyOSMN的博客 797

【OpenHarmony应用开发】eTS通用属性 - 组件标识(一)

参考文档:https://gitee.com/openharmony/docs/blob/5654c2b940ab3e2f4f0baf435e630c4ef3536428/zh-cn/application-dev/reference/arkui-ts/ts-universal-attributes-component-...

sinat_15577573的博客 174

鸿蒙应用开发 仿京东短信验证码UI效果

摘要:本文实现了一个美观的4位验证码输入框,使用Stack布局将TextInput和Row布局叠加。通过someArray数组循环生成4个Text组件,显示输入数字或'-'。关键点在于:1)使用hitTestBehavior实现事件透传;2)动态控制输入框样式,当前输入框橙色高亮;3)完整输入后显示提示。难点在于触摸事件处理,通过Transparent模式确保底层TextInput可响应。代码简洁高效,提供了良好的用户交互体验。

yj235532的博客 277

【鸿蒙ArkUI开发】基于ArkUI的验证码实现

1.写一个TextInput将其隐藏,给TextInput设置id后,在Text的点击事件中通过sendEventByKey方法将TextInput的点击事件转移到Text上,这样就可以点击Text拉起软键盘。:基于自定义键盘的验证码实现,进入页面后直接输入验证码,第一个验证码输入完后可自动跳到下一个,拉起的键盘是自定义数字键盘,验证码的输入框带选中效果。基于自定义键盘的验证码实现,进入页面后直接输入验证码,第一个验证码输入完后可自动跳到下一个,拉起的键盘是自定义数字键盘,验证码的输入框带选中效果。

CTrup的博客 1002

HarmonyOS Next 系列之验证码输入组件实现(二)

HarmonyOS Next(基于API11) 实现一个验证码输入组件(VerifyCodeInput),不可复制粘贴,输入验证码无光标自动定位到下一格,删除自动定位到前一格,验证码个数可配置

前端(全栈)、AI Agent开发技术分享 2710

【鸿蒙ArkUI实战开发】基于Search组件实现搜索栏

方案基于Search组件的searchIcon属性设置搜索图标,searchIcon可以设置size、color。注意:当前搜索图标不支持隐藏且不支持位置调整。基于searchButton属性设置搜索框末尾搜索按钮。基于该属性可更改文本内容及文本样式。核心代码Search({ value: this.changeValue, placeholder: '请输入搜索内容', controller: this.controller })//设置搜索框末尾搜索按钮,可修改文本内容及文本样式。

CTrup的博客 1140

【鸿蒙开发实战 Beta5.0版】基于ArkUI的验证码实现

基于自定义键盘的验证码实现,进入页面后直接输入验证码,第一个验证码输入完后可自动跳到下一个,拉起的键盘是自定义数字键盘,验证码的输入框带选中效果。

2401_84917132的博客 769

【鸿蒙ArkUI实战开发】基于ArkUI的透明页面效果

但是每个窗口都有自己的UIContext,可以通过UIContext获取其他窗口的router路由栈,并进行参数传递操作,但是因为该方案会造成不必要是内存消耗,影响性能,并且实现起来较复杂这里只提供思路,不做具体实现,相关功能在navigation路由中实现。加载页面后,这时候出现的新页面发现并不是透明的,那么我们把页面跟容器设置背景颜色为透明,也没有效果,根因是窗口默认是不透明的,需要设置窗口背景色。router路由无法更改页面模式,所以无法直接实现透明页面,需要借助拉起子窗口的方案实现透明页面的效果。

CTrup的博客 998

【鸿蒙ArkUI实战开发】基于原生能力的深色模式适配

不通过两套图片资源的方式,也可以实现深浅色模式适配(补充:通过两套图片资源的方式也可以实现,修改svg图片中fill属性的颜色,然后将两张图片分别放置在不同的目录下)值得一提的是,barContentColor并不支持使用$r的方式加载颜色资源的key值,它是一个string类型的,因此,这里的是不是暗夜模式就要开发者自己去写代码判断。采用资源限定词目录的方式,自定义两套资源(resources/dark/media和resources/base/media),通过$r的方式加载颜色资源的key值。

CTrup的博客 1379

【鸿蒙ArkUI实战开发】基于ArkUI的动效能力

配置完自定义的转场动画,然后将name指定的NavDestination页面信息入栈,同时传参给对应页面,在跳转的页面使用onReady事件接收参数。控制输入框的宽度和显隐状态实现第一段动画,输入框的缩放动画完成后onFinish隐藏输入框,同时展示加载动画。配置完自定义的转场动画,然后将name指定的NavDestination页面信息入栈。10.后台任务(Background Task)管理。2.构建第一个ArkTS应用。6.三方应用调用管控机制。8.学习ArkTS语言。1.Ability开发。

CTrup的博客 1116

【鸿蒙ArkUI实战开发】基于Swiper的页面布局

给Swiper组件设置.nextMargin(50).prevMargin(50)属性。给Swiper组件添加onChange事件,设置当前this.currentIndex=index,当currentIndex为首页或者尾页时,设置上一张以及下一张图片的缩放值。// 设置当前index缩放值为最大值// 当前index=0时,设置上一张图片的缩放值} else// 当前index不为0时,设置上一张图片的缩放值// 当index为最后一张图片时,设置下一张图片的缩放值} else。

CTrup的博客 980

鸿蒙5.0实战案例:基于ArkUI的验证码实现

基于自定义键盘的验证码实现,进入页面后直接输入验证码,第一个验证码输入完后可自动跳到下一个,拉起的键盘是自定义数字键盘,验证码的输入框带选中效果。基于自定义键盘的验证码实现,进入页面后直接输入验证码,第一个验证码输入完后可自动跳到下一个,拉起的键盘是自定义数字键盘,验证码的输入框带选中效果。:基于系统键盘的验证码实现,进入页面后直接输入验证码,第一个验证码输入完后可自动跳到下一个,验证码的输入框带选中效果。2.通过输入法框架拉起系统键盘,对系统键盘进行监听,即可做到输入和删除的效果。

Maniu_666的博客 935

从BIN文件到可烧录程序:深入理解ADI DSP程序读取背后的原理与安全边界

本文深入探讨了ADI DSP程序从BIN文件到可烧录程序的转换原理与安全边界,详细解析了JTAG接口、仿真器工作流程及Flash存储结构。通过Visual DSP++工具,开发者可以理解程序读取的底层机制,同时强调了知识产权保护的重要性,为嵌入式开发提供了实用建议。

weixin_27956639的博客 263

高动态范围结构光三维测量技术:从多曝光融合到深度学习的演进与应用

本文深入探讨了高动态范围结构光三维测量技术的演进与应用,从传统的多曝光融合技术到深度学习驱动的创新方案。通过工业案例展示了该技术在提升测量精度和效率方面的显著优势,特别是在处理高反光、复杂表面时的突破性表现。文章还提供了针对不同工业场景的技术选型指南,帮助工程师优化三维测量解决方案。

weixin_29063979的博客 293

鸿蒙HarmonyOS 5.0开发实战:验证码布局实现案例

本示例介绍如何使用Text组件实现验证码场景,并禁用对内容的选中、复制、光标。

m0_73088370的博客 744

深入解析AndroidManifest.xml与device_admin.xml:打造完美DeviceOwner应用配置

本文深入解析了Android企业级开发中DeviceOwner应用的核心配置文件AndroidManifest.xml与device_admin.xml。详细阐述了如何精准声明DeviceAdminReceiver、定义管理策略,并提供了通过ADB命令进行设置与验证的实战指南,帮助开发者构建权限完整、配置正确的设备所有者应用。

ice55的博客 682

鸿蒙开发进阶(HarmonyOS)ArkUI的验证码实现场景

场景一:基于自定义键盘的验证码实现,进入页面后直接输入验证码,第一个验证码输入完后可自动跳到下一个,拉起的键盘是自定义数字键盘,验证码的输入框带选中效果。

adaedwa187545的博客 706

IEC103协议实战指南:报文解析与传输优化策略

本文深入解析IEC103协议在电力自动化系统中的核心应用,重点拆解其固定帧与可变帧两种报文格式,并详细阐述了主从问答与非平衡传输机制。文章结合实战经验,针对报文解析中的常见问题(如字节序、超时重发)提供了解决方案,并探讨了传输层优化策略,旨在帮助工程师实现更可靠、高效的通信链路。

r2s3t4的博客 542

AI+医疗:多模态模型让肺结节诊断准确率突破95%+的实战方案

多模态融合是必由之路:单一影像模型难以突破95%准确率,必须整合临床、生物标志物等多维数据跨模态注意力机制是核心:简单拼接效果差,注意力机制能自动学习各模态权重,提升融合效果临床适配比技术先进更重要:模型输出必须符合医生诊断习惯,提供可解释的决策依据持续学习是长期成功的关键:医疗数据分布不断变化,模型必须具备自适应能力多学科协作是保障:放射科、胸外科、病理科、AI工程师共同参与模型设计与优化。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1022
上一篇: HarmonyOS 实战开发 —— 跨语言的复杂参数类型传递
下一篇: HarmonyOS 实战开发 —— 基于原生能力的深色模式适配
普通网友
博客等级 码龄2年 7013粉丝 723原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值