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

发布时间:2026/9/14 18:40:00

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/9/12 21:11:39

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

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

2026/9/5 10:45:46

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

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

2026/9/12 23:19:52

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

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

2026/9/15 11:27:22

Loop 让 Mac 窗口管理变成一次按键的事

Loop 让 Mac 窗口管理变成一次按键的事 【免费下载链接】Loop Window management made elegant. 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop Loop 是一款面向 macOS 的开源 Mac 窗口管理工具,把拖动窗口边框这件事压缩成一次按键加一次鼠标移动…

2026/9/15 11:27:22

EIP-658 解读:以太坊如何在交易收据中嵌入执行状态码

EIP-658 解读:以太坊如何在交易收据中嵌入执行状态码 【免费下载链接】EIPs The Ethereum Improvement Proposal repository 项目地址: https://gitcode.com/GitHub_Trending/ei/EIPs 导读 EIP-658(Embedding transaction status code in receip…

2026/9/15 11:22:22

用View Transitions API优雅实现SPA路由切换动画

SPA 项目做久了,你会发现一个特别尴尬的问题:页面切换太“硬”了。点击一个菜单,内容唰一下换掉,整个过程没有任何过渡,用户经常不知道新页面从哪儿来、上一个页面去哪儿了。早年我为了解决这个问题,在 Vue…

2026/9/15 4:54:30

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/15 0:01:16

AI英语单词APP开发:自适应学习算法与移动端优化实践

1. 项目概述 作为一名在移动应用开发领域摸爬滚打多年的老手,我最近完成了一个AI英语单词APP的开发项目。这个项目将传统单词记忆方法与现代AI技术相结合,打造了一款能够智能适应不同用户学习习惯的英语学习工具。 市面上大多数单词APP都存在一个通病&a…

2026/9/15 0:01:16

Flutter与OpenHarmony结合开发手语学习APP实战

1. 项目背景与核心价值作为一名同时接触过Flutter和OpenHarmony的开发者,最近我完成了一个基于Flutter for OpenHarmony的手语学习APP实战项目。这个项目最大的特点在于实现了跨平台框架与国产操作系统深度结合的创新实践——用Flutter开发的应用能完美运行在OpenHa…

2026/9/15 0:01:16

六个月成为机器人工程师:从ROS2到SLAM的实战路径

1. 六个月的紧迫感从哪来:先搞清楚你要成为哪种机器人工程师说实话,六个月的期限并不是一个宽松的时间线。市面上任何一本正经的机器人学教材都超过五百页,ROS2的官方文档可以翻到你怀疑人生,再加上ABB、KUKA这些工业机器人厂家动…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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