手写字体生成器应用


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

一、项目概述

运行效果图

image-20260409184408884

image-20260409184415326

image-20260409184419611

image-20260409184423419

1.1 应用简介

手写字体生成器是一款创意工具应用,让用户通过手写样本生成专属字体。用户可以在画布上书写字符样本,应用自动将其转换为可用的字体文件,支持在线安装到手机电脑,让每条消息都有独特的个人风格。

应用以温暖的橙色为主色调,象征手写的温度与个性。涵盖字体书写、字体管理、字体预览、关于信息四大模块。用户可以创建字体项目、书写样本字符、调整字体样式、导出字体文件。

1.2 核心功能

功能模块功能描述实现方式
手写画布书写字符样本手势绘制
字体样式多种字体风格选择枚举定义
笔画设置调整笔画粗细和颜色参数配置
字体管理管理多个字体项目列表存储
字体预览实时预览字体效果文本展示
字体导出导出多种格式字体格式转换

1.3 字体风格定义

序号风格名称Emoji描述
1常规✏️标准手写风格
2粗体🖊️加粗有力风格
3斜体✍️倾斜流畅风格
4草书📜连笔艺术风格
5可爱🎀圆润可爱风格
6优雅💎精致优雅风格

1.4 笔画粗细定义

序号粗细名称Emoji宽度值
1〰️1.5px
22.5px
34.0px
4特粗6.0px

1.5 字体颜色定义

序号颜色名称Emoji色值
1黑色#000000
2蓝色🔵#2196F3
3红色🔴#F44336
4绿色🟢#4CAF50
5紫色🟣#9C27B0
6棕色🟤#795548

1.6 导出格式定义

序号格式名称Emoji描述
1TTF🔤TrueType字体
2OTF🔤OpenType字体
3WOFF🌐Web字体格式
4WOFF2🌐Web字体压缩格式

1.7 技术栈

技术领域技术选型版本要求
开发框架Flutter>= 3.0.0
编程语言Dart>= 2.17.0
设计规范Material Design 3-
手势识别GestureDetector-
自定义绘制CustomPainter-
目标平台鸿蒙OS / WebAPI 21+

1.8 项目结构

lib/
└── main_handwriting_font_generator.dart
    ├── HandwritingFontGeneratorApp     # 应用入口
    ├── FontStyle                       # 字体风格枚举
    ├── StrokeWidth                     # 笔画粗细枚举
    ├── FontColor                       # 字体颜色枚举
    ├── ExportFormat                    # 导出格式枚举
    ├── CharacterSample                 # 字符样本模型
    ├── CustomFont                      # 自定义字体模型
    ├── HandwritingFontGeneratorHomePage # 主页面(底部导航)
    ├── _buildWritePage                 # 书写页面
    ├── _buildFontsPage                 # 字体页面
    ├── _buildPreviewPage               # 预览页面
    ├── _buildProfilePage               # 关于页面
    ├── GuideLinesPainter               # 辅助线绘制器
    └── StrokePainter                   # 笔画绘制器

二、系统架构

2.1 整体架构图

Data Layer

Business Layer

Presentation Layer

主页面
HandwritingFontGeneratorHomePage

书写页

字体页

预览页

关于页

样式选择

书写画布

操作按钮

字体列表

进度显示

导出功能

预览文本

样式展示

功能说明

使用流程

笔画采集器
StrokeCollector

字体生成器
FontGenerator

导出处理器
ExportHandler

CharacterSample
字符样本

CustomFont
自定义字体

FontStyle
字体风格

StrokeWidth
笔画粗细

2.2 类图设计

belongs to

has

has

has

HandwritingFontGeneratorApp

+Widget build()

«enumeration»

FontStyle

+String label

+String emoji

+String description

+regular()

+bold()

+italic()

+cursive()

+cute()

+elegant()

«enumeration»

StrokeWidth

+String label

+String emoji

+double width

+thin()

+medium()

+thick()

+extraThick()

«enumeration»

FontColor

+String label

+String emoji

+Color color

+black()

+blue()

+red()

+green()

+purple()

+brown()

«enumeration»

ExportFormat

+String label

+String emoji

+String description

+ttf()

+otf()

+woff()

+woff2()

CharacterSample

+String character

+List<Offset> strokes

+bool isCompleted

+DateTime createdAt

+copyWith()

CustomFont

+String id

+String name

+FontStyle style

+StrokeWidth strokeWidth

+FontColor color

+List<CharacterSample> samples

+int totalCharacters

+int completedCharacters

+DateTime createdAt

+double progress

2.3 页面导航流程

书写

字体

预览

关于

无字体

有字体

继续书写

导出字体

应用启动

书写页

底部导航

书写画布

字体列表

字体预览

应用信息

当前状态

创建新字体

书写字符

设置样式

保存字符

继续下一个

选择字体

操作

选择格式

下载字体

2.4 字符书写流程

字体存储笔画采集书写画布用户字体存储笔画采集书写画布用户开始书写触发onPanStart记录起点移动手指触发onPanUpdate记录轨迹点实时绘制抬起手指触发onPanEnd点击保存保存字符样本显示下一个字符

三、核心模块设计

3.1 数据模型设计

3.1.1 字体风格枚举 (FontStyle)
enum FontStyle {
  regular(label: '常规', emoji: '✏️', description: '标准手写风格'),
  bold(label: '粗体', emoji: '🖊️', description: '加粗有力风格'),
  italic(label: '斜体', emoji: '✍️', description: '倾斜流畅风格'),
  cursive(label: '草书', emoji: '📜', description: '连笔艺术风格'),
  cute(label: '可爱', emoji: '🎀', description: '圆润可爱风格'),
  elegant(label: '优雅', emoji: '💎', description: '精致优雅风格');

  final String label;
  final String emoji;
  final String description;
}
3.1.2 笔画粗细枚举 (StrokeWidth)
enum StrokeWidth {
  thin(label: '细', emoji: '〰️', width: 1.5),
  medium(label: '中', emoji: '➖', width: 2.5),
  thick(label: '粗', emoji: '➖', width: 4.0),
  extraThick(label: '特粗', emoji: '▬', width: 6.0);

  final String label;
  final String emoji;
  final double width;
}
3.1.3 字符样本模型 (CharacterSample)
class CharacterSample {
  final String character;       // 字符
  final List<Offset> strokes;   // 笔画轨迹点
  final bool isCompleted;       // 是否完成
  final DateTime createdAt;     // 创建时间
}
3.1.4 自定义字体模型 (CustomFont)
class CustomFont {
  final String id;                    // 字体ID
  final String name;                  // 字体名称
  final FontStyle style;              // 字体风格
  final StrokeWidth strokeWidth;      // 笔画粗细
  final FontColor color;              // 字体颜色
  final List<CharacterSample> samples;// 字符样本列表
  final int totalCharacters;          // 总字符数
  final int completedCharacters;      // 已完成字符数
  final DateTime createdAt;           // 创建时间
  
  double get progress;                // 完成进度
}
3.1.5 字体风格分布
35%20%15%12%10%8%字体风格使用分布示例常规粗体斜体草书可爱优雅

3.2 页面结构设计

3.2.1 主页面布局

HandwritingFontGeneratorHomePage

IndexedStack

书写页

字体页

预览页

关于页

NavigationBar

书写 Tab

字体 Tab

预览 Tab

关于 Tab

3.2.2 书写页结构

书写页

SliverAppBar

快速统计

样式选择

书写画布

操作按钮

标题

统计数据

字体项目数

已完成字符

字体风格

字体风格选择

笔画粗细选择

字体颜色选择

辅助线

笔画绘制

清除按钮

跳过按钮

保存按钮

3.2.3 书写画布结构

书写画布

背景层

辅助线层

笔画层

工具层

白色背景

网格线

中心线

笔画路径

实时绘制

清除按钮

当前字符显示

进度显示

3.2.4 字体页结构

字体页

SliverAppBar

字体列表

字体卡片

字体名称

风格标签

进度条

操作按钮

继续书写

导出字体

3.3 笔画采集逻辑

保存

清除

继续

用户触摸屏幕

onPanStart

记录起始点

用户移动手指

onPanUpdate

记录轨迹点

实时绘制

用户抬起手指

onPanEnd

笔画完成

用户操作

保存到样本

清空笔画

继续书写

3.4 字体生成逻辑

粗体

斜体

草书

其他

收集字符样本

预处理笔画数据

规范化坐标

提取特征点

生成字体轮廓

应用字体风格

风格类型

加粗轮廓

倾斜变换

连笔处理

保持原样

生成字体文件

导出指定格式


四、UI设计规范

4.1 配色方案

应用以温暖的橙色为主色调,象征手写的温度与个性:

颜色类型色值用途
主色#FF7043 (Deep Orange)导航、主题元素
辅助色#FF8A65字体页面
第三色#FFAB91预览页面
强调色#FFCCBC关于页面
背景色#FAFAFA页面背景
卡片背景#FFFFFF字体卡片

4.2 笔画颜色

颜色名称色值视觉效果
黑色#000000经典墨水
蓝色#2196F3清新蓝墨
红色#F44336热情红墨
绿色#4CAF50自然绿墨
紫色#9C27B0优雅紫墨
棕色#795548复古棕墨

4.3 字体规范

元素字号字重颜色
页面标题24pxBold主色
字体名称16pxBold#000000
当前字符16pxBold主色
进度文字12pxRegular灰色
统计数字20pxBold白色

4.4 组件规范

4.4.1 样式选择器
┌─────────────────────────────────────┐
│  字体样式设置                        │
│                                     │
│  字体风格        笔画粗细   字体颜色  │
│  ┌──────────┐  ┌────────┐ ┌────────┐│
│  │✏️ 常规   ▼│  │➖ 中  ▼│ │⚫ 黑色▼││
│  └──────────┘  └────────┘ └────────┘│
└─────────────────────────────────────┘
4.4.2 书写画布
┌─────────────────────────────────────┐
│  当前字符: 你      进度: 1/20       │
├─────────────────────────────────────┤
│  │    │    │    │    │    │    │   │
│  │    │    │    │    │    │    │   │
│  │    │    │    │    │    │    │   │
│──┼────┼────┼────┼────┼────┼────┼── │
│  │    │    │    │    │    │    │   │
│  │    │    │  你 │    │    │    │ 🗑️│
│  │    │    │    │    │    │    │   │
│──┼────┼────┼────┼────┼────┼────┼── │
│  │    │    │    │    │    │    │   │
│  │    │    │    │    │    │    │   │
└─────────────────────────────────────┘
4.4.3 操作按钮
┌─────────────────────────────────────┐
│  [跳过]     [  保存并继续  ]         │
└─────────────────────────────────────┘
4.4.4 字体卡片
┌─────────────────────────────────────┐
│  我的手写体            ✏️ 常规      │
│                                     │
│  ████████░░░░░░░░░░░░░░░░░░░  1.9%  │
│  128/6763 字符                      │
│                                     │
│  [继续书写]       [导出字体]        │
└─────────────────────────────────────┘
4.4.5 导出格式选择
┌─────────────────────────────────────┐
│  选择导出格式                        │
│                                     │
│  ┌─────────┐  ┌─────────┐          │
│  │   🔤    │  │   🔤    │          │
│  │  TTF    │  │  OTF    │          │
│  │TrueType │  │OpenType │          │
│  └─────────┘  └─────────┘          │
│                                     │
│  ┌─────────┐  ┌─────────┐          │
│  │   🌐    │  │   🌐    │          │
│  │  WOFF   │  │  WOFF2  │          │
│  │Web字体  │  │Web压缩  │          │
│  └─────────┘  └─────────┘          │
└─────────────────────────────────────┘

五、核心功能实现

5.1 笔画采集实现

void _onPanStart(DragStartDetails details) {
  setState(() {
    _currentStrokes.add(details.localPosition);
  });
}

void _onPanUpdate(DragUpdateDetails details) {
  setState(() {
    _currentStrokes.add(details.localPosition);
  });
}

void _onPanEnd(DragEndDetails details) {
  // Stroke completed
}

5.2 笔画绘制实现

class StrokePainter extends CustomPainter {
  final List<Offset> strokes;
  final Color color;
  final double strokeWidth;

  
  void paint(Canvas canvas, Size size) {
    if (strokes.isEmpty) return;

    final paint = Paint()
      ..color = color
      ..strokeWidth = strokeWidth
      ..strokeCap = StrokeCap.round
      ..strokeJoin = StrokeJoin.round
      ..style = PaintingStyle.stroke;

    final path = Path();
    path.moveTo(strokes.first.dx, strokes.first.dy);

    for (int i = 1; i < strokes.length; i++) {
      path.lineTo(strokes[i].dx, strokes[i].dy);
    }

    canvas.drawPath(path, paint);
  }
}

5.3 辅助线绘制实现

class GuideLinesPainter extends CustomPainter {
  
  void paint(Canvas canvas, Size size) {
    final paint = Paint()
      ..color = Colors.grey.withValues(alpha: 0.2)
      ..strokeWidth = 0.5;

    final centerLine = Paint()
      ..color = Colors.grey.withValues(alpha: 0.3)
      ..strokeWidth = 1;

    // 绘制中心线
    canvas.drawLine(Offset(0, size.height / 2), Offset(size.width, size.height / 2), centerLine);
    canvas.drawLine(Offset(size.width / 2, 0), Offset(size.width / 2, size.height), centerLine);

    // 绘制网格线
    for (double y = 0; y < size.height; y += 30) {
      canvas.drawLine(Offset(0, y), Offset(size.width, y), paint);
    }
    for (double x = 0; x < size.width; x += 30) {
      canvas.drawLine(Offset(x, 0), Offset(x, size.height), paint);
    }
  }
}

5.4 字符保存实现

void _saveCharacter() {
  if (_currentStrokes.isEmpty) {
    ScaffoldMessenger.of(context).showSnackBar(
      const SnackBar(
        content: Text('请先书写字符'),
        backgroundColor: Colors.orange,
      ),
    );
    return;
  }

  setState(() {
    _characterIndex++;
    if (_characterIndex < _sampleCharacters.length) {
      _currentCharacter = _sampleCharacters[_characterIndex];
    } else {
      _characterIndex = 0;
      _currentCharacter = _sampleCharacters[0];
    }
    _currentStrokes.clear();
  });

  ScaffoldMessenger.of(context).showSnackBar(
    SnackBar(
      content: Text('字符 " $_currentCharacter " 已保存'),
      backgroundColor: const Color(0xFFFF7043),
    ),
  );
}

5.5 字体创建实现

void _createNewFont() {
  final font = CustomFont(
    id: 'font_${DateTime.now().millisecondsSinceEpoch}',
    name: '新字体 ${_myFonts.length + 1}',
    style: _selectedStyle,
    strokeWidth: _selectedWidth,
    color: _selectedColor,
  );

  setState(() {
    _myFonts.insert(0, font);
    _currentFont = font;
    _characterIndex = 0;
    _currentCharacter = _sampleCharacters[0];
    _currentStrokes.clear();
  });
}

六、交互设计

6.1 书写流程

字体存储笔画采集书写画布用户字体存储笔画采集书写画布用户选择字体样式更新设置开始书写记录笔画轨迹实时绘制点击保存保存字符样本显示下一个字符

6.2 字体管理流程

新建

继续书写

导出

打开字体页

显示字体列表

用户操作

创建新字体

跳转书写页

加载字体数据

选择导出格式

生成字体文件

下载字体

6.3 字体预览流程

修改设置

继续调整

确认满意

选择样式

更新预览

显示效果


七、扩展功能规划

7.1 后续版本规划

2024-01-072024-01-142024-01-212024-01-282024-02-042024-02-112024-02-182024-02-252024-03-032024-03-102024-03-172024-03-242024-03-31基础UI框架 书写画布 字体管理 真实字体生成 云端存储 字体分享 AI字体优化 多语言支持 字体市场 V1.0 基础版本V1.1 增强版本V1.2 进阶版本手写字体生成器应用开发计划

7.2 功能扩展建议

7.2.1 真实字体生成

生成功能:

  • 字符轮廓提取
  • 贝塞尔曲线拟合
  • 字体文件生成
  • 字体元数据设置
7.2.2 AI字体优化

AI功能:

  • 笔画平滑处理
  • 字形规范化
  • 风格迁移
  • 自动补全
7.2.3 字体市场

市场功能:

  • 字体分享社区
  • 热门字体排行
  • 字体评价系统
  • 创作者认证

八、注意事项

8.1 开发注意事项

  1. 笔画数据:大量笔画数据需考虑存储优化

  2. 手势冲突:书写手势与滚动手势需正确处理

  3. 性能优化:实时绘制需优化渲染性能

  4. 字体生成:真实字体生成需要专业字体库支持

  5. 文件导出:Web版本文件导出需使用下载API

8.2 常见问题

问题原因解决方案
笔画不连续采样频率低增加采样点
绘制卡顿重绘范围大局部重绘优化
字体无法导出格式不支持检查导出格式
样式不生效状态未更新检查setState
进度显示错误计数逻辑错误检查计数器

8.3 字体安装说明

📱 字体安装指南 📱

iOS设备

  • 下载字体文件
  • 通过字体管理APP安装
  • 在设置中启用字体

Android设备

  • 下载字体文件
  • 复制到系统字体目录
  • 或使用字体管理APP

Windows电脑

  • 右键字体文件
  • 选择"安装"
  • 或拖入字体文件夹

Mac电脑

  • 双击字体文件
  • 点击"安装字体"
  • 在字体册中管理

九、运行说明

9.1 环境要求

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

9.2 运行命令

# 查看可用设备
flutter devices

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

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

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

十、总结

手写字体生成器应用通过字体书写、字体管理、字体预览、关于信息四大模块,为用户提供了一个个性化的字体创作平台。用户可以通过手写样本生成专属字体,支持多种字体风格和笔画设置,导出多种格式字体文件。

核心功能涵盖笔画采集、样式设置、字体管理、字体导出四大模块。笔画采集通过手势识别实现实时绘制;样式设置支持6种字体风格、4种笔画粗细、6种字体颜色;字体管理支持创建多个字体项目并跟踪进度;字体导出支持TTF、OTF、WOFF、WOFF2四种格式。

应用采用 Material Design 3 设计规范,以温暖的橙色为主色调,象征手写的温度与个性。通过本应用,希望能够帮助用户创造独特的个人字体,让每条消息都有独特的个人风格。

手写字体生成器——让每条消息都有你的风格


Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐