二维码美化器应用


欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net

一、项目概述

运行效果图

image-20260409192254814

image-20260409192300871

image-20260409192305680

image-20260409192310074

image-20260409192314997

1.1 应用简介

二维码美化器是一款创意工具应用,将普通二维码变成艺术品。支持嵌入图片、渐变色彩、形状变换等多种美化功能,让扫码也变得时尚。应用内置多种样式风格和设计模板,支持自定义颜色、渐变效果、定位点样式、边框样式,打造独一无二的个性化二维码。

应用以清新的青色为主色调,象征科技与创新。涵盖二维码生成、设计模板、生成历史、关于信息四大模块。用户可以输入内容、选择样式、调整参数、嵌入Logo,快速生成美观的二维码。

1.2 核心功能

功能模块 功能描述 实现方式
样式风格 6种二维码样式 枚举定义
渐变效果 6种渐变类型 Shader绘制
颜色设置 自定义主色副色 颜色选择器
定位点样式 5种定位点风格 枚举定义
边框样式 6种边框效果 自定义绘制
Logo嵌入 支持嵌入Logo图片 位置选择

1.3 样式风格定义

序号 样式名称 Emoji 描述
1 经典方块 传统方块样式
2 圆角方块 🔘 圆润柔和风格
3 圆点样式 时尚圆点风格
4 菱形样式 🔷 几何菱形风格
5 爱心样式 ❤️ 浪漫爱心风格
6 星形样式 闪耀星形风格

1.4 渐变类型定义

序号 渐变名称 Emoji 描述
1 无渐变 纯色填充
2 线性渐变 📏 平滑过渡效果
3 径向渐变 🎯 中心向外扩散
4 扫描渐变 🌀 旋转扫描效果
5 彩虹渐变 🌈 七彩绚丽效果
6 日落渐变 🌅 温暖夕阳色调

1.5 定位点样式定义

序号 样式名称 Emoji 描述
1 方形 传统方形定位点
2 圆角 🔲 圆角方形定位点
3 圆形 圆形定位点
4 叶形 🍃 叶子形状定位点
5 菱形 💎 菱形定位点

1.6 边框样式定义

序号 边框名称 Emoji 描述
1 无边框 🖼️ 无边框效果
2 简约边框 简约线条边框
3 圆角边框 🔘 圆角矩形边框
4 双边框 ⏹️ 双层线条边框
5 装饰边框 🎨 装饰性边框
6 复古边框 📜 复古风格边框

1.7 技术栈

技术领域 技术选型 版本要求
开发框架 Flutter >= 3.0.0
编程语言 Dart >= 2.17.0
设计规范 Material Design 3 -
自定义绘制 CustomPainter -
渐变效果 Shader -
目标平台 鸿蒙OS / Web API 21+

1.8 项目结构

lib/
└── main_qrcode_beautifier.dart
    ├── QRCodeBeautifierApp           # 应用入口
    ├── QRStyle                       # 样式风格枚举
    ├── GradientType                  # 渐变类型枚举
    ├── EyeStyle                      # 定位点样式枚举
    ├── FrameStyle                    # 边框样式枚举
    ├── LogoPosition                  # Logo位置枚举
    ├── QRCodeDesign                  # 二维码设计模型
    ├── GeneratedQRCode               # 生成二维码模型
    ├── QRCodeBeautifierHomePage      # 主页面(底部导航)
    ├── _buildEditorPage              # 生成页面
    ├── _buildDesignsPage             # 设计页面
    ├── _buildHistoryPage             # 历史页面
    └── QRCodePreviewPainter          # 二维码预览绘制器

二、系统架构

2.1 整体架构图

Data Layer

Business Layer

Presentation Layer

主页面
QRCodeBeautifierHomePage

生成页

设计页

历史页

关于页

内容输入

样式选择

颜色设置

参数调整

设计模板网格

快速应用

历史列表

记录操作

功能说明

使用技巧

样式渲染器
StyleRenderer

渐变处理器
GradientProcessor

边框绘制器
FramePainter

QRCodeDesign
二维码设计

GeneratedQRCode
生成二维码

QRStyle
样式风格

GradientType
渐变类型

2.2 类图设计

has

has

has

has

references

QRCodeBeautifierApp

+Widget build()

«enumeration»

QRStyle

+String label

+String emoji

+String description

+classic()

+rounded()

+dots()

+diamond()

+heart()

+star()

«enumeration»

GradientType

+String label

+String emoji

+none()

+linear()

+radial()

+sweep()

+rainbow()

+sunset()

«enumeration»

EyeStyle

+String label

+String emoji

+square()

+rounded()

+circle()

+leaf()

+diamond()

«enumeration»

FrameStyle

+String label

+String emoji

+none()

+simple()

+rounded()

+double()

+decorative()

+vintage()

QRCodeDesign

+String id

+String name

+QRStyle style

+GradientType gradient

+Color primaryColor

+Color secondaryColor

+EyeStyle eyeStyle

+FrameStyle frameStyle

+LogoPosition logoPosition

+double cornerRadius

+DateTime createdAt

GeneratedQRCode

+String id

+String content

+QRCodeDesign design

+DateTime generatedAt

2.3 页面导航流程

生成

设计

历史

关于

应用启动

生成页

底部导航

输入内容

设计模板

生成历史

应用信息

选择样式

设置颜色

调整参数

嵌入Logo

生成二维码

保存设计?

保存到模板

导出使用

点击模板

应用到生成

2.4 二维码生成流程

预览区 样式渲染 生成页 用户 预览区 样式渲染 生成页 用户 输入二维码内容 验证内容 选择样式风格 应用样式 更新预览 显示效果 设置颜色渐变 应用渐变 更新预览 点击生成 渲染二维码 返回生成结果

三、核心模块设计

3.1 数据模型设计

3.1.1 样式风格枚举 (QRStyle)
enum QRStyle {
  classic(label: '经典方块', emoji: '⬛', description: '传统方块样式'),
  rounded(label: '圆角方块', emoji: '🔘', description: '圆润柔和风格'),
  dots(label: '圆点样式', emoji: '⚫', description: '时尚圆点风格'),
  diamond(label: '菱形样式', emoji: '🔷', description: '几何菱形风格'),
  heart(label: '爱心样式', emoji: '❤️', description: '浪漫爱心风格'),
  star(label: '星形样式', emoji: '⭐', description: '闪耀星形风格');

  final String label;
  final String emoji;
  final String description;
}
3.1.2 渐变类型枚举 (GradientType)
enum GradientType {
  none(label: '无渐变', emoji: '⬜'),
  linear(label: '线性渐变', emoji: '📏'),
  radial(label: '径向渐变', emoji: '🎯'),
  sweep(label: '扫描渐变', emoji: '🌀'),
  rainbow(label: '彩虹渐变', emoji: '🌈'),
  sunset(label: '日落渐变', emoji: '🌅');

  final String label;
  final String emoji;
}
3.1.3 二维码设计模型 (QRCodeDesign)
class QRCodeDesign {
  final String id;              // 设计ID
  final String name;            // 设计名称
  final QRStyle style;          // 样式风格
  final GradientType gradient;  // 渐变类型
  final Color primaryColor;     // 主色
  final Color secondaryColor;   // 副色
  final EyeStyle eyeStyle;      // 定位点样式
  final FrameStyle frameStyle;  // 边框样式
  final LogoPosition logoPosition; // Logo位置
  final double cornerRadius;    // 圆角大小
  final DateTime createdAt;     // 创建时间
}
3.1.4 生成二维码模型 (GeneratedQRCode)
class GeneratedQRCode {
  final String id;              // 二维码ID
  final String content;         // 二维码内容
  final QRCodeDesign design;    // 应用的设计
  final DateTime generatedAt;   // 生成时间
}
3.1.5 样式风格分布
35% 25% 15% 10% 8% 7% 样式风格使用分布示例 圆角方块 圆点样式 经典方块 菱形样式 爱心样式 星形样式

3.2 页面结构设计

3.2.1 主页面布局

QRCodeBeautifierHomePage

IndexedStack

生成页

设计页

历史页

关于页

NavigationBar

生成 Tab

设计 Tab

历史 Tab

关于 Tab

3.2.2 生成页结构

生成页

SliverAppBar

快速统计

内容输入

二维码预览

样式选择

颜色设置

定位点边框

Logo选项

操作按钮

样式预览

渐变效果

边框显示

样式卡片列表

主色选择

副色选择

渐变类型

圆角滑块

3.2.3 二维码预览结构

二维码预览

背景层

二维码模块层

定位点层

边框层

Logo层

信息标签层

白色背景

样式模块绘制

渐变填充

边框样式绘制

Logo位置绘制

样式标签

3.2.4 设计页结构

设计页

SliverAppBar

设计模板网格

设计卡片

渐变背景

样式图标

设计名称

参数摘要

3.3 样式绘制逻辑

经典方块

圆角方块

圆点样式

菱形样式

爱心样式

星形样式

获取样式类型

样式类型

绘制矩形

绘制圆角矩形

绘制圆形

绘制菱形路径

绘制贝塞尔曲线

绘制多角星形

应用渐变填充

完成模块绘制

3.4 渐变处理逻辑

无渐变

线性渐变

径向渐变

扫描渐变

彩虹渐变

日落渐变

获取渐变类型

渐变类型

纯色填充

创建LinearGradient

创建RadialGradient

创建SweepGradient

创建彩虹渐变

创建日落渐变

应用到Paint

绘制二维码模块


四、UI设计规范

4.1 配色方案

应用以清新的青色为主色调,象征科技与创新:

颜色类型 色值 用途
主色 #00BCD4 (Cyan) 导航、主题元素
辅助色 #26C6DA 设计页面
第三色 #4DD0E1 历史页面
强调色 #80DEEA 关于页面
背景色 #FAFAFA 页面背景
卡片背景 #FFFFFF 设计卡片

4.2 渐变色方案

渐变名称 颜色组合 视觉效果
科技蓝 #2196F3 → #00BCD4 清新科技
浪漫粉 #E91E63 → #FF4081 浪漫温馨
彩虹风 七彩渐变 绚丽多彩
日落橙 #FF512F → #F09819 温暖夕阳

4.3 字体规范

元素 字号 字重 颜色
页面标题 24px Bold 主色
设计名称 16px Bold #000000
样式标签 12px Regular 白色
参数数值 12px Regular 灰色
统计数字 20px Bold 白色

4.4 组件规范

4.4.1 内容输入框
┌─────────────────────────────────────┐
│  二维码内容                          │
│  ┌─────────────────────────────┐   │
│  │ https://example.com      ✕  │   │
│  │                             │   │
│  └─────────────────────────────┘   │
└─────────────────────────────────────┘
4.4.2 样式选择卡片
┌─────────────────────────────────────┐
│  二维码样式                          │
│                                     │
│  ┌──────┐ ┌──────┐ ┌──────┐        │
│  │  ⬛  │ │  🔘  │ │  ⚫  │        │
│  │经典  │ │圆角  │ │圆点  │        │
│  │方块  │ │方块  │ │样式  │        │
│  └──────┘ └──────┘ └──────┘        │
└─────────────────────────────────────┘
4.4.3 颜色设置区域
┌─────────────────────────────────────┐
│  颜色设置                            │
│                                     │
│  主色        副色        渐变类型    │
│  ┌────┐    ┌────┐    ┌────────┐   │
│  │    │    │    │    │📏 线性▼│   │
│  └────┘    └────┘    └────────┘   │
│                                     │
│  圆角大小  ────────●────────  4.0   │
└─────────────────────────────────────┘
4.4.4 二维码预览区域
┌─────────────────────────────────────┐
│  ┌─────────────────────────────┐   │
│  │  ⬛⬛⬛⬛⬛    ⬛⬛⬛⬛⬛  │   │
│  │  ⬛    ⬛    ⬛    ⬛        │   │
│  │  ⬛ ⬛ ⬛    ⬛ ⬛ ⬛        │   │
│  │  ⬛    ⬛    ⬛    ⬛        │   │
│  │  ⬛⬛⬛⬛⬛    ⬛⬛⬛⬛⬛  🔘圆角│
│  │              ┌─────┐        │   │
│  │              │LOGO │        │   │
│  │              └─────┘        │   │
│  └─────────────────────────────┘   │
└─────────────────────────────────────┘
4.4.5 Logo选项区域
┌─────────────────────────────────────┐
│  嵌入Logo                    [开关] │
│                                     │
│  Logo位置                           │
│  [🎯] [↖️] [↗️] [↙️] [↘️]          │
└─────────────────────────────────────┘

五、核心功能实现

5.1 样式绘制实现

void _drawModule(Canvas canvas, double x, double y, double size, Paint paint, int row, int col) {
  final rect = Rect.fromLTWH(x, y, size, size);
  final rrect = RRect.fromRectAndRadius(rect, Radius.circular(cornerRadius));

  switch (style) {
    case QRStyle.classic:
      canvas.drawRect(rect, paint);
      break;
    case QRStyle.rounded:
      canvas.drawRRect(rrect, paint);
      break;
    case QRStyle.dots:
      canvas.drawCircle(Offset(x + size / 2, y + size / 2), size / 2, paint);
      break;
    case QRStyle.diamond:
      final path = Path()
        ..moveTo(x + size / 2, y)
        ..lineTo(x + size, y + size / 2)
        ..lineTo(x + size / 2, y + size)
        ..lineTo(x, y + size / 2)
        ..close();
      canvas.drawPath(path, paint);
      break;
    case QRStyle.heart:
      _drawHeart(canvas, x, y, size, paint);
      break;
    case QRStyle.star:
      _drawStar(canvas, x, y, size, paint);
      break;
  }
}

5.2 渐变创建实现

Shader _createGradient(Rect rect) {
  switch (gradient) {
    case GradientType.none:
      return LinearGradient(colors: [primaryColor, primaryColor]).createShader(rect);
    case GradientType.linear:
      return LinearGradient(
        colors: [primaryColor, secondaryColor],
        begin: Alignment.topLeft,
        end: Alignment.bottomRight,
      ).createShader(rect);
    case GradientType.radial:
      return RadialGradient(
        colors: [primaryColor, secondaryColor],
      ).createShader(rect);
    case GradientType.sweep:
      return SweepGradient(
        colors: [primaryColor, secondaryColor, primaryColor],
      ).createShader(rect);
    case GradientType.rainbow:
      return LinearGradient(
        colors: [
          const Color(0xFFFF0000),
          const Color(0xFFFF7F00),
          const Color(0xFFFFFF00),
          const Color(0xFF00FF00),
          const Color(0xFF0000FF),
          const Color(0xFF4B0082),
          const Color(0xFF9400D3),
        ],
      ).createShader(rect);
    case GradientType.sunset:
      return LinearGradient(
        colors: [const Color(0xFFFF512F), const Color(0xFFF09819)],
        begin: Alignment.topCenter,
        end: Alignment.bottomCenter,
      ).createShader(rect);
  }
}

5.3 爱心绘制实现

void _drawHeart(Canvas canvas, double x, double y, double size, Paint paint) {
  final path = Path();
  final center = Offset(x + size / 2, y + size / 2);
  final scale = size / 30;

  path.moveTo(center.dx, center.dy + 8 * scale);
  path.cubicTo(
    center.dx - 10 * scale, center.dy - 5 * scale,
    center.dx - 10 * scale, center.dy - 15 * scale,
    center.dx, center.dy - 8 * scale,
  );
  path.cubicTo(
    center.dx + 10 * scale, center.dy - 15 * scale,
    center.dx + 10 * scale, center.dy - 5 * scale,
    center.dx, center.dy + 8 * scale,
  );

  canvas.drawPath(path, paint);
}

5.4 星形绘制实现

void _drawStar(Canvas canvas, double x, double y, double size, Paint paint) {
  final path = Path();
  final center = Offset(x + size / 2, y + size / 2);
  final outerRadius = size / 2;
  final innerRadius = size / 4;

  for (int i = 0; i < 10; i++) {
    final radius = i.isEven ? outerRadius : innerRadius;
    final angle = (i * 36 - 90) * 3.14159 / 180;
    final px = center.dx + radius * cos(angle);
    final py = center.dy + radius * sin(angle);

    if (i == 0) {
      path.moveTo(px, py);
    } else {
      path.lineTo(px, py);
    }
  }
  path.close();

  canvas.drawPath(path, paint);
}

5.5 二维码生成实现

void _generateQRCode() {
  if (_contentController.text.isEmpty) {
    ScaffoldMessenger.of(context).showSnackBar(
      const SnackBar(
        content: Text('请输入二维码内容'),
        backgroundColor: Colors.orange,
      ),
    );
    return;
  }

  setState(() {
    _isGenerating = true;
  });

  Future.delayed(const Duration(seconds: 2), () {
    final design = QRCodeDesign(
      id: 'design_${DateTime.now().millisecondsSinceEpoch}',
      name: '自定义设计 ${_savedDesigns.length + 1}',
      style: _selectedStyle,
      gradient: _selectedGradient,
      primaryColor: _primaryColor,
      secondaryColor: _secondaryColor,
      eyeStyle: _selectedEyeStyle,
      frameStyle: _selectedFrameStyle,
      logoPosition: _selectedLogoPosition,
      cornerRadius: _cornerRadius,
    );

    final qrCode = GeneratedQRCode(
      id: 'qr_${DateTime.now().millisecondsSinceEpoch}',
      content: _contentController.text,
      design: design,
    );

    setState(() {
      _history.insert(0, qrCode);
      _isGenerating = false;
    });
  });
}

六、交互设计

6.1 生成流程

渲染器 预览区 生成页 用户 渲染器 预览区 生成页 用户 输入二维码内容 验证内容 选择样式风格 应用样式 更新预览 显示效果 设置颜色渐变 应用渐变 实时更新 点击生成 渲染二维码 返回生成结果

6.2 设计应用流程

点击模板

保存设计

打开设计页

显示模板网格

用户操作

应用设计设置

跳转生成页

显示效果

保存当前设置

添加到模板

6.3 历史管理流程

点击记录

点击应用

生成完成

历史列表

查看详情

应用设计

生成页


七、扩展功能规划

7.1 后续版本规划

2024-01-07 2024-01-14 2024-01-21 2024-01-28 2024-02-04 2024-02-11 2024-02-18 2024-02-25 2024-03-03 2024-03-10 2024-03-17 2024-03-24 2024-03-31 基础UI框架 样式风格实现 渐变效果实现 真实二维码生成 更多样式风格 批量生成功能 动态二维码 社交分享 云端存储 V1.0 基础版本 V1.1 增强版本 V1.2 进阶版本 二维码美化器应用开发计划

7.2 功能扩展建议

7.2.1 真实二维码生成

生成功能:

  • 集成二维码生成库
  • 支持多种编码格式
  • 错误纠正级别设置
  • 高分辨率导出
7.2.2 动态二维码

动态功能:

  • GIF动画效果
  • 渐变动画
  • 粒子效果
  • 交互式二维码
7.2.3 社交分享

分享功能:

  • 一键分享到社交平台
  • 批量导出
  • 水印添加
  • 云端备份

八、注意事项

8.1 开发注意事项

  1. 可识别性:美化后的二维码必须保证可被扫描识别

  2. 对比度:颜色搭配需保证足够的对比度

  3. Logo大小:嵌入Logo不能遮挡过多二维码区域

  4. 性能优化:复杂样式需优化绘制性能

  5. 导出质量:导出图片需保证足够分辨率

8.2 常见问题

问题 原因 解决方案
无法扫描 对比度不足 调整颜色对比度
Logo遮挡过多 Logo尺寸过大 减小Logo尺寸
渐变效果异常 渐变范围错误 检查Shader设置
样式显示异常 绘制参数错误 检查路径计算
导出模糊 分辨率不足 提高导出分辨率

8.3 使用技巧

📱 二维码美化技巧 📱

样式选择建议

  • 圆角方块:适合商务场景,专业大气
  • 圆点样式:适合时尚品牌,潮流前卫
  • 爱心样式:适合浪漫主题,温馨甜蜜
  • 星形样式:适合娱乐活动,闪耀夺目

颜色搭配建议

  • 科技蓝渐变:适合科技产品
  • 浪漫粉渐变:适合女性品牌
  • 彩虹渐变:适合创意活动
  • 日落渐变:适合温暖主题

Logo嵌入技巧

  • Logo不宜过大,建议不超过二维码面积的15%
  • Logo周围留白,避免遮挡关键信息
  • 选择与二维码风格协调的Logo

九、运行说明

9.1 环境要求

环境 版本要求
Flutter SDK >= 3.0.0
Dart SDK >= 2.17.0
鸿蒙OS API 21+
Web浏览器 Chrome 90+

9.2 运行命令

# 查看可用设备
flutter devices

# 运行到Web服务器
flutter run -d web-server -t lib/main_qrcode_beautifier.dart --web-port 8140

# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_qrcode_beautifier.dart

# 代码分析
flutter analyze lib/main_qrcode_beautifier.dart

十、总结

二维码美化器应用通过二维码生成、设计模板、生成历史、关于信息四大模块,为用户提供了一个便捷的二维码美化平台。应用支持6种样式风格、6种渐变效果、5种定位点样式、6种边框样式,让用户轻松打造独一无二的个性化二维码。

核心功能涵盖样式选择、颜色设置、渐变效果、Logo嵌入四大模块。样式风格从经典方块到星形样式,满足不同场景需求;渐变效果支持线性、径向、扫描、彩虹、日落等多种类型;颜色设置支持自定义主色副色和圆角调节;Logo嵌入支持5种位置选择。

应用采用 Material Design 3 设计规范,以清新的青色为主色调,象征科技与创新。通过本应用,希望能够帮助用户将普通二维码变成艺术品,让扫码也变得时尚。

二维码美化器——把二维码变成艺术品


欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐