步数换算器应用


欢迎加入开源鸿蒙跨平台社区:
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-
目标平台鸿蒙OSAPI 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 换算流程

LandmarkDatabaseConverterPage用户LandmarkDatabaseConverterPage用户alt[进度 >=30%]loop[遍历所有地标]输入步数计算距离 = 步数 × 步幅计算热量 = 步数 × 0.04计算减碳 = 步数 × 0.0002findMatches(距离)计算进度 = 距离 / 地标距离加入匹配列表按进度排序返回前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 配色方案

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

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

4.2 字体规范

层级字号字重用途
显示大字displayLargeBold步数展示
标题大字headlineSmallBold页面主标题
卡片标题titleMediumBold地标名称
正文bodyLargeRegular描述文字
辅助文字bodySmallRegular标签、时间

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 cm0.6 m约1667步
160-170 cm0.65 m约1538步
170-180 cm0.7 m约1429步
180-190 cm0.75 m约1333步

6.4 热量消耗参考

步行热量消耗

速度因素

体重因素

地形因素

慢走 2-3km/h

快走 5-6km/h

体重越重消耗越多

平地消耗较少

上坡消耗更多


七、扩展功能规划

7.1 后续版本规划

2024-01-072024-01-142024-01-212024-01-282024-02-042024-02-112024-02-182024-02-252024-03-032024-03-102024-03-172024-03-242024-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
鸿蒙OSAPI 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最佳实践,代码结构清晰,易于维护和扩展。

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

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

更多推荐