整体思路:

外层Stack布局,里面TextInput组件用来调起键盘,Row布局中循环出四个Text组件,Row布局覆盖在TextInput组件上,用来展示输入的数字。



定义两个参数,code用来接受输入的文本,someArray用来做为想要展示的Text组件数量,其中的数字用来和code的长度做比较,来区分输入框是否写入文本。

  @State code: string = ''
someArray: number[] = [1, 2, 3, 4]

这里循环someArray,Text组件未填入时显示 ‘-’并且即将写入数字的Text组件有橙色高亮,当四个输入框都有数字时,最后一个框高亮。

      Row() {
ForEach(this.someArray, (item: number, index: number) => {
if (item != 1) {
Blank() // 除了第一个TextView自定义组件以外,其他三个的左边都添加一个Blank()组件
}
if (this.code.length >= item) {
// 填过数字的输入框才满足这个条件, 且只有填到最后一个数字的时候isBorder才为true
this.codeOne({ code: this.code.substring(item - 1, item), isBorder: item == 4 })
} else {
// 未填数字的输入框,显示'-',并且即将要输入的框为橙色
this.codeOne({ code: '-', isBorder: this.code.length + 1 == item })
}
}, (item: number) => JSON.stringify(item))
}
.hitTestBehavior(HitTestMode.Transparent)
.zIndex(2)
.padding({ left: 16, right: 16 })
.width('100%')
  @Builder
codeOne($$: SMSInfo) {
Text($$.code)
.textAlign(TextAlign.Center)
.width(60)
.height(60)
.border({ radius: 11, width: 3 })
.borderColor($$.isBorder ? '#FF5500' : Color.Transparent)
.backgroundColor('#F3F5F7')
}

难点:需要事件透传,在Row布局上设置.hitTestBehavior(HitTestMode.Transparent),hitTestBehavior自身和子节点都响应触摸测试,不会阻塞兄弟节点的触摸测试。不会影响祖先节点的触摸测试。

完整代码:

import { promptAction } from "@kit.ArkUI"

@Entry
@Component
export struct SMSCaptchaPage {
@State code: string = ''
someArray: number[] = [1, 2, 3, 4] build() {
Stack() {
Row() {
ForEach(this.someArray, (item: number, index: number) => {
if (item != 1) {
Blank() // 除了第一个TextView自定义组件以外,其他三个的左边都添加一个Blank()组件
}
if (this.code.length >= item) {
// 填过数字的输入框才满足这个条件, 且只有填到最后一个数字的时候isBorder才为true
this.codeOne({ code: this.code.substring(item - 1, item), isBorder: item == 4 })
} else {
// 未填数字的输入框,显示'-',并且即将要输入的框为橙色
this.codeOne({ code: '-', isBorder: this.code.length + 1 == item })
}
}, (item: number) => JSON.stringify(item))
}
.hitTestBehavior(HitTestMode.Transparent)
.zIndex(2)
.padding({ left: 16, right: 16 })
.width('100%') TextInput()
.width('100%')
.height(50)
.maxLength(4)
.type(InputType.Number)
.backgroundColor(Color.Transparent)
.onChange((value: string) => {
this.code = value // 输入的内容改变时, 实时的传给code
if (value.length == 4) {
promptAction.showToast({ message: '验证码输入成功,等待验证' })
}
})
}
.width('100%')
.height('100%')
} @Builder
codeOne($$: SMSInfo) {
Text($$.code)
.textAlign(TextAlign.Center)
.width(60)
.height(60)
.border({ radius: 11, width: 3 })
.borderColor($$.isBorder ? '#FF5500' : Color.Transparent)
.backgroundColor('#F3F5F7')
}
} class SMSInfo {
code: string = ''
isBorder: boolean = false
}

仿京东短信验证码UI效果(鸿蒙)的更多相关文章

  1. Android Studio精彩案例(五)《JSMS短信验证码功能实现》

    转载本专栏文章,请注明出处,尊重原创 .文章博客地址:道龙的博客 很多应用刚打开的时候,让我们输入手机号,通过短信验证码来登录该应用.那么,这个场景是怎么实现的呢?其实是很多开放平台提供了短信验证功能 ...

  2. iOS点击获取短信验证码按钮

    概述 iOS点击获取短信验证码按钮, 由于 Demo整体测试运行效果 , 整个修改密码界面都已展现, 并附送正则表达式及修改密码逻辑. 详细 代码下载:http://www.demodashi.com ...

  3. Atitit. 破解  拦截 绕过 网站 手机 短信 验证码  方式 v2 attilax 总结

    Atitit. 破解  拦截 绕过 网站 手机 短信 验证码  方式 v2 attilax 总结 1. 验证码的前世今生11.1. 第一代验证码 图片验证码11.2. 第二代验证码  用户操作 ,比如 ...

  4. Android学习笔记之短信验证码的获取和读取

    PS:最近很多事情都拖拖拉拉的..都什么办事效率啊!!! 还得吐槽一下移动运营商,验证码超过五次的时候,直接把我的手机号封闭.真是受够了. 学习笔记: 1.Android之如何获取短信验证码. 2.如 ...

  5. atitit.短信 验证码  破解  v3 p34  识别 绕过 系统方案规划----业务相关方案 手机验证码  .doc

    atitit.短信 验证码  破解  v3 p34  识别 绕过 系统方案规划----业务相关方案 手机验证码  .doc 1. 手机短信验证码 vs 图片验证码 安全性(破解成本)确实要高一些1 1 ...

  6. springboot +spring security4 自定义手机号码+短信验证码登录

    spring security 默认登录方式都是用户名+密码登录,项目中使用手机+ 短信验证码登录, 没办法,只能实现修改: 需要修改的地方: 1 .自定义 AuthenticationProvide ...

  7. 这是一个简单的前台短信验证码功能 ajax实现异步处理 (发送和校验)

    <script type="text/javascript"> var InterValObj; //timer变量,控制时间 var count = 60; //间隔 ...

  8. 四:java调接口实现发送手机短信验证码功能

    1.点击获取验证码之前的样式: 2.输入正确的手机号后点击获取验证码之后的样式: 3.如果手机号已经被注册的样式: 4.如果一个手机号一天发送超过3次就提示不能发送: 二:前台的注册页面的代码:reg ...

  9. 【安全测试】如何利用短信验证码BUG浪费公司的钱

    一.背景 公司新产品体验,发现不少交互.UI.功能设计上的小问题.于是花了点时间随意挑了几个功能深入的玩了一下,顺手提了BUG.接口层,看了一下接口文档,简单测了一下接口,BUG其实还挺严重的,后面详 ...

  10. 『实践』Android之短信验证码(用的Mob短信验证)

    1.参考资料 Mob网站:http://www.mob.com/ Mob在Github上的例子:https://github.com/MobClub/SMSSDK-for-Android 教程:htt ...

随机推荐

  1. 【Amadeus原创】GFS 安装使用

    准备环境: 一.修改每台主机的host文件,在/etc/hosts下添加内容: 172.62.21.44 gfs1 172.62.21.43 gfs2 172.62.21.37 gfs3 二.分别安装 ...

  2. 对象存储 AVIF 图片压缩,邀您参与免费内测!

    对象存储 AVIF 图片压缩免费内测正式开放!AVIF 作为压缩图片中的新主力军,都有哪些特点呢?通过对象存储又要如何使用 AVIF 压缩呢?这篇文章将深入浅出的为您介绍~ ​具体介绍 现在硬件设备越 ...

  3. Microsoft.Extensions.ServiceDiscovery 的 Consul 实现

    GitHub地址:https://github.com/vipwan/Biwen.Microsoft.Extensions.ServiceDiscovery.Consul 使用方式 添加 NuGet ...

  4. PostgreSQL 的特点

    title: PostgreSQL 的特点 date: 2024/12/24 updated: 2024/12/24 author: cmdragon excerpt: PostgreSQL 是当今最 ...

  5. Qt编写视频监控系统(移动侦测/遮挡报警/区域入侵/越界侦测/报警输入输出等)

    一.前言 得益于标准的onvif协议,各大监控厂商的设备都会支持onvif协议,在onvif协议中就包括了事件订阅机制,通过这个机制,可以拿到各种报警事件,比如移动侦测/遮挡报警/区域入侵/越界侦测/ ...

  6. Qt编写的项目作品34-雷达模拟仿真工具(雨田哥作品)

    一.功能特点 支持音频频谱显示. 支持任意随机添加模拟点. 支持自定义添加模拟点. 支持方位.航向角.距离.速度.目标体真实图自定制. 支持危险区域范围显示. 支持激光发射模拟. 支持雷达图放大缩小显 ...

  7. [转]Vue3.0和Vue2.0的区别

    Vue3.0和Vue2.0的区别默认进行懒观察(lazy observation).在 2.x 版本里,不管数据多大,都会在一开始就为其创建观察者.当数据很大时,这可能会在页面载入时造成明显的性能压力 ...

  8. Eclipse IDE最常用的快捷键

    0.运行:Ctrl+F111.启动调试:F112.终止调试:Ctrl+F23.插入断点:Ctrl+Shift+B或双击行前4.单步跳入:F55.单步跳过:F66.跳出方法:F77.直接跳转到下一个断点 ...

  9. Ubuntu 添加多用户和Samba

    USERNAME="$1" SMBFILE="/etc/samba/smb.conf" if [ $# != 1 ] then echo "使用方: ...

  10. React基础笔记2

    一.生命周期函数 挂载卸载过程 constructor        props context componentWillMount  服务器与客户端 componentDidMount  ajax ...