喝水精灵应用


欢迎加入开源鸿蒙跨平台社区:
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 动画时序

喝水前 0ms 精灵正常呼吸 喝水时 0ms 触发跳跃动画 200ms 精灵放大到130% 400ms 回到正常大小 600ms 再次弹起 800ms 动画结束 喝水后 0ms 恢复呼吸动画 状态更新 饱食度增加 喝水动画时序图

七、状态管理

7.1 状态分类

状态类型 状态名称 说明
精灵状态 _sprite 饱食度、开心度、活力值、等级
记录状态 _records 喝水记录列表
动画状态 _bounceController 跳跃动画控制器
动画状态 _pulseController 呼吸动画控制器
定时器 _decayTimer 状态衰减定时器
今日统计 _todayIntake 今日喝水总量
目标设置 _dailyGoal 每日目标(默认2000ml)

7.2 状态流转

初始化

饱食度<60

饱食度<20

喝水喂养

喝水喂养

累计1000ml

继续喝水

健康状态

饥饿状态

危险状态

升级


八、性能优化

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 设计扩展

方向 描述
主题切换 支持多种主题色
精灵装扮 给精灵穿衣服、配饰
背景场景 不同场景(森林、海洋、太空)

十二、总结

喝水精灵应用通过游戏化的方式,将健康喝水习惯养成变得有趣。应用核心亮点包括:

  1. 养成系统:三维状态系统让精灵有生命力
  2. 视觉反馈:精灵外观随状态实时变化
  3. 动画丰富:跳跃、呼吸动画让交互生动
  4. 升级机制:累计喝水升级,提供成就感
  5. 简洁设计:Material Design 3,界面清爽

应用代码结构清晰,共922行,无第三方依赖,易于理解和维护。后续可扩展数据持久化、喝水提醒、多种精灵等功能,提供更完整的养成体验。

喝水养精灵,健康又快乐!

Logo

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

更多推荐