Flutter 框架跨平台鸿蒙开发 - 喝水精灵
运行效果图喝水精灵是一款将健康喝水提醒与养成游戏相结合的创新应用。用户通过喝水来喂养自己的电子精灵,如果不按时喝水,精灵会饿瘦、不开心,甚至"晕倒"。这种游戏化的设计让喝水这件日常小事变得有趣,帮助用户养成健康的饮水习惯。喝水不仅是为了自己,也是为了照顾你的小精灵!喝水精灵应用通过游戏化的方式,将健康喝水习惯养成变得有趣。养成系统:三维状态系统让精灵有生命力视觉反馈:精灵外观随状态实时变化动画丰富
·
喝水精灵应用
欢迎加入开源鸿蒙跨平台社区:
https://openharmonycrossplatform.csdn.net
一、项目概述
运行效果图



1.1 应用简介
喝水精灵是一款将健康喝水提醒与养成游戏相结合的创新应用。用户通过喝水来喂养自己的电子精灵,如果不按时喝水,精灵会饿瘦、不开心,甚至"晕倒"。这种游戏化的设计让喝水这件日常小事变得有趣,帮助用户养成健康的饮水习惯。
应用核心理念:喝水不仅是为了自己,也是为了照顾你的小精灵!
1.2 核心功能
| 功能模块 | 功能描述 | 实现方式 |
|---|---|---|
| 精灵养成 | 三维状态系统(饱食度、开心度、活力值) | 状态类 + 定时器 |
| 喝水记录 | 多种水量选择、时间记录 | 底部弹窗 + 列表 |
| 状态衰减 | 每分钟自动下降饱食度 | Timer.periodic |
| 升级系统 | 累计喝水量升级 | 等级计算逻辑 |
| 动画反馈 | 喝水时精灵跳跃动画 | AnimationController |
| 数据统计 | 今日喝水、累计喝水、平均水量 | 实时计算 |
1.3 精灵状态系统
| 状态维度 | 范围 | 作用 | 衰减速度 |
|---|---|---|---|
| 饱食度 | 0-100 | 核心指标,决定精灵外观 | -0.5/分钟 |
| 开心度 | 0-100 | 影响精灵心情 | -0.3/分钟 |
| 活力值 | 0-100 | 影响精灵活力 | -0.2/分钟 |
1.4 精灵外观变化
| 饱食度 | 表情 | 颜色 | 状态描述 |
|---|---|---|---|
| < 20 | 😵 | 红色 | 极度饥饿(危险) |
| < 40 | 😰 | 红色 | 饿了 |
| < 60 | 😟 | 黄色 | 有点饿 |
| 60-80 | 🙂 | 青色 | 正常 |
| > 80 | 😊 | 青色 | 饱饱的 |
| > 90 & 开心>90 | 🤩 | 青色 | 超级开心 |
1.5 技术栈
| 技术领域 | 技术选型 | 版本要求 |
|---|---|---|
| 开发框架 | Flutter | >= 3.0.0 |
| 编程语言 | Dart | >= 2.17.0 |
| 设计规范 | Material Design 3 | - |
| 状态管理 | setState | - |
| 动画控制 | AnimationController | - |
| 定时任务 | Timer | - |
| 目标平台 | 鸿蒙OS | API 21+ |
二、项目结构
lib/
├── main_water_sprite.dart # 应用主入口(922行)
│ ├── WaterSpriteApp # 根应用组件
│ ├── DrinkRecord # 喝水记录模型
│ ├── SpriteState # 精灵状态模型
│ └── WaterSpriteHomePage # 主页面
三、数据模型
3.1 DrinkRecord 模型
class DrinkRecord {
final String id; // 唯一标识(时间戳)
final int amount; // 喝水量(ml)
final DateTime time; // 喝水时间
final String type; // 喝水类型(小口/一杯/一大杯/一瓶)
DrinkRecord({
required this.id,
required this.amount,
required this.time,
required this.type,
});
}
3.2 SpriteState 模型
class SpriteState {
double fullness; // 饱食度 0-100
double happiness; // 开心度 0-100
double energy; // 活力值 0-100
int level; // 等级
int totalWater; // 累计喝水量(ml)
SpriteState({
this.fullness = 80,
this.happiness = 80,
this.energy = 80,
this.level = 1,
this.totalWater = 0,
});
// 根据状态返回心情文字
String get mood {
if (fullness < 20) return '极度饥饿';
if (fullness < 40) return '饿了';
if (fullness < 60) return '有点饿';
if (happiness < 40) return '不开心';
if (energy < 30) return '疲惫';
return '开心';
}
// 根据状态返回表情
String get spriteEmoji {
if (fullness < 20) return '😵';
if (fullness < 40) return '😰';
if (fullness < 60) return '😟';
if (happiness < 40) return '😢';
if (energy < 30) return '😴';
if (fullness > 90 && happiness > 90) return '🤩';
if (fullness > 80) return '😊';
return '🙂';
}
// 根据状态返回颜色
Color get spriteColor {
if (fullness < 30) return const Color(0xFFFF6B6B); // 红色
if (fullness < 60) return const Color(0xFFFDCB6E); // 黄色
return const Color(0xFF4ECDC4); // 青色
}
}
四、核心功能实现
4.1 状态衰减系统
精灵的状态会随时间自动衰减,模拟"饥饿"的过程:
void _startDecayTimer() {
_decayTimer = Timer.periodic(const Duration(minutes: 1), (timer) {
setState(() {
// 每分钟下降饱食度
_sprite.fullness = (_sprite.fullness - 0.5).clamp(0, 100);
_sprite.happiness = (_sprite.happiness - 0.3).clamp(0, 100);
_sprite.energy = (_sprite.energy - 0.2).clamp(0, 100);
});
});
}
衰减策略:
- 饱食度:每分钟减少0.5%,约3.3小时从满值降到0
- 开心度:每分钟减少0.3%,约5.5小时从满值降到0
- 活力值:每分钟减少0.2%,约8.3小时从满值降到0
4.2 喝水喂养逻辑
void _drinkWater(int amount, String type) {
final record = DrinkRecord(
id: DateTime.now().millisecondsSinceEpoch.toString(),
amount: amount,
time: DateTime.now(),
type: type,
);
setState(() {
_records.insert(0, record);
_todayIntake += amount;
_sprite.totalWater += amount;
// 增加饱食度和开心度
_sprite.fullness = (_sprite.fullness + amount / 20).clamp(0, 100);
_sprite.happiness = (_sprite.happiness + 10).clamp(0, 100);
_sprite.energy = (_sprite.energy + 5).clamp(0, 100);
// 检查升级
if (_sprite.totalWater > _sprite.level * 1000) {
_sprite.level++;
_showLevelUpDialog();
}
});
// 播放动画
_bounceController.forward(from: 0);
}
喂养效果:
- 饱食度:每喝20ml增加1%
- 开心度:每次喝水增加10%
- 活力值:每次喝水增加5%
- 升级:每累计1000ml升一级
4.3 精灵动画实现
AnimatedBuilder(
animation: Listenable.merge([_bounceController, _pulseController]),
builder: (context, child) {
double scale = 1.0;
if (_bounceController.isAnimating) {
// 喝水时的跳跃动画
scale = 1.0 + sin(_bounceController.value * pi) * 0.3;
} else {
// 平时的呼吸动画
scale = 1.0 + _pulseController.value * 0.05;
}
return Transform.scale(
scale: scale,
child: Container(
width: 150,
height: 150,
decoration: BoxDecoration(
shape: BoxShape.circle,
gradient: RadialGradient(
colors: [
_sprite.spriteColor.withValues(alpha: 0.3),
_sprite.spriteColor.withValues(alpha: 0.1),
],
),
boxShadow: [
BoxShadow(
color: _sprite.spriteColor.withValues(alpha: 0.3),
blurRadius: 30,
spreadRadius: 5,
),
],
),
child: Center(
child: Text(
_sprite.spriteEmoji,
style: const TextStyle(fontSize: 80),
),
),
),
);
},
)
动画说明:
- 跳跃动画:喝水时触发,使用正弦函数模拟跳跃效果
- 呼吸动画:平时持续播放,让精灵看起来更有生命力
- 颜色变化:根据饱食度动态改变背景颜色和光晕
五、UI设计
5.1 色彩系统
| 用途 | 色值 | 说明 |
|---|---|---|
| 主色调 | #4ECDC4 | 青色,代表水、健康 |
| 辅助色1 | #44A08D | 深青色,用于渐变 |
| 辅助色2 | #FF6B6B | 红色,代表饥饿/危险 |
| 辅助色3 | #FDCB6E | 黄色,代表警告 |
| 辅助色4 | #6C5CE7 | 紫色,用于统计卡片 |
| 饱食度条 | 橙色 | 代表食物/饱食 |
| 开心度条 | 粉色 | 代表心情 |
| 活力值条 | 蓝色 | 代表能量 |
5.2 页面结构
┌─────────────────────────────────┐
│ 喝水精灵 Lv.3 ⭐ │ ← 渐变头部
│ 喝水养精灵,健康又快乐 │
│ ┌─────────┐ ┌─────────┐ │
│ │今日喝水 │ │目标进度 │ │ ← 统计卡片
│ │ 650ml │ │ 32% │ │
│ └─────────┘ └─────────┘ │
├─────────────────────────────────┤
│ ┌─────────┐ │
│ │ 饱饱的 │ │ ← 精灵状态标签
│ └─────────┘ │
│ │
│ ┌─────────┐ │
│ │ │ │
│ │ 😊 │ │ ← 精灵动画区域
│ │ │ │
│ └─────────┘ │
│ │
│ 饱食度 ████████████ 85% │ ← 状态条
│ 开心度 ████████░░░░ 72% │
│ 活力值 ██████░░░░░░ 60% │
├─────────────────────────────────┤
│ 喝水统计 │
│ ┌────┐ ┌────┐ ┌────┐ │
│ │💧 │ │🥤 │ │📈 │ │ ← 统计卡片
│ │2650│ │ 5 │ │530 │ │
│ │ml │ │次 │ │ml │ │
│ └────┘ └────┘ └────┘ │
├─────────────────────────────────┤
│ 快捷操作 │
│ ┌────┐ ┌────┐ ┌────┐ │
│ │☕ │ │🥛 │ │🥤 │ │ ← 快捷按钮
│ │小口│ │一杯│ │一大│ │
│ │100 │ │200 │ │350 │ │
│ └────┘ └────┘ └────┘ │
├─────────────────────────────────┤
│ ▼ 今日记录 │
│ ┌─────────────────────────┐ │
│ │ 💧 一大杯 14:30 │ │ ← 喝水记录
│ │ +350ml │ │
│ └─────────────────────────┘ │
│ ┌─────────────────────────┐ │
│ │ 💧 一杯水 10:15 │ │
│ │ +200ml │ │
│ └─────────────────────────┘ │
├─────────────────────────────────┤
│ ┌─────────────────┐ │
│ │ + 喝水 │ │ ← FAB按钮
│ └─────────────────┘ │
└─────────────────────────────────┘
5.3 交互设计
| 交互元素 | 触发方式 | 响应行为 |
|---|---|---|
| 快捷按钮 | 点击 | 直接记录对应水量 |
| FAB按钮 | 点击 | 打开水量选择弹窗 |
| 水量选项 | 点击 | 记录喝水并播放动画 |
| 升级弹窗 | 自动触发 | 显示升级祝贺 |
六、动画详解
6.1 跳跃动画
喝水时精灵会跳跃庆祝:
// 动画控制器
_bounceController = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 800),
);
// 动画计算
scale = 1.0 + sin(_bounceController.value * pi) * 0.3;
动画参数:
- 时长:800ms
- 幅度:30%的缩放变化
- 曲线:正弦曲线,模拟跳跃的加速和减速
6.2 呼吸动画
平时精灵会有轻微的呼吸效果:
_pulseController = AnimationController(
vsync: this,
duration: const Duration(milliseconds: 1500),
)..repeat(reverse: true);
// 动画计算
scale = 1.0 + _pulseController.value * 0.05;
动画参数:
- 时长:1500ms
- 幅度:5%的缩放变化
- 模式:循环往复,模拟呼吸
6.3 动画时序
七、状态管理
7.1 状态分类
| 状态类型 | 状态名称 | 说明 |
|---|---|---|
| 精灵状态 | _sprite |
饱食度、开心度、活力值、等级 |
| 记录状态 | _records |
喝水记录列表 |
| 动画状态 | _bounceController |
跳跃动画控制器 |
| 动画状态 | _pulseController |
呼吸动画控制器 |
| 定时器 | _decayTimer |
状态衰减定时器 |
| 今日统计 | _todayIntake |
今日喝水总量 |
| 目标设置 | _dailyGoal |
每日目标(默认2000ml) |
7.2 状态流转
八、性能优化
8.1 渲染优化
| 优化点 | 实现方式 | 效果 |
|---|---|---|
| 动画优化 | 使用AnimatedBuilder | 只重绘动画部分 |
| 列表优化 | SliverList | 只渲染可见项 |
| 状态更新 | 精准setState | 避免不必要的重建 |
8.2 内存管理
void dispose() {
_bounceController.dispose();
_pulseController.dispose();
_shakeController.dispose();
_decayTimer?.cancel();
super.dispose();
}
8.3 性能指标
| 指标 | 目标值 | 实测值 |
|---|---|---|
| 动画帧率 | 60fps | 60fps |
| 内存占用 | < 50MB | 待测试 |
| 启动时间 | < 2s | 待测试 |
九、常见问题
9.1 问题排查
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 精灵状态不下降 | 定时器未启动 | 检查_initState中的_startDecayTimer调用 |
| 动画不播放 | 控制器未启动 | 检查forward()调用 |
| 升级不触发 | 累计水量计算错误 | 检查totalWater更新逻辑 |
| 状态更新延迟 | setState未及时调用 | 确保数据更新后调用setState |
9.2 调试技巧
// 打印精灵状态
debugPrint('Fullness: ${_sprite.fullness}');
debugPrint('Happiness: ${_sprite.happiness}');
debugPrint('Energy: ${_sprite.energy}');
// 检查定时器
if (_decayTimer?.isActive == true) {
debugPrint('Decay timer is active');
}
// 检查动画状态
debugPrint('Bounce: ${_bounceController.isAnimating}');
debugPrint('Pulse: ${_pulseController.isAnimating}');
十、运行说明
10.1 环境要求
| 环境 | 版本要求 |
|---|---|
| Flutter SDK | >= 3.0.0 |
| Dart SDK | >= 2.17.0 |
| 鸿蒙OS | API 21+ |
10.2 运行命令
# 查看可用设备
flutter devices
# 运行到鸿蒙设备
flutter run -d 127.0.0.1:5555 lib/main_water_sprite.dart
# 运行到Windows
flutter run -d windows -t lib/main_water_sprite.dart
# 代码分析
flutter analyze lib/main_water_sprite.dart
十一、扩展建议
11.1 功能扩展
| 功能 | 优先级 | 实现思路 |
|---|---|---|
| 数据持久化 | 高 | 使用SharedPreferences保存精灵状态 |
| 喝水提醒 | 高 | 使用本地通知定时提醒 |
| 多种精灵 | 中 | 解锁不同外观的精灵 |
| 成就系统 | 中 | 连续喝水、累计天数等成就 |
| 社交分享 | 低 | 分享精灵状态到社交平台 |
| 数据图表 | 低 | 使用fl_chart展示喝水趋势 |
11.2 设计扩展
| 方向 | 描述 |
|---|---|
| 主题切换 | 支持多种主题色 |
| 精灵装扮 | 给精灵穿衣服、配饰 |
| 背景场景 | 不同场景(森林、海洋、太空) |
十二、总结
喝水精灵应用通过游戏化的方式,将健康喝水习惯养成变得有趣。应用核心亮点包括:
- 养成系统:三维状态系统让精灵有生命力
- 视觉反馈:精灵外观随状态实时变化
- 动画丰富:跳跃、呼吸动画让交互生动
- 升级机制:累计喝水升级,提供成就感
- 简洁设计:Material Design 3,界面清爽
应用代码结构清晰,共922行,无第三方依赖,易于理解和维护。后续可扩展数据持久化、喝水提醒、多种精灵等功能,提供更完整的养成体验。
喝水养精灵,健康又快乐!
更多推荐




所有评论(0)