鸿蒙开发实践——基于ArkUI的验证码实现

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

场景描述

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

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

方案描述

场景一:

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

方案

每个验证码都是通过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 NEXT实战开发:Axios获取网络GBK数据转换UTF-8网络数据

本示例介绍使用第三方库的Axios获取GBK格式的网络数据时..........

wanghuaQAQ的博客 1323

基于ArkUI的验证码实现

hongxiaomeng的博客 557

OpenHarmony实战开发-如何自定义鼠标悬停/点击组件的背景色

在日常的鼠标操作中,当鼠标悬浮或点击某个元素时,该元素的背景色一般都会加深或者背景色发生变化,因此开发者可以根据自己的喜好进行开发设置。本文即为大家介绍这种操作的开发。

2401_82546228的博客 1425

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

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

sinat_15577573的博客 174

寒假技术实践:AI与跨端开发融合的春节抢票系统开发记录

寒假技术实践结合AI与跨端开发,开发春节抢票系统与家庭相册小程序。采用HarmonyOS ArkUI框架与PaddleOCR实现验证码智能识别,通过分布式能力实现多设备协同。抢票成功率提升至78%,相册加载优化至800ms内。技术亮点包括响应式布局、内存管理优化及MindSpore图像处理,体现AI与跨端开发的融合价值。项目代码开源,持续分享实用工具开发经验。

qq_34665985的博客 253

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

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

lc748258的博客 1396

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

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

liuhaojiabin的博客 462

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

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

CTrup的博客 1002

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

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

adaedwa187545的博客 706

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

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

HarmonyOSMN的博客 796

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

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

CTrup的博客 1140

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

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

2401_84917132的博客 768

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

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

CTrup的博客 998

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

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

CTrup的博客 999

DQN网络代码调用env.reset()后存储观测信息报错问题ValueError: setting an array element with a sequence.解决处理

**reset()函数返回的是一个array类型以及其中数据的type!模拟游戏进行学习任务。因此需要将observation指定为真正需要的array信息即可,得到的的变量observation类型与Agent存储时的。因此怀疑返回的observation有问题,于是通过。报错信息提示为数据维度不对应,也即最初通过。在强化学习DQN网络代码实现过程中,针对。

Vulcan_Q的博客 4092

抖音__NS_sig3签名机制解析与动态Hook实战

在现代移动应用中,客户端与服务端之间的可信通信契约往往依赖于动态生成的请求签名,如抖音(某手)的__NS_sig3参数。该签名并非简单哈希,而是融合设备指纹、传感器数据、运行时上下文与轻量加密的综合摘要,体现了‘环境即凭证’的安全设计思想。其核心价值在于抵御静态伪造与批量模拟,提升接口调用的真实性与不可复用性。典型应用场景包括Feed流加载、点赞关注等关键业务接口的身份校验。本文基于真实逆向与Frida动态Hook实践,深入解析__NS_sig3的so层实现逻辑、JNI调用链路、输入参数真实性验证机制,以及

weixin_30127995的博客 373

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

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

CTrup的博客 1116

从RRT到平滑轨迹:机械臂避障规划仿真全流程解析

本文详细解析了机械臂避障规划从RRT算法到平滑轨迹优化的全流程,包括MATLAB实现、碰撞检测工程实践及轨迹平滑优化技巧。通过RRT算法在关节空间的路径搜索与Minimum Jerk/Snap优化,实现机械臂在复杂环境中的高效安全运动,适用于工业自动化与机器人控制领域。

weixin_29051811的博客 293

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

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

Maniu_666的博客 935

WIFI中CSI的读取

学习目标: 目前正在做基于WIFI的无设备定位,准备使用信道状态信息(CSI),学习一下。 目前采集数据环境已经搭建好,准备研究信号的预处理。 学习内容: 1、 信号的读取——read_bf_file函数的研究 2、 3、 4、 1. read_bf_file详解: %READ_BF_FILE Reads in a file of beamforming feedback logs. % This version uses the *C* version of read_bfee, ...

sz3076799的博客 8891

项目实训(四)——SAM模型的学习与部署

这里的show_mask就是我们用mask的prompt进行分割,show_points就是我们用points进行分割,show_box就是通过box进行分割,这是SAM的三种prompt的方式。总的来说,Meta AI 的 Segment Anything 模型为我们提供了一种全新的物体识别和分割方式,其强大的泛化能力和广泛的应用前景将极大地推动计算机视觉领域的发展。这里有vit_h、vit_b、vit_l三种权重模型,这里可以根据自己的需要下载相应的权重模型。我们是下载的vit_h权重模型。

yyyyyyyx_的博客 1420
上一篇: 鸿蒙开发实践——跨语言的复杂参数类型传递
下一篇: 鸿蒙开发实践——基于自定义注解和代码生成实现路由框架
猫猫码代码
博客等级 码龄6年 421粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值