HarmonyOS ArkUI QRCode 与 PatternLock:二维码生成与手势密码

发布时间:2026/11/3 5:53:43

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/10/28 12:40:54

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

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

2026/10/28 15:34:43

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

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

2026/10/30 14:10:08

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

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

2026/11/3 5:50:08

ANSYS瞬态分析时间步长设置原理与实战指南

1. 项目概述:这不是“点几下就出结果”的仿真,而是对物理世界节奏的精准采样你打开ANSYS Workbench,导入模型、施加约束、定义材料、点击“Transient Structural”模块——看起来一切都很顺。但当求解器跑完,位移曲线出现诡异振荡…

2026/11/3 5:50:08

Delphi 12整合HTMX与WebStencils:基于WebBroker快速开发Web页面

简介:面向Delphi与RAD Studio开发者的中文技术文档,聚焦借助HTMX与WebStencils进行快速Web开发,适合希望用服务端模板和少量HTML属性增强页面交互、降低JavaScript与AJAX依赖的初中级开发者。文件为1个PDF,约919KB,单册…

2026/11/3 5:50:08

似然函数与最大似然估计:原理与应用详解

1. 似然函数与最大似然估计的核心概念第一次接触似然函数(Likelihood Function)时,很多人会把它和概率密度函数混淆。我在研究生阶段做参数估计时就犯过这个错误,直到导师指出才明白二者的本质区别。简单来说,概率密度函数描述的是在已知参数…

2026/11/3 5:50:08

Gate 8.0 核医学仿真环境搭建:Geant4 10.3 与 ROOT 6 编译避坑

简介:面向核医学仿真入门者与Linux科研环境搭建人员的GATE安装流程文档,聚焦开源核医学仿真软件GATE在Ubuntu平台部署前的依赖核查、系统包准备以及Geant4、ROOT等关键组件的版本匹配与配置要点,适合需要独立完成仿真环境搭建的研究生、工程师…

2026/11/3 5:45:06

Outlook规则与文件夹导出备份及迁移还原指南

换电脑、重装系统、从旧邮箱切到新邮箱,最让人心里没底的不是那几十 G 邮件,而是那些年一点点调出来的规则和精心分好的文件夹。邮件本身好办,找个地方存着就行;文件夹结构一乱,几十个分类全被摊平到收件箱里&#xff…

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32实战:基于MAX14431数字隔离器的SPI隔离通信方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

工业SPI隔离通信设计:MAX14431BAEE+与STM32L4A6RG实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/3 1:04:48

STM32+NRF24L01无线抢答器:硬件设计、通信协议与低功耗实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/2 6:08:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/2 6:39:12

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑