🎨 Flutter + OpenHarmony UI 设计规范:打造整齐、美观、一致的全场景体验
作者 :晚霞的不甘
日期 :2025年12月5日
标签:Flutter · OpenHarmony · UI/UX · 设计系统 · 鸿蒙设计语言 · 响应式布局 · 视觉一致性

引言:美,是用户体验的第一道信任状
在 OpenHarmony 的全场景世界中,用户可能在手表上瞥一眼通知 ,在手机上快速操作 ,在车机上专注导航 ,在智慧屏前沉浸观影 。
如果每个设备上的界面风格迥异、交互逻辑混乱、视觉层级模糊------再强大的功能也会被糟糕的体验抵消。
整齐 ≠ 单调,美观 ≠ 花哨 。
真正的高质量 UI,是在统一设计语言 下,针对不同设备特性做出的优雅适配。
本文结合 OpenHarmony Design System(OHDS) 与 Flutter 最佳实践 ,提供一套可落地的 UI 设计与实现规范,助你打造专业、一致、愉悦的鸿蒙应用界面。
一、设计原则:OHDS × Flutter 的融合哲学
| 原则 | 说明 | Flutter 实现建议 |
|---|---|---|
| 一致性 | 跨设备保持核心元素统一 | 使用统一 ThemeData + 全局组件库 |
| 适应性 | 根据屏幕尺寸/交互方式自动调整 | 响应式布局 + 设备类型感知 |
| 轻量化 | 避免视觉噪音,突出内容 | 留白 ≥ 16dp,色彩 ≤ 3 主色 |
| 可访问性 | 支持大字体、高对比度、语音导航 | 遵循 Semantics 规范 |
✅ 核心理念 :"一次设计,多端自适应",而非"一套 UI 强行拉伸"。
二、视觉体系:构建统一的设计语言
2.1 色彩系统(Color System)
采用 OpenHarmony 官方主色 + Flutter 主题扩展:
dart
// lib/theme/app_theme.dart
final lightTheme = ThemeData(
primaryColor: Color(0xFF007DFF), // OH 主色
scaffoldBackgroundColor: Colors.white,
textTheme: TextTheme(
headlineMedium: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
bodyMedium: TextStyle(fontSize: 16, height: 1.5),
),
// ...
);
final darkTheme = ThemeData(
brightness: Brightness.dark,
primaryColor: Color(0xFF4DA6FF),
scaffoldBackgroundColor: Color(0xFF121212),
);
规范要求:
- 主色仅用于关键操作按钮、选中状态
- 文字使用系统标准色(非自定义灰度)
- 禁止使用纯黑(#000000)或纯白背景
2.2 字体与排版(Typography)
| 场景 | 字号(sp) | 行高 | 用途 |
|---|---|---|---|
| 标题 | 20--24 | 1.3 | 页面主标题 |
| 正文 | 16 | 1.5 | 段落、列表项 |
| 辅助文本 | 14 | 1.4 | 说明、时间、标签 |
| 按钮 | 16 | --- | 所有操作按钮 |
📏 对齐规则:
- 左侧内容左对齐
- 数字/金额右对齐
- 居中仅用于图标或极短文案
2.3 间距与留白(Spacing)
采用 8dp 基数网格系统:
dart
const EdgeInsetsGeometry kPaddingSmall = EdgeInsets.all(8);
const EdgeInsetsGeometry kPaddingMedium = EdgeInsets.all(16);
const EdgeInsetsGeometry kPaddingLarge = EdgeInsets.all(24);
黄金比例:
- 元素内边距:8 / 16 / 24 dp
- 段落间距:16 dp
- 卡片圆角:12 dp(手机)、24 dp(大屏)
🌐 响应式提示:在智慧屏上,所有间距 ×1.5 倍以提升可读性。
三、组件规范:整齐从每一个像素开始
3.1 按钮(Button)
| 类型 | 使用场景 | 样式 |
|---|---|---|
| 主按钮 | 关键操作(提交、确认) | 实底 + 主色 |
| 次按钮 | 次要操作(取消、返回) | 描边 + 主色 |
| 文字按钮 | 轻量操作(更多、编辑) | 无背景,主色文字 |
dart
ElevatedButton(
style: ElevatedButton.styleFrom(
backgroundColor: Theme.of(context).primaryColor,
shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)),
padding: kPaddingMedium,
),
onPressed: () {},
child: Text('确认', style: TextStyle(color: Colors.white)),
)
✅ 一致性检查:全应用按钮高度统一为 48dp(手机)/ 64dp(大屏)。
3.2 列表(List)
- 分割线:仅在需要视觉隔离时使用(如设置项)
- 图标对齐:左侧图标统一 24×24 dp,距文字 16 dp
- 点击反馈 :使用
InkWell提供水波纹
dart
ListTile(
leading: Icon(Icons.settings, size: 24),
title: Text('通用设置'),
trailing: Icon(Icons.chevron_right),
onTap: () {},
)
🚫 禁止:在列表中混用不同高度的 item。
3.3 卡片(Card)
- 阴影:仅在需要浮层感时使用(如首页推荐)
- 内容结构:图片(可选)+ 标题 + 描述 + 操作区
- 最大宽度:手机 ≤ 360dp,平板 ≤ 500dp
dart
Card(
margin: kPaddingMedium,
clipBehavior: Clip.hardEdge,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Image.asset('banner.jpg', height: 120, fit: BoxFit.cover),
Padding(
padding: kPaddingSmall,
child: Text('标题', style: Theme.of(context).textTheme.titleMedium),
),
],
),
)
四、多端适配:让 UI 在每台设备上都"刚刚好"
4.1 布局策略矩阵
| 设备类型 | 屏幕宽度 | 推荐布局 | 示例 |
|---|---|---|---|
| 手表 | < 300 dp | 纵向流式 | 单列列表 |
| 手机 | 300--500 dp | 单栏 | 标准 App |
| 平板 | 500--800 dp | 双栏 | 主-详情 |
| 智慧屏 | > 800 dp | 网格/分屏 | 多卡片瀑布流 |
4.2 Flutter 响应式实现
dart
Widget build(BuildContext context) {
final width = MediaQuery.sizeOf(context).width;
if (width > 800) {
return TvGridLayout(); // 智慧屏
} else if (width > 500) {
return TabletMasterDetail(); // 平板
} else {
return PhoneListView(); // 手机/手表
}
}
🎯 进阶技巧 :使用
LayoutBuilder+FittedBox实现更精细控制。
4.3 交互适配
| 设备 | 输入方式 | UI 调整 |
|---|---|---|
| 手机 | 触控 | 按钮 ≥ 48×48 dp |
| 车机 | 旋钮/语音 | 减少点击,增大焦点区域 |
| 智慧屏 | 遥控器 | 支持方向键导航,高亮当前项 |
| 手表 | 旋钮/手势 | 极简信息,支持滑动翻页 |
dart
// 为遥控器优化焦点
FocusableActionDetector(
actions: {
ActivateIntent: CallbackAction(onInvoke: () => _onSelect()),
},
child: Container(
decoration: BoxDecoration(
border: _hasFocus ? Border.all(color: Colors.blue, width: 2) : null,
),
child: MyContent(),
),
)
五、设计资源与工具
5.1 官方资源
- OpenHarmony Design 官网
- 组件库 Sketch/Figma 模板
- 动效规范(Lottie 示例)
- 多语言排版指南
5.2 Flutter 插件推荐
| 插件 | 用途 |
|---|---|
flutter_oh_design |
OHDS 官方 Flutter 组件库 |
responsive_builder |
简化响应式布局 |
focus_highlight |
自动处理遥控器焦点高亮 |
六、走查清单:发布前必检 10 项
✅ 所有文字是否使用系统字体(非硬编码字号)?
✅ 主色是否仅用于关键操作?
✅ 按钮高度是否统一?
✅ 列表 item 是否等高?
✅ 智慧屏版本是否禁用小字号?
✅ 车机模式是否支持语音跳过点击?
✅ 深色模式下对比度是否 ≥ 4.5:1?
✅ 所有图标是否使用同一套(如 Material 或 OH Icons)?
✅ 留白是否遵循 8dp 基数?
✅ 多语言下布局是否不溢出(尤其德语长词)?
结语:整齐是尊重,美观是责任
在信息过载的时代,克制而有序的设计 ,是对用户注意力最深的尊重。
通过遵循这套规范,你的应用将不仅"能用",更能"悦用"。
🌟 最后建议 :
创建团队内部的 Design Token 文件 (如
colors.yaml,spacing.json),并用 自动化脚本 检查 PR 中是否违反规范。
因为每一个像素的整齐,都在无声诉说:我们认真对待你的体验。
附录:一键初始化项目模板
bash
flutter create --org com.example --platforms=openharmony my_oh_app
cd my_oh_app
flutter pub add flutter_oh_design responsive_builder
📦 模板已预置:主题系统、响应式工具、OHDS 组件引用。
开源鸿蒙跨平台开发者社区 https://openharmonycrossplatform.csdn.net/content