步数换算器应用


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

一、项目概述

运行效果图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.1 应用简介

步数换算器是一款将日常步数转化为有趣地理概念的健康应用。核心创意在于把抽象的数字"步数"换算成用户能够感知的具体地点,让运动目标更加生动有趣。当你走完10000步时,应用会告诉你:这相当于绕故宫一圈,或者从外滩走到南京路!

应用内置12个中国著名地标,涵盖北京故宫、杭州西湖、上海外滩、厦门鼓浪屿等知名景点。通过智能匹配算法,根据用户输入的步数,展示可达或接近的地标,并计算完成进度。同时提供热量消耗、减碳量等健康数据,让用户在运动中获得更多成就感。

1.2 核心功能

功能模块 功能描述 实现方式
步数输入 手动输入或快捷选择 TextField + ActionChip
距离换算 步数转公里/米 步幅系数计算
地标匹配 智能匹配可达地标 进度排序算法
健康数据 热量、减碳计算 固定系数换算
地标库 12个著名地标展示 列表卡片展示
成就系统 5个解锁成就 进度追踪

1.3 地标列表

地标名称 所在地 距离 特色
故宫博物院 北京 3.0 km 红墙黄瓦皇家建筑
西湖环湖 杭州 10.5 km 断桥苏堤白堤
长城八达岭 北京 12.0 km 明长城精华段
外滩滨江 上海 2.5 km 万国建筑博览群
鼓浪屿环岛 厦门 6.0 km 文艺海岛风情
天安门广场 北京 0.8 km 世界最大城市广场
奥林匹克公园 北京 5.0 km 鸟巢水立方
大理古城 云南 4.0 km 白族文化古城
马拉松全程 任意 42.195 km 跑者终极挑战
珠峰高度 西藏 8.848 km 世界最高峰高度
南京城墙 南京 35.0 km 世界最长古城墙
长江大桥 武汉 1.6 km 万里长江第一桥

1.4 技术栈

技术领域 技术选型 版本要求
开发框架 Flutter >= 3.0.0
编程语言 Dart >= 2.17.0
设计规范 Material Design 3 -
状态管理 setState -
目标平台 鸿蒙OS API 21+

1.5 项目结构

lib/
└── main_steps_converter.dart
    ├── StepsConverterApp       # 应用入口
    ├── MainScreen              # 主屏幕(底部导航)
    ├── ConverterPage           # 换算页面
    ├── LandmarksPage           # 地标库页面
    ├── AchievementsPage        # 成就页面
    ├── SettingsPage            # 设置页面
    ├── LandmarkCard            # 地标卡片组件
    ├── LandmarkDetailSheet     # 地标详情面板
    ├── Landmark                # 地标数据模型
    ├── LandmarkMatch           # 匹配结果模型
    ├── LandmarkDatabase        # 地标数据库
    └── Achievement             # 成就模型

二、系统架构

2.1 整体架构图

Data Layer

Business Logic

Presentation Layer

主页面

换算Tab

地标Tab

成就Tab

设置Tab

详情弹窗

地标详情

进度展示

步数输入

快捷选择

结果展示

距离换算
_distanceKm

地标匹配
findMatches

健康计算
calories/carbon

Landmark
地标模型

LandmarkMatch
匹配结果

LandmarkDatabase
地标数据

Achievement
成就模型

2.2 类图设计

contains

contains

uses

stores

creates

references

StepsConverterApp

+Widget build()

Landmark

+String name

+String location

+double distanceKm

+IconData icon

+String description

+List<String> tags

LandmarkMatch

+Landmark landmark

+double progress

LandmarkDatabase

-List<Landmark> _landmarks

+List<Landmark> allLandmarks

+findMatches(distanceKm) : List<LandmarkMatch>

Achievement

+String id

+String title

+String description

+IconData icon

+double target

+String unit

+double current

+bool isUnlocked

+double progress

ConverterPage

-TextEditingController _stepsController

-int _steps

-double _strideLength

-List<LandmarkMatch> _matchedLandmarks

+double _distanceKm

+double _calories

+double _carbonSaved

+Widget build()

-_calculateMatches()

-_updateSteps(value)

MainScreen

2.3 换算流程

LandmarkDatabase ConverterPage 用户 LandmarkDatabase ConverterPage 用户 alt [进度 >= 30%] loop [遍历所有地标] 输入步数 计算距离 = 步数 × 步幅 计算热量 = 步数 × 0.04 计算减碳 = 步数 × 0.0002 findMatches(距离) 计算进度 = 距离 / 地标距离 加入匹配列表 按进度排序 返回前5个匹配 展示地标卡片

三、核心模块设计

3.1 数据模型设计

3.1.1 地标模型 (Landmark)
class Landmark {
  final String name;           // 地标名称
  final String location;       // 所在地
  final double distanceKm;     // 距离(公里)
  final IconData icon;         // 图标
  final String description;    // 详细描述
  final List<String> tags;     // 标签
}
3.1.2 匹配结果模型 (LandmarkMatch)
class LandmarkMatch {
  final Landmark landmark;     // 地标信息
  final double progress;       // 完成进度(0-1+)
}
3.1.3 成就模型 (Achievement)
class Achievement {
  final String id;             // 唯一标识
  final String title;          // 成就名称
  final String description;    // 成就描述
  final IconData icon;         // 成就图标
  final double target;         // 目标值
  final String unit;           // 单位
  final double current;        // 当前进度
  final bool isUnlocked;       // 是否解锁
  
  double get progress => (current / target).clamp(0.0, 1.0);
}

3.2 地标数据库

3.2.1 数据结构
class LandmarkDatabase {
  static final List<Landmark> _landmarks = [
    Landmark(
      name: '故宫博物院',
      location: '北京',
      distanceKm: 3.0,
      icon: Icons.account_balance,
      description: '故宫是世界上现存规模最大...',
      tags: ['文化', '历史', '北京'],
    ),
    // ... 更多地标
  ];
}
3.2.2 匹配算法
static List<LandmarkMatch> findMatches(double distanceKm) {
  final matches = <LandmarkMatch>[];
  
  for (final landmark in _landmarks) {
    final progress = distanceKm / landmark.distanceKm;
    // 只匹配进度 >= 30% 的地标
    if (progress >= 0.3) {
      matches.add(LandmarkMatch(
        landmark: landmark,
        progress: progress,
      ));
    }
  }
  
  // 排序:可达的在前,按进度降序
  matches.sort((a, b) {
    final aReached = a.progress >= 1.0 ? 0 : 1;
    final bReached = b.progress >= 1.0 ? 0 : 1;
    if (aReached != bReached) return aReached - bReached;
    return b.progress.compareTo(a.progress);
  });
  
  // 返回前5个
  return matches.take(5).toList();
}

3.3 换算计算

3.3.1 距离换算
double get _distanceKm => _steps * _strideLength / 1000;
double get _distanceM => _steps * _strideLength;
3.3.2 健康数据计算
// 热量消耗(约0.04 kcal/步)
double get _calories => _steps * 0.04;

// 减碳量(约0.0002 kg/步,相比开车)
double get _carbonSaved => _steps * 0.0002;

3.4 快捷选择器

final List<int> _quickSteps = [1000, 5000, 8000, 10000, 15000, 20000];

Wrap(
  spacing: 8,
  runSpacing: 8,
  children: _quickSteps.map((step) {
    return ActionChip(
      label: Text('$step 步'),
      onPressed: () => _updateSteps(step),
    );
  }).toList(),
)

四、UI设计规范

4.1 配色方案

应用采用浅色主题配合绿色主色调,营造健康活力的氛围:

颜色类型 色值 用途
主色 #4CAF50 AppBar、强调、按钮
背景色 #FFFFFF 纯白背景
表面色 #F5F5F5 浅灰卡片背景
主容器色 #C8E6C9 浅绿选中状态
次容器色 #B2DFDB 浅青辅助色

4.2 字体规范

层级 字号 字重 用途
显示大字 displayLarge Bold 步数展示
标题大字 headlineSmall Bold 页面主标题
卡片标题 titleMedium Bold 地标名称
正文 bodyLarge Regular 描述文字
辅助文字 bodySmall Regular 标签、时间

4.3 组件规范

4.3.1 换算页面布局
┌─────────────────────────────────┐
│  ━━━━━━━━━━━━━━━━━━━━━━━━━━━    │  ← 可折叠AppBar
│        🚶 步数换算器             │
├─────────────────────────────────┤
│  输入步数                        │
│  ┌─────────────────────────┐   │
│  │ 🚶 10000            ✕ │   │  ← 输入框
│  └─────────────────────────┘   │
│                                 │
│  快捷选择                        │
│  [1000步] [5000步] [8000步]     │  ← ActionChip
│  [10000步] [15000步] [20000步]  │
│                                 │
│  ┌─────────────────────────┐   │
│  │       10000             │   │  ← 结果卡片
│  │        步                │   │
│  │  7.0km  400kcal  2kg    │   │
│  └─────────────────────────┘   │
│                                 │
│  你能走到哪里?                  │
│  ┌─────────────────────────┐   │
│  │ 🏛️ 故宫博物院    ✅可达  │   │  ← 地标卡片
│  │ 北京 · 3.0 km           │   │
│  │ ████████████████ 100%   │   │
│  └─────────────────────────┘   │
│  ┌─────────────────────────┐   │
│  │ 🌊 西湖环湖       67%   │   │
│  │ 杭州 · 10.5 km          │   │
│  │ ██████████░░░░░░░░      │   │
│  └─────────────────────────┘   │
└─────────────────────────────────┘
4.3.2 地标卡片
┌─────────────────────────────────┐
│  ┌────┐                         │
│  │ 🏛️ │ 故宫博物院      ✅可达  │
│  └────┘ 北京                    │
│  ████████████████████ 100%     │
│  距离:3.0 km    需要:4286 步   │
└─────────────────────────────────┘

4.4 交互设计

4.4.1 操作方式
操作 手势 效果
输入步数 键盘输入 实时计算换算结果
快捷选择 点击ActionChip 快速设置常用步数
查看详情 点击地标卡片 打开详情面板
查看地标库 切换Tab 浏览所有地标

五、核心功能实现

5.1 步数输入处理

void _onStepsChanged(String value) {
  final parsed = int.tryParse(value);
  if (parsed != null && parsed > 0) {
    setState(() {
      _steps = parsed;
      _calculateMatches();
    });
  }
}

void _updateSteps(int value) {
  setState(() {
    _steps = value;
    _stepsController.text = value.toString();
    _calculateMatches();
  });
}

5.2 匹配计算

void _calculateMatches() {
  final distance = _distanceKm;
  _matchedLandmarks = LandmarkDatabase.findMatches(distance);
}

5.3 详情面板

showModalBottomSheet(
  context: context,
  isScrollControlled: true,
  backgroundColor: Colors.transparent,
  builder: (context) => DraggableScrollableSheet(
    initialChildSize: 0.7,
    minChildSize: 0.5,
    maxChildSize: 0.9,
    builder: (context, scrollController) {
      return LandmarkDetailSheet(
        match: match,
        steps: _steps,
        distanceKm: _distanceKm,
        scrollController: scrollController,
      );
    },
  ),
);

六、健康知识拓展

6.1 步行健康益处

步行运动

心血管健康

体重管理

骨骼强健

心理健康

免疫力提升

6.2 每日步数建议

人群 建议步数 说明
久坐人群 5000-7000 基础活动量
普通成年人 8000-10000 维持健康
活跃人群 12000-15000 增强体质
减重人群 15000+ 配合饮食控制

6.3 步幅参考值

身高范围 平均步幅 每公里步数
150-160 cm 0.6 m 约1667步
160-170 cm 0.65 m 约1538步
170-180 cm 0.7 m 约1429步
180-190 cm 0.75 m 约1333步

6.4 热量消耗参考

步行热量消耗

速度因素

体重因素

地形因素

慢走 2-3km/h

快走 5-6km/h

体重越重消耗越多

平地消耗较少

上坡消耗更多


七、扩展功能规划

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 2024-03-31 步数输入功能 距离换算功能 地标匹配功能 成就系统功能 计步器集成 历史记录功能 自定义地标 社交分享功能 地图可视化 健康数据同步 V1.0 基础版本 V1.1 增强版本 V1.2 进阶版本 步数换算器开发计划

7.2 功能扩展建议

7.2.1 计步器集成
功能 说明
系统计步器 读取手机内置计步数据
实时同步 自动同步每日步数
后台运行 支持后台计步
7.2.2 社交功能
功能 说明
成就分享 分享解锁的成就
排行榜 好友步数排名
挑战赛 发起步行挑战
7.2.3 地图可视化
功能 说明
路线规划 规划步行路线
虚拟旅行 沿地标虚拟行走
AR导航 增强现实导航

八、注意事项

8.1 开发注意事项

  1. 数值校验:步数输入需要校验为正整数

  2. 进度限制:进度值需要clamp到合理范围

  3. 空状态处理:无匹配地标时显示引导提示

  4. 精度控制:距离显示保留2位小数

  5. 性能优化:地标匹配算法限制返回数量

8.2 用户体验优化

✨ 用户体验建议 ✨

  • 快捷选择覆盖常用步数场景
  • 进度条颜色区分可达/未达状态
  • 详情面板展示完整地标信息
  • 成就系统增加持续动力

8.3 常见问题

问题 原因 解决方案
步数输入无效 非数字字符 使用数字键盘
匹配结果为空 步数太少 提示增加步数
进度超过100% 步数超过目标 正常显示超额完成
热量计算不准 系数固定 后续支持个性化设置

九、运行说明

9.1 环境要求

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

9.2 运行命令

# 查看可用设备
flutter devices

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

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

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

十、总结

步数换算器应用通过将抽象的步数转化为具体的地理概念,让运动目标更加生动有趣。应用内置12个中国著名地标,涵盖故宫、西湖、长城、外滩等知名景点,用户输入步数后即可看到自己能"走到"哪些地方。

应用采用浅色主题配合绿色主色调,营造健康活力的氛围。换算页面实时计算距离、热量消耗和减碳量,通过智能匹配算法展示可达或接近的地标,并用进度条直观展示完成程度。地标详情面板提供完整的景点介绍和步行数据。

成就系统设计了5个解锁成就,从初学者到环球旅行家,激励用户持续运动。地标库页面展示所有地标信息,方便用户浏览和了解。应用采用Material Design 3设计规范,遵循Flutter最佳实践,代码结构清晰,易于维护和扩展。

后续版本计划集成系统计步器、历史记录、社交分享、地图可视化等功能,为用户提供更完善的健康运动体验。

步数换算器,让每一步都有意义!

Logo

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

更多推荐