鸿蒙新特性——QRCode 二维码组件详解
一、引言
二维码(QR Code)已经成为连接物理世界与数字世界的标准入口。扫码支付、WiFi 配网、名片交换、应用下载、会议签到——几乎所有的线下到线上的场景都依赖二维码。在应用开发中,生成二维码是一个常见需求:分享功能需要把 URL 转成二维码供他人扫描、智能家居 App 需要生成配网二维码让用户扫码连接设备、名片应用需要把个人信息编码为二维码方便交换。
传统实现二维码的方案通常是接入第三方 JavaScript 库(如 qrcode.js)来在 Canvas 上绘制二维码。这带来了几个问题:第三方库的包体积、Canvas 绘制性能、以及跨平台兼容性。更重要的是,在 ArkUI 的渲染体系下,通过 JavaScript 在 Canvas 绘制二维码再导出为像素数据,不仅代码冗长,还容易与 ArkUI 的渲染管线产生同步问题。
而 HarmonyOS 提供了原生的 QRCode 组件——一个将二维码生成封装为声明式组件的解决方案。只需传入字符串内容,组件自动计算二维码矩阵并渲染为标准的 QR Code 图案。支持自定义码点颜色和背景颜色,与 ArkUI 布局系统无缝集成。
本文通过一个"二维码生成器"Demo 深入讲解 QRCode 组件的用法:如何实时生成二维码?如何切换前景色和背景色?WiFi 配网、名片 vCard 等特殊格式如何编码?以及二维码的最佳实践和注意事项。
阅读完本文,你将能够:
- 使用 QRCode 组件生成任意内容的二维码
- 自定义二维码的前景色和背景色
- 掌握 WiFi 配网、vCard 名片、电话、邮箱等常用二维码格式
- 构建实时二维码生成器
- 理解 QRCode 组件的容错级别和尺寸适配
二、QRCode 组件 API 总览
2.1 构造函数
QRCode(value: string)
| 参数 | 类型 | 说明 |
|---|---|---|
value |
string | 需要编码为二维码的文本内容,必填 |
QRCode 的唯一构造参数就是待编码的字符串。支持任意文本内容,包括 URL、纯文本、以及 WiFi 配网(WIFI:T:WPA;S:xxx;P:xxx;;)、vCard 名片(BEGIN:VCARD...END:VCARD)等行业标准格式。
2.2 链式方法
// 码点颜色(二维码黑色方块的颜色,默认为黑色)
.color(value: ResourceColor): QRCodeAttribute
// 背景颜色(二维码白色背景的颜色,默认为白色)
.backgroundColor(value: ResourceColor): QRCodeAttribute
| 方法 | 说明 |
|---|---|
.color(ResourceColor) |
设置二维码码点(方块)的颜色 |
.backgroundColor(ResourceColor) |
设置二维码背景的颜色 |
2.3 通用布局属性
QRCode 继承了通用组件的布局属性:
QRCode('https://www.example.com')
.color('#1a1a2e')
.backgroundColor('#FFFFFF')
.width(200)
.height(200)
.borderRadius(12)
.border({ width: 2, color: '#E0E0E0' })
width 和 height 用于控制二维码的整体尺寸。由于二维码是正方形的,建议 width 和 height 设置相同的值(通常 180-260vp),以保证码点不变形。
2.4 工作原理简述
QRCode 组件内部实现了完整的 QR Code 编码算法:
- 数据分析:根据输入内容选择适当的编码模式(数字、字母数字、字节、汉字等)
- 数据编码:将内容转换为符合 QR Code 规范的比特流
- 纠错编码:添加 Reed-Solomon 纠错码,使二维码在部分损坏时仍可识别(默认容错级别约 15%)
- 模块放置:将数据和纠错码的比特流映射到 21×21 到 177×177(取决于版本)的矩阵中
- 掩码与格式化:应用掩码模式优化可读性,添加定位图案、校正图案、格式信息等
所有上述步骤在 ArkUI 引擎层完成,开发者无需关注编码细节。
三、Demo 设计:二维码生成器
3.1 功能概述
Demo 是一个"二维码生成器",模拟分享功能中的二维码生成、WiFi 配网工具等场景:
- 二维码预览区:220×220 的二维码实时显示,下方显示编码内容
- 文本输入区:TextArea 输入框 + "生成"按钮,生成自定义内容的二维码
- 快速填充预设:官网 URL、WiFi 配网、电话、邮箱、纯文本、vCard 名片六种预设
- 颜色定制:前景色 5 种(黑/蓝/绿/红/紫)+ 背景色 5 种(白/暖黄/浅绿/浅蓝/浅粉)
3.2 交互点
| # | 交互 | 说明 |
|---|---|---|
| 1 | 文本输入 + 生成 | 在 TextArea 输入内容,点击"生成"更新二维码 |
| 2 | 预设内容切换 | 6 种预设一键填充,覆盖 WiFi/电话/邮箱/名片等场景 |
| 3 | 前景色切换 | 5 种码点颜色切换,二维码即时变色 |
| 4 | 背景色切换 | 5 种背景色切换(含暖黄/浅绿等),适配不同应用主题 |
四、完整代码实现

4.1 状态与预设数据
@State inputText: string = 'https://www.harmonyos.com';
@State qrText: string = 'https://www.harmonyos.com';
@State qrColor: string = '#1a1a2e';
@State qrBgColor: string = '#FFFFFF';
private presets: PresetContent[] = [
{ label: '官网', value: 'https://www.harmonyos.com' },
{ label: 'WiFi', value: 'WIFI:S:HarmonyOS_5G;T:WPA;P:12345678;;' },
{ label: '电话', value: 'tel:13800138000' },
{ label: '邮箱', value: 'mailto:hello@harmonyos.com' },
{ label: '文本', value: '你好,鸿蒙!Hello, HarmonyOS!' },
{ label: '名片', value: 'BEGIN:VCARD\nVERSION:3.0\nFN:张三\nTEL:13800138000\nEMAIL:zhangsan@example.com\nEND:VCARD' }
];
inputText 和 qrText 分离是关键设计:输入框的内容只有在用户点击"生成"按钮时才同步到 qrText,避免输入过程中频繁重绘二维码带来的性能消耗。预设内容点击时两个状态同时更新,不需要额外的确认步骤。
4.2 二维码显示
QRCode(this.qrText)
.color(this.qrColor)
.backgroundColor(this.qrBgColor)
.width(220)
.height(220)
二维码的整体尺寸固定在 220vp——这个尺寸在主流手机(360-400dp 宽)上约占屏幕宽度的 55%-60%,既足够大保证扫码识别率,又不会过于拥挤。.color(this.qrColor) 和 .backgroundColor(this.qrBgColor) 绑定到 @State 变量,颜色切换时二维码即时更新。
4.3 文本输入与生成
TextArea({ placeholder: '输入文本、网址或其它内容...', text: this.inputText })
.placeholderColor('#CCCCCC')
.placeholderFont({ size: 14 })
.fontSize(14)
.height(80)
.onChange((value: string) => { this.inputText = value; })
Text('生成')
.fontSize(13).fontColor('#FFFFFF')
.padding({ top: 7, bottom: 7, left: 20, right: 20 })
.borderRadius(16).backgroundColor('#1677FF')
.onClick(() => { this.qrText = this.inputText; })
TextArea 提供了 80vp 高度的多行输入区域,适合输入长 URL 或名片文本。字符计数显示(this.inputText.length)给用户直观的输入反馈。"生成"按钮将 inputText 的值同步到 qrText,触发二维码重新生成。
4.4 预设内容快速填充
Flex({ wrap: FlexWrap.Wrap }) {
ForEach(this.presets, (p: PresetContent) => {
Text(p.label)
.fontSize(13).fontColor('#1677FF')
.padding({ top: 7, bottom: 7, left: 16, right: 16 })
.borderRadius(16).backgroundColor('#F0F5FF')
.margin({ right: 10, bottom: 10 })
.onClick(() => {
this.inputText = p.value;
this.qrText = p.value;
})
})
}
预设标签以蓝色药丸样式(圆角 16vp + 浅蓝背景)排列。点击后同时更新输入框内容和二维码——相当于"输入 + 生成"的一键操作。
4.5 颜色配置
// 前景色
ForEach(['#1a1a2e', '#1677FF', '#52C41A', '#FF4D4F', '#9C27B0'], (c: string) => {
Row()
.width(28).height(28).borderRadius(14)
.backgroundColor(c)
.margin({ left: 8 })
.border({ width: this.qrColor === c ? 3 : 0, color: c === '#FFFFFF' ? '#E0E0E0' : c })
.onClick(() => { this.qrColor = c; })
})
// 背景色(类似结构,颜色列表不同)
ForEach(['#FFFFFF', '#FFF8E1', '#E8F5E9', '#E3F2FD', '#FCE4EC'], (c: string) => {
Row()
.width(28).height(28).borderRadius(14)
.backgroundColor(c)
.margin({ left: 8 })
.border({ width: this.qrBgColor === c ? 3 : 0, ... })
.onClick(() => { this.qrBgColor = c; })
})
前景色提供黑/蓝/绿/红/紫五种标准选项——黑色经典、蓝色科技感、绿色环保类应用、红色强调、紫色创意。背景色提供白/暖黄/浅绿/浅蓝/浅粉五种——白色标准、暖黄护眼、浅绿清新、浅蓝舒适、浅粉柔和。选中态以加粗边框(3vp)表示。
需要注意的是:确保前景色和背景色有足够的对比度。如果前景和背景颜色太接近(如浅灰前景 + 白色背景),二维码会因对比度不足而无法被扫描识别。
五、关键技术点详解
5.1 二维码的容错与尺寸关系
QRCode 组件生成的二维码默认使用约 15% 的容错级别(约等于 QR 标准的 M 级)。这意味着即使二维码图案被遮挡或损坏约 15%,扫码器仍能正确解码。
容错级别决定了二维码的模块密度。同样的内容,容错级别越高,二维码包含的模块越多(版本越高),"码点"越小。在给定的 220vp 显示尺寸下,高容错会导致码点变小,对部分低端手机的摄像头对焦能力提出更高要求。
width 和 height 的参数建议:
- 极短内容(URL 短链接、电话号码):150-180vp 即可
- 中等内容(标准 URL、WiFi 配置):200-240vp,Demo 使用 220vp
- 较长内容(vCard 名片、长文本):280-320vp,确保码点足够大
5.2 WiFi 配网二维码格式
WiFi 配网二维码是一个重要的实用场景。格式遵循 WiFi Alliance 定义的规范:
WIFI:S:<SSID>;T:<加密类型>;P:<密码>;;
| 字段 | 含义 | 示例值 |
|---|---|---|
S |
WiFi 名称(SSID) | HarmonyOS_5G |
T |
加密类型 | WPA、WEP、nopass(无密码) |
P |
密码 | 12345678(nopass 时省略) |
注意末尾的两个分号 ;; 是规范要求的终止符,不能省略。
// WiFi 配网二维码
const wifiStr = 'WIFI:S:MyWiFi;T:WPA;P:mypassword;;';
QRCode(wifiStr)
Demo 中提供了完整的 WiFi 配网示例——扫描此二维码后,大多数现代手机(iOS 11+、Android 10+)的相机 App 会直接弹出"加入网络"的提示,无需手动输入 SSID 和密码。
5.3 vCard 名片二维码格式
vCard 是电子名片的标准格式(RFC 6350),通过二维码可以快速分享联系人信息:
BEGIN:VCARD
VERSION:3.0
FN:张三
TEL:13800138000
EMAIL:zhangsan@example.com
END:VCARD
| 字段 | 含义 |
|---|---|
FN |
显示名称 |
TEL |
电话号码 |
EMAIL |
邮箱地址 |
ORG |
公司名称(可选) |
TITLE |
职位(可选) |
URL |
个人主页(可选) |
扫码后,手机会自动打开通讯录的"添加联系人"界面,预填名片中的信息。
5.4 安全注意事项
二维码的不可读性是一把双刃剑——用户无法用肉眼判断二维码的内容是否安全。在使用 QRCode 组件时,有几个安全实践值得注意:
内容净化:如果二维码内容来自用户输入或第三方 API,应确保不包含恶意脚本或超长字符串(可能导致 QR Code 版本过高、码点过小)。
协议白名单:对于需要分享的 URL,建议限制为 https:// 协议。javascript: 或其他危险协议不应允许编码为二维码。
长度限制:QR Code 的最大容量约为 4296 个字母数字或 2953 个字节。超出此限制的内容无法编码为二维码。QRCode 组件在内容过长时会自动返回错误或降级处理,建议开发者在前端做长度校验(如限制 2000 个字符以内)。
5.5 QRCode 与传统第三方库的对比
| 维度 | 第三方 JS 库 | QRCode 组件 |
|---|---|---|
| 实现方式 | JavaScript 计算 + Canvas 绘制 | ArkUI 引擎原生渲染 |
| 代码量 | ~50 行(Canvas 操作) | ~5 行 |
| 包体积 | +30-80KB(库文件) | 0(系统内置) |
| 性能 | JS 线程计算,大内容可能卡顿 | Native 层计算,不受 JS 阻塞 |
| 颜色自定义 | 需手动处理像素/Canvas API | .color() / .backgroundColor() 直接设置 |
| 版本兼容 | 需关注库的更新和兼容性 | 系统版本绑定,无第三方依赖 |
六、运行效果
6.1 初始状态
进入"二维码生成器"页面,上方展示一个 220×220 的黑白二维码(内容为 https://www.harmonyos.com)。二维码下方显示编码内容文本。输入框预填相同的 URL,字符计数显示"已输入 27 个字符"。
6.2 自定义文本生成
在 TextArea 中输入"Hello HarmonyOS!"(17 字符),点击"生成"按钮 → 二维码更新为新的内容,下方显示 Hello HarmonyOS!。
6.3 预设场景切换
点击"WiFi"预设 → 输入框和二维码同步更新为 WIFI:S:HarmonyOS_5G;T:WPA;P:12345678;;。点击"名片"预设 → 输入框填充 vCard 字符串(约 100 字符),二维码码点变得更密集(版本自动升级以容纳更多数据)。
6.4 颜色定制
点击前景色蓝色 → 二维码码点从黑色变为蓝色(#1677FF)。点击背景色暖黄(#FFF8E1)→ 背景从白色变为暖黄色。蓝码点 + 暖黄背景的二维码具有独特的视觉风格,且保持足够的对比度。
七、总结
本文通过一个"二维码生成器"的实战 Demo,深入讲解了 HarmonyOS QRCode 组件的核心用法:
- QRCode 构造函数:传入字符串即可生成二维码,支持任意文本内容
- 颜色定制:
.color()设置码点颜色,.backgroundColor()设置背景色 - 行业格式:WiFi 配网(
WIFI:S:...;T:...;P:...;;)、vCard 名片、tel:电话、mailto:邮箱 - 尺寸建议:短内容 150-180vp,中等内容 200-240vp,长内容 280-320vp
- 安全实践:内容长度限制、协议白名单、恶意输入过滤
QRCode 组件将"二维码编码"这一原本需要第三方库、Canvas 绘制、手动色彩处理才能实现的复杂功能,压缩为一句声明式调用。它在引擎层完成了从数据分析到模块放置的全部步骤,输出一个与 ArkUI 布局系统无缝集成的原生组件。从分享链接到智能配网,从名片交换到移动支付,QRCode 以极简的 API 覆盖了二维码生成的所有场景。希望本文能帮助你在实际项目中高效运用 QRCode 组件。
本文基于 HarmonyOS NEXT API 24 编写,代码经 DevEco Studio 6.1.1 编译验证通过。
更多推荐



所有评论(0)