发布时间:2026/7/18 22:35:07
HarmonyOS ArkUI QRCode 与 PatternLock:二维码生成与手势密码 系列鸿蒙 HarmonyOS 6.1 新特性实战 · 第 42 篇QRCode 和 PatternLock 是 ArkUI 面向安全与分享场景的两个专用组件。QRCode 可将任意字符串实时渲染为二维码图像PatternLock 则提供九宫格手势密码交互常用于应用锁、支付验证等场景。本篇演示如何组合使用这两个组件并实现颜色切换与密码设置完整流程。运行效果初始状态QRCode 展示 PatternLock 待绘制切换颜色后的 QR 码与完成手势绘制QRCode 二维码生成QRCode 组件接收任意字符串作为内容参数自动编码并渲染为标准二维码。内容可以是 URL、纯文本、JSON 字符串等任意格式。State qrContent: string https://developer.huawei.com State qrColor: string #000000 State qrBgColor: string #ffffff QRCode(this.qrContent) .width(200) .height(200) .color(this.qrColor) .backgroundColor(this.qrBgColor).color()控制前景色码点颜色背景色建议保持白色以确保扫码兼容性。动态修改qrContent绑定的状态变量即可实时更新二维码内容。颜色切换示例private colorOptions: string[] [#000000, #0066ff, #e74c3c, #27ae60] State selectedColor: number 0 Row({ space: 12 }) { ForEach(this.colorOptions, (color: string, index: number) { Column() .width(28) .height(28) .borderRadius(14) .backgroundColor(color) .border({ width: this.selectedColor index ? 3 : 1, color: this.selectedColor index ? #0066ff : #dddddd }) .onClick(() { this.selectedColor index this.qrColor color }) }) }PatternLock 手势密码PatternLock 渲染九宫格圆点用户滑动连线设置或验证手势密码。通过PatternLockController控制器可以在代码中重置绘制状态。private patternController: PatternLockController new PatternLockController() State patternResult: string State savedPattern: number[] [] State isConfirmStep: boolean false State firstInput: number[] [] PatternLock(this.patternController) .sideLength(240) .circleRadius(10) .pathColor(#0066ff) .onPatternComplete((input: number[]) { this.handlePatternComplete(input) })sideLength九宫格整体边长px决定组件大小circleRadius每个圆点的半径pathColor连线颜色onPatternComplete绘制完成后触发input为经过的圆点序号数组1-9左上至右下排列两步密码设置流程实际场景中密码设置需要两次确认。以下实现“首次输入 → 确认输入“的完整流程handlePatternComplete(input: number[]): void { if (input.length 4) { this.patternResult 图案太短至少连接 4 个点 this.patternController.reset() return } if (!this.isConfirmStep) { // 第一步记录初始图案 this.firstInput input this.isConfirmStep true this.patternResult 请再次绘制确认图案 this.patternController.reset() } else { // 第二步比对两次输入 const match this.firstInput.length input.length this.firstInput.every((v: number, i: number) v input[i]) if (match) { this.savedPattern input this.patternResult 密码设置成功路径${input.join(-)} } else { this.patternResult 两次图案不一致请重新设置 this.firstInput [] this.isConfirmStep false } this.patternController.reset() } }重置按钮Button(重新设置) .fontSize(14) .onClick(() { this.isConfirmStep false this.firstInput [] this.savedPattern [] this.patternResult this.patternController.reset() })完整代码Entry Component struct QRCodePatternPage { State qrContent: string https://developer.huawei.com State qrColor: string #000000 State selectedColor: number 0 State patternResult: string 请绘制手势密码至少 4 个点 State savedPattern: number[] [] State isConfirmStep: boolean false State firstInput: number[] [] private patternController: PatternLockController new PatternLockController() private colorOptions: string[] [#000000, #0066ff, #e74c3c, #27ae60] handlePatternComplete(input: number[]): void { if (input.length 4) { this.patternResult 图案太短至少连接 4 个点 this.patternController.reset() return } if (!this.isConfirmStep) { this.firstInput input this.isConfirmStep true this.patternResult 请再次绘制确认图案 this.patternController.reset() } else { const match this.firstInput.length input.length this.firstInput.every((v: number, i: number) v input[i]) if (match) { this.savedPattern input this.patternResult 密码设置成功路径${input.join(-)} } else { this.patternResult 两次图案不一致请重新设置 this.firstInput [] this.isConfirmStep false } this.patternController.reset() } } build() { Scroll() { Column({ space: 24 }) { Text(二维码生成).fontSize(16).fontWeight(FontWeight.Bold).fontColor(#333333) // 内容输入 TextInput({ text: this.qrContent, placeholder: 输入二维码内容 }) .width(100%) .fontSize(13) .onChange((val: string) { this.qrContent val }) // 颜色选择 Row({ space: 12 }) { Text(前景色).fontSize(13).fontColor(#666666) ForEach(this.colorOptions, (color: string, index: number) { Column() .width(28).height(28).borderRadius(14) .backgroundColor(color) .border({ width: this.selectedColor index ? 3 : 1, color: this.selectedColor index ? #0066ff : #dddddd }) .onClick(() { this.selectedColor index this.qrColor color }) }) } // 二维码展示 QRCode(this.qrContent) .width(200).height(200) .color(this.qrColor) .backgroundColor(#ffffff) Divider().strokeWidth(1).color(#eeeeee) // 手势密码 Text(手势密码设置).fontSize(16).fontWeight(FontWeight.Bold).fontColor(#333333) Text(this.isConfirmStep ? 第二步确认图案 : 第一步绘制图案) .fontSize(12).fontColor(#999999) Text(this.patternResult) .fontSize(14) .fontColor(this.savedPattern.length 0 ? #27ae60 : #e74c3c) .textAlign(TextAlign.Center) PatternLock(this.patternController) .sideLength(240) .circleRadius(10) .pathColor(#0066ff) .onPatternComplete((input: number[]) { this.handlePatternComplete(input) }) Button(重新设置) .fontSize(14) .backgroundColor(#f5f5f5) .fontColor(#333333) .onClick(() { this.isConfirmStep false this.firstInput [] this.savedPattern [] this.patternResult 请绘制手势密码至少 4 个点 this.patternController.reset() }) } .width(100%) .padding(24) } .width(100%) .height(100%) .backgroundColor(#f8f8f8) } }API 速查属性/方法说明QRCode(content)传入字符串内容自动生成二维码.color(color)二维码前景色码点颜色.backgroundColor(color)二维码背景色建议保持白色PatternLock(controller)创建九宫格手势密码绑定控制器.sideLength(px)九宫格整体边长像素.circleRadius(px)圆点半径.pathColor(color)连线颜色.onPatternComplete(fn)绘制完成回调参数为圆点序号数组1-9PatternLockController.reset()清除当前绘制恢复初始状态Array.every(fn)检查所有元素是否满足条件用于路径比对小结QRCode 内容可以是任意字符串前景色可自定义但背景色建议保持白色以确保主流扫码 App 兼容修改绑定的State变量后QRCode 会自动重新渲染无需手动刷新PatternLock 圆点编号 1-9从左上角到右下角依次排列与手机拨号键盘布局一致最短路径建议设为 4 个点安全性与易用性较为均衡patternController.reset()在每次onPatternComplete回调结束后调用清除绘制痕迹两步密码设置流程中使用Array.every()逐位比对路径数组是最简洁的方式上一篇Search 搜索框实战 | 下一篇Marquee 跑马灯与 Gauge 仪表盘

相关新闻

2026/7/18 22:30:07

帝国CMS自定义字段扩展技巧

做网站最怕功能受限,想加个多图展示、自定义列表,原来的字段不够用还改不了?不少站长搭建资讯站、图片站、招聘站这类功能站点时,都会卡在字段扩展这一步,其实用帝国CMS就能轻松解决,只是很多人没摸对新增修…

2026/7/18 22:30:07

90克“小马达”,给心脏“续命”——人工心脏到底靠不靠谱?

慢性心衰就像心脏这个“水泵”慢慢磨损了,泵血越来越吃力。吃药能缓解,但有些患者病情持续恶化,到了终末期,连走路、吃饭都喘得厉害。这时候,除了等心脏移植(但我国每年仅约700例,而心衰患者超过…

2026/7/18 22:30:07

GEO内容必须“日日新”,还是“重质不重量”?

在生成式AI重塑搜索规则的当下,GEO(生成式引擎优化)已成品牌角逐大模型曝光的核心战场。不少团队被“内容焦虑”裹挟:是高频输出以维持模型“新鲜感”,还是深耕每篇使其成为权威信源?这个抉择直接影响品牌在…

2026/7/19 0:15:17

【JVM调优实战】03-三大主流JVM实现横评

三大主流 JVM 实现横评:HotSpot、OpenJ9、GraalVM 怎么选 本文是《JVM调优实战》专栏第 3 讲。 引言 大多数 Java 开发者日常接触的 JVM 只有一个——HotSpot,它是 Oracle JDK 和 OpenJDK 的默认实现,也是绝大多数生产环境的标配。但 HotSpot 并不是唯一的选择,也不是所有…

2026/7/19 0:15:17

【JVM调优实战】02-JVM架构全景

JVM 架构全景:类加载、运行时数据区、执行引擎一次讲透 本文是《JVM调优实战》专栏第 2 讲。 引言 如果你把 JVM 比作一座工厂,那么类加载子系统就是"原料采购部"——负责把 .class 文件搬进工厂;运行时数据区是"车间与仓库"——堆是产品仓库,栈是工位…

2026/7/19 0:15:17

【JVM调优实战】01-为什么要学JVM调优

为什么要学 JVM 调优:从一次线上 OOM 事故说起 本文是《JVM调优实战》专栏第 1 讲。 引言 2025 年双十一当晚,某电商平台的核心订单服务在流量峰值到来的第 47 分钟突然不可用。监控面板上,服务的响应时间从 200ms 飙升到超时,错误率从 0.01% 暴涨至 99%。运维团队紧急重启…

2026/7/19 0:15:17

【JVM原理详解】01-从一次编写到处运行到JVM

从一次编写到处运行到JVM 引言 “Write Once, Run Anywhere”(WORA)是Java诞生之初最响亮的口号,也是Java能够迅速占领企业级开发市场的核心武器。但这句话背后究竟隐藏着怎样的技术机制?为什么C/C做不到的事情Java却能实现&#…

2026/7/19 0:15:17

内核启动核心——bootargs 启动参数详解与自定义配置

内核启动核心——bootargs 启动参数详解与自定义配置本文由 黒漂技术佬 原创,首发于 CSDN,转载请注明出处。一、引言 前面我们学会了用 setenv 修改环境变量,今天要看的这个变量是 U-Boot 所有环境变量中的"王者"——bootargs。它决…

2026/7/19 0:10:17

YOLO训练loss不收敛的排查清单:从学习率到数据增强的20个调试点

引言:为什么你的YOLO模型训不好? 很多开发者拿到YOLO后,直接复制一段model.train()代码就开始跑,结果发现——mAP卡在0.3上不去、Loss震荡不收敛、训练集表现很好但测试集一塌糊涂(过拟合)。 根本原因在于:你没有理解每个参数背后的物理意义。 2026年,YOLO家族迎来了…

2026/7/19 0:00:15

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述:为什么我们需要一个本地通信服务器?在游戏开发、数字孪生、仿真训练等众多领域,Unity作为强大的实时3D内容创作平台,其核心逻辑通常由C#驱动。然而,当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/19 0:00:15

Unity与Python本地通信:基于Flask的跨语言数据交换实战

1. 项目概述:为什么我们需要一个本地通信服务器?在游戏开发、数字孪生、仿真训练等众多领域,Unity作为强大的实时3D内容创作平台,其核心逻辑通常由C#驱动。然而,当我们需要进行复杂的数据分析、机器学习推理、科学计算…

2026/7/18 16:50:29

3个高效策略:快速掌握Axure中文界面配置

3个高效策略:快速掌握Axure中文界面配置 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 还在为Axure RP的英文界面感…