一、引言

二维码(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' })

widthheight 用于控制二维码的整体尺寸。由于二维码是正方形的,建议 widthheight 设置相同的值(通常 180-260vp),以保证码点不变形。

2.4 工作原理简述

QRCode 组件内部实现了完整的 QR Code 编码算法:

  1. 数据分析:根据输入内容选择适当的编码模式(数字、字母数字、字节、汉字等)
  2. 数据编码:将内容转换为符合 QR Code 规范的比特流
  3. 纠错编码:添加 Reed-Solomon 纠错码,使二维码在部分损坏时仍可识别(默认容错级别约 15%)
  4. 模块放置:将数据和纠错码的比特流映射到 21×21 到 177×177(取决于版本)的矩阵中
  5. 掩码与格式化:应用掩码模式优化可读性,添加定位图案、校正图案、格式信息等

所有上述步骤在 ArkUI 引擎层完成,开发者无需关注编码细节。
在这里插入图片描述

三、Demo 设计:二维码生成器

3.1 功能概述

Demo 是一个"二维码生成器",模拟分享功能中的二维码生成、WiFi 配网工具等场景:

  1. 二维码预览区:220×220 的二维码实时显示,下方显示编码内容
  2. 文本输入区:TextArea 输入框 + "生成"按钮,生成自定义内容的二维码
  3. 快速填充预设:官网 URL、WiFi 配网、电话、邮箱、纯文本、vCard 名片六种预设
  4. 颜色定制:前景色 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' }
];

inputTextqrText 分离是关键设计:输入框的内容只有在用户点击"生成"按钮时才同步到 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 显示尺寸下,高容错会导致码点变小,对部分低端手机的摄像头对焦能力提出更高要求。

widthheight 的参数建议:

  • 极短内容(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 加密类型 WPAWEPnopass(无密码)
P 密码 12345678nopass 时省略)

注意末尾的两个分号 ;; 是规范要求的终止符,不能省略。

// 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 组件的核心用法:

  1. QRCode 构造函数:传入字符串即可生成二维码,支持任意文本内容
  2. 颜色定制.color() 设置码点颜色,.backgroundColor() 设置背景色
  3. 行业格式:WiFi 配网(WIFI:S:...;T:...;P:...;;)、vCard 名片、tel: 电话、mailto: 邮箱
  4. 尺寸建议:短内容 150-180vp,中等内容 200-240vp,长内容 280-320vp
  5. 安全实践:内容长度限制、协议白名单、恶意输入过滤

QRCode 组件将"二维码编码"这一原本需要第三方库、Canvas 绘制、手动色彩处理才能实现的复杂功能,压缩为一句声明式调用。它在引擎层完成了从数据分析到模块放置的全部步骤,输出一个与 ArkUI 布局系统无缝集成的原生组件。从分享链接到智能配网,从名片交换到移动支付,QRCode 以极简的 API 覆盖了二维码生成的所有场景。希望本文能帮助你在实际项目中高效运用 QRCode 组件。


本文基于 HarmonyOS NEXT API 24 编写,代码经 DevEco Studio 6.1.1 编译验证通过。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐