时间沙漏应用


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

一、项目概述

运行效果图

image-20260408192736240

image-20260408192742025

image-20260408192746130

image-20260408192750333

1.1 应用简介

时间沙漏是一款独特的时间管理应用,灵感来源于沙漏这一古老而优雅的时间计量工具。应用将时间具象化为沙子,通过可视化的方式展示时间的流逝,帮助用户直观感受时间的珍贵与不可逆。

沙漏中的每一粒沙子都代表时间的流逝,当沙子从上层流向下层,我们看到的不仅是时间的消耗,更是生命的流逝。通过记录和分析时间的使用情况,用户可以清晰地看到哪些时间被高效利用,哪些时间像沙子一样白白流走。

1.2 核心功能

功能模块 功能描述 实现方式
沙漏计时 可视化时间流逝 动画 + Timer
时间记录 记录时间使用情况 表单 + 分类
时间分类 6种时间类型 枚举定义
流逝速度 4种感知速度 枚举定义
翻转沙漏 重置计时 动画效果
统计分析 分析时间使用 图表可视化

1.3 时间类型定义

序号 类型名称 Emoji 主题色 描述
1 高效时间 #66BB6A 高效利用的时间
2 中性时间 ⏱️ #FFB74D 一般性时间
3 浪费时间 💨 #E57373 白白流逝的时间
4 休息时间 😴 #64B5F6 恢复精力的时间
5 学习时间 📚 #AB47BC 提升自我的时间
6 创造时间 🎨 #FF6B9D 创造价值的时间

1.4 时间流逝速度定义

序号 速度名称 速度值 主题色 描述
1 缓慢 1 #81C784 时间过得很慢
2 正常 2 #FFB74D 时间正常流逝
3 快速 3 #FF8A65 时间过得很快
4 极快 4 #E57373 时间飞逝

1.5 技术栈

技术领域 技术选型 版本要求
开发框架 Flutter >= 3.0.0
编程语言 Dart >= 2.17.0
设计规范 Material Design 3 -
动画控制 AnimationController -
定时器 Timer -
目标平台 鸿蒙OS / Web API 21+

1.6 项目结构

lib/
└── main_time_hourglass.dart
    ├── TimeHourglassApp           # 应用入口
    ├── TimeCategory               # 时间类型枚举
    ├── SandSpeed                  # 流逝速度枚举
    ├── TimeSession                # 时间会话模型
    ├── TimeHourglassHomePage      # 主页面(底部导航)
    ├── _buildHourglassPage        # 沙漏页面
    ├── _buildSessionsPage         # 记录页面
    ├── _buildStatsPage            # 统计页面
    └── HourglassPainter           # 沙漏绘制器

二、系统架构

2.1 整体架构图

Data Layer

Business Layer

Presentation Layer

主页面
TimeHourglassHomePage

沙漏页面

记录页面

统计页面

沙漏动画

计时器

分类选择

速度选择

沙漏绘制

沙子动画

翻转效果

记录列表

记录卡片

浪费时间

类型统计

速度统计

计时管理

时间分析

沙漏动画

TimeSession
时间会话

TimeCategory
时间类型

SandSpeed
流逝速度

2.2 类图设计

manages

renders

has

has

TimeHourglassApp

+Widget build()

«enumeration»

TimeCategory

+String label

+String emoji

+Color color

+productive()

+neutral()

+wasted()

+rest()

+learning()

+creative()

«enumeration»

SandSpeed

+String label

+int speed

+Color color

+slow()

+normal()

+fast()

+veryFast()

TimeSession

+String id

+DateTime startTime

+DateTime endTime

+Duration duration

+TimeCategory category

+String? activity

+String? notes

+SandSpeed perceivedSpeed

TimeHourglassHomePage

-int _selectedIndex

-List<TimeSession> _sessions

-bool _isTimerRunning

-DateTime? _timerStartTime

-Timer _timer

-Duration _elapsedTime

-AnimationController _sandAnimationController

-AnimationController _hourglassRotationController

+Widget build()

-_startTimer()

-_stopTimer()

-_flipHourglass()

HourglassPainter

+double sandProgress

+Color color

+void paint()

+bool shouldRepaint()

2.3 页面导航流程

沙漏

记录

统计

应用启动

沙漏页面

底部导航

查看沙漏动画

浏览记录

查看统计

开始计时

选择时间类型

选择流逝速度

停止计时

保存记录

查看历史记录

查看浪费时间

查看类型分布

查看速度分布

2.4 计时流程

数据层 Timer 沙漏页面 用户 数据层 Timer 沙漏页面 用户 loop [每秒更新] 点击开始计时 启动定时器 显示计时动画 更新时间 更新显示 点击停止计时 停止定时器 创建TimeSession 更新记录列表 显示成功提示

三、核心模块设计

3.1 数据模型设计

3.1.1 时间类型枚举 (TimeCategory)
enum TimeCategory {
  productive('高效时间', '✨', Color(0xFF66BB6A)),
  neutral('中性时间', '⏱️', Color(0xFFFFB74D)),
  wasted('浪费时间', '💨', Color(0xFFE57373)),
  rest('休息时间', '😴', Color(0xFF64B5F6)),
  learning('学习时间', '📚', Color(0xFFAB47BC)),
  creative('创造时间', '🎨', Color(0xFFFF6B9D));

  final String label;
  final String emoji;
  final Color color;

  const TimeCategory(this.label, this.emoji, this.color);
}
3.1.2 流逝速度枚举 (SandSpeed)
enum SandSpeed {
  slow('缓慢', 1, Color(0xFF81C784)),
  normal('正常', 2, Color(0xFFFFB74D)),
  fast('快速', 3, Color(0xFFFF8A65)),
  veryFast('极快', 4, Color(0xFFE57373));

  final String label;
  final int speed;
  final Color color;

  const SandSpeed(this.label, this.speed, this.color);
}
3.1.3 时间会话模型 (TimeSession)
class TimeSession {
  final String id;                    // 唯一标识
  final DateTime startTime;           // 开始时间
  final DateTime endTime;             // 结束时间
  final Duration duration;            // 持续时长
  final TimeCategory category;        // 时间类型
  final String? activity;             // 活动内容
  final String? notes;                // 备注
  final SandSpeed perceivedSpeed;     // 感知速度
}
3.1.4 时间类型分布
29% 21% 17% 14% 11% 7% 时间类型分布示例 高效时间 中性时间 浪费时间 休息时间 学习时间 创造时间

3.2 页面结构设计

3.2.1 主页面布局

TimeHourglassHomePage

IndexedStack

沙漏页面

记录页面

统计页面

NavigationBar

沙漏 Tab

记录 Tab

统计 Tab

3.2.2 沙漏页面结构

沙漏页面

SliverAppBar

计时卡片

类型选择器

速度选择器

今日总结

沙漏动画

旋转效果

时间显示

开始/停止按钮

翻转按钮

3.2.3 沙漏绘制结构

沙漏绘制

玻璃外框

上层沙子

下层沙子

沙子流

三角形轮廓

半透明效果

随时间减少

随时间增加

中间沙流

3.2.4 统计页面结构

统计页面

浪费时间卡片

类型统计

速度统计

总浪费时长

浪费百分比

进度条展示

柱状图展示

3.3 计时逻辑

开始计时

记录开始时间

启动Timer

每秒更新

计算已用时间

更新UI显示

更新沙漏动画

继续计时?

停止计时

计算总时长

创建TimeSession

保存记录

3.4 沙漏动画逻辑

运行中

未运行

沙漏动画

计时状态

使用实际时间

计算进度百分比

使用动画进度

绘制上层沙子

绘制下层沙子

绘制沙子流

上层沙子递减

下层沙子递增

中间沙流动画


四、UI设计规范

4.1 配色方案

应用以沙漏色为主色调,象征时间的流逝:

颜色类型 色值 用途
主色 #D4A574 (Sand) 导航、强调元素
高效色 #66BB6A 高效时间标识
中性色 #FFB74D 中性时间标识
浪费色 #E57373 浪费时间标识
休息色 #64B5F6 休息时间标识
学习色 #AB47BC 学习时间标识
创造色 #FF6B9D 创造时间标识

4.2 速度配色

速度 色值 视觉效果
缓慢 #81C784 绿色
正常 #FFB74D 橙色
快速 #FF8A65 深橙色
极快 #E57373 红色

4.3 字体规范

元素 字号 字重 颜色
页面标题 24px Bold 主色
计时数字 48px Bold 黑色
卡片标题 18px Bold 黑色
时间显示 16px Bold 黑色
类型标签 12px Regular 类型色

4.4 组件规范

4.4.1 计时卡片
┌─────────────────────────────────────┐
│                                     │
│           00:05:32                 │
│                                     │
│    [▶ 开始计时]    [🔄 翻转沙漏]   │
│                                     │
└─────────────────────────────────────┘
4.4.2 沙漏绘制
        ┌─────┐
        │░░░░░│  ← 上层沙子
        │░░░░░│
        └─────┘
           │
           │  ← 沙子流
           │
        ┌─────┐
        │▓▓▓▓▓│  ← 下层沙子
        │▓▓▓▓▓│
        └─────┘
4.4.3 记录卡片
┌─────────────────────────────────────┐
│  ┌────┐  浪费时间  [快速]          │
│  │ 💨 │  4/8 14:30                │
│  └────┘                      00:45  │
└─────────────────────────────────────┘
4.4.4 统计卡片
┌─────────────────────────────────────┐
│  ┌────┐  浪费的时间                 │
│  │ ⚠️ │  02:30:00                  │
│  └────┘  像沙子一样流走...          │
│                                     │
│  ▓▓▓▓▓▓▓▓░░░░░░░░░░░░  15%        │
└─────────────────────────────────────┘

五、核心功能实现

5.1 计时功能

void _startTimer() {
  setState(() {
    _isTimerRunning = true;
    _timerStartTime = DateTime.now();
    _elapsedTime = Duration.zero;
  });

  _timer = Timer.periodic(const Duration(seconds: 1), (timer) {
    if (mounted) {
      setState(() {
        _elapsedTime = DateTime.now().difference(_timerStartTime!);
      });
    }
  });
}

void _stopTimer() {
  _timer?.cancel();
  
  final session = TimeSession(
    id: DateTime.now().millisecondsSinceEpoch.toString(),
    startTime: _timerStartTime!,
    endTime: DateTime.now(),
    duration: _elapsedTime,
    category: _selectedCategory,
    perceivedSpeed: _selectedSpeed,
  );

  setState(() {
    _sessions.insert(0, session);
    _isTimerRunning = false;
  });
}

5.2 沙漏绘制

class HourglassPainter extends CustomPainter {
  final double sandProgress;
  final Color color;

  
  void paint(Canvas canvas, Size size) {
    // 绘制玻璃外框
    final glassPaint = Paint()
      ..color = Colors.brown.withValues(alpha: 0.3)
      ..style = PaintingStyle.stroke
      ..strokeWidth = 3;
    
    final path = Path();
    path.moveTo(0, 0);
    path.lineTo(size.width, 0);
    path.lineTo(size.width / 2, size.height / 2);
    path.lineTo(size.width, size.height);
    path.lineTo(0, size.height);
    path.lineTo(size.width / 2, size.height / 2);
    path.close();
    canvas.drawPath(path, glassPaint);

    // 绘制上层沙子(递减)
    final topSandHeight = (size.height / 2) * (1 - sandProgress);
    // 绘制下层沙子(递增)
    final bottomSandHeight = (size.height / 2) * sandProgress;
    // 绘制沙子流
    canvas.drawLine(
      Offset(size.width / 2, size.height / 2 - 10),
      Offset(size.width / 2, size.height / 2 + 10),
      sandStreamPaint,
    );
  }
}

5.3 翻转沙漏

void _flipHourglass() {
  _hourglassRotationController.forward().then((_) {
    _hourglassRotationController.reset();
  });
  
  setState(() {
    _elapsedTime = Duration.zero;
  });
}

5.4 统计计算

Widget _buildWastedTimeCard() {
  var totalDuration = Duration.zero;
  var wastedDuration = Duration.zero;

  for (var session in _sessions) {
    totalDuration += session.duration;
    if (session.category == TimeCategory.wasted) {
      wastedDuration += session.duration;
    }
  }

  final wastedPercentage = totalDuration.inSeconds > 0
      ? (wastedDuration.inSeconds / totalDuration.inSeconds * 100)
      : 0.0;

  return Card(
    child: Column(
      children: [
        Text('浪费的时间'),
        Text(_formatDuration(wastedDuration)),
        Text('像沙子一样流走...'),
        LinearProgressIndicator(value: wastedPercentage / 100),
      ],
    ),
  );
}

六、交互设计

6.1 计时流程

数据层 Timer 沙漏页面 用户 数据层 Timer 沙漏页面 用户 loop [每秒更新] 点击开始计时 启动定时器 显示计时动画 更新时间 更新沙漏动画 点击停止计时 停止定时器 创建TimeSession 更新记录列表 显示成功提示

6.2 翻转流程

点击翻转按钮

启动旋转动画

沙漏旋转180度

重置计时器

清空已用时间

动画完成

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 核心功能 沙漏动画 统计分析 多沙漏支持 提醒功能 分享功能 云端同步 社交功能 AI分析 V1.0 基础版本 V1.1 增强版本 V1.2 进阶版本 时间沙漏应用开发计划

7.2 功能扩展建议

7.2.1 多沙漏支持

多任务管理:

  • 同时运行多个沙漏
  • 任务切换
  • 时间分配
  • 效率对比
7.2.2 提醒功能

智能提醒:

  • 时间提醒
  • 效率提醒
  • 休息提醒
  • 自定义提醒
7.2.3 社交功能

分享交流:

  • 时间分享
  • 效率挑战
  • 社区展示
  • 排行榜

八、注意事项

8.1 开发注意事项

  1. Timer管理:Timer需要在dispose时取消,避免内存泄漏

  2. 动画释放:AnimationController需要在dispose时释放

  3. 数据持久化:记录数据需要本地存储

  4. 性能优化:沙漏动画需要优化性能

  5. 用户体验:计时流程要简洁流畅

8.2 常见问题

问题 原因 解决方案
计时不准确 Timer精度问题 使用DateTime计算
动画卡顿 Controller未释放 在dispose中释放
沙漏显示错误 进度计算错误 检查进度范围0-1
统计不准确 数据未更新 刷新统计数据

8.3 设计理念

⏳ 时间沙漏理念 ⏳

时间像沙子一样,
从指缝间悄然流逝。

沙漏中的每一粒沙子,
都代表时间的流逝。

当沙子从上层流向下层,
我们看到的不仅是时间的消耗,
更是生命的流逝。

通过记录和分析,
我们清晰地看到:
哪些时间被高效利用,
哪些时间像沙子一样白白流走。

珍惜时间,
就是珍惜生命。

时间像沙子一样流走,可视化浪费的时间


九、运行说明

9.1 环境要求

环境 版本要求
Flutter SDK >= 3.0.0
Dart SDK >= 2.17.0
鸿蒙OS API 21+

9.2 运行命令

# 查看可用设备
flutter devices

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

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

# 运行到Windows
flutter run -d windows -t lib/main_time_hourglass.dart

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

十、总结

时间沙漏通过沙漏计时、时间记录、统计分析三大模块,为用户提供了一个独特的时间管理平台。应用将时间具象化为沙子,通过可视化的方式展示时间的流逝,帮助用户直观感受时间的珍贵与不可逆。

核心功能涵盖沙漏计时、时间分类、流逝速度、时间记录、统计分析五大模块。沙漏计时通过动画和Timer实现可视化时间流逝;时间分类提供6种时间类型供选择;流逝速度支持4种感知速度;时间记录完整保存每次计时;统计分析通过图表展示时间使用情况。

应用采用Material Design 3设计规范,以沙漏色为主色调,象征时间的流逝。通过本应用,希望能够帮助用户珍惜时间,高效利用每一分每一秒。

**时间像沙子一样流走,可视化浪费的时间
Logo

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

更多推荐