健身动作生成:鸿蒙AI应用开发实战——AI私教,科学训练不迷茫
健身动作生成:鸿蒙AI应用开发实战——AI私教,科学训练不迷茫
一、引言
健身新手走进健身房,面对琳琅满目的器械常常不知从何下手:今天练什么部位?做多少个?休息多久?总时长多少?这些问题如果没有科学的规划,不仅训练效果大打折扣,还容易导致运动损伤。
健身动作生成 正是为了解决这一痛点而诞生的鸿蒙AI应用。用户只需选择训练部位(胸/背/腿/肩/核心/全身)、器械类型(徒手/哑铃/器械/弹力带)和训练时长(15-60分钟),AI即可自动生成一套完整的训练计划,包含具体动作、组数、次数、休息时间和总时长。
本文将从应用架构设计、鸿蒙核心技术实现、AI应用亮点等维度,深度剖析这款应用的开发全流程。

二、应用架构设计:Model-Service-Page 三层架构
2.1 架构概览
┌─────────────────────────────────────────────────────────┐
│ Page 层 (UI) │
│ WorkoutGeneratorPage.ets │
│ @State 三条件联动 / Slider / @Builder 训练表 │
├─────────────────────────────────────────────────────────┤
│ Service 层 (业务逻辑) │
│ WorkoutGeneratorService.ets │
│ 动作库管理 / 时长自适应算法 / 训练生成 │
├─────────────────────────────────────────────────────────┤
│ Model 层 (数据模型) │
│ WorkoutGeneratorModel.ets │
│ Exercise / WorkoutData / WGMessage / 常量定义 │
└─────────────────────────────────────────────────────────┘
2.2 Model 层:数据结构定义
核心数据类:
Exercise:单个训练动作,包含名称、组数、次数范围和休息时间WorkoutData:完整训练计划,包含动作列表和总时长
关键常量:
WG_PARTS:6种训练部位(胸/背/腿/肩/核心/全身)WG_EQUIPMENTS:4种器械类型(徒手/哑铃/器械/弹力带)
2.3 Service 层:训练算法
Service 层预置了48个动作库,覆盖6个部位×多种器械的组合:
const routines: Record<string, Exercise[]> = {
'胸|徒手': [/* 5个动作 */],
'胸|哑铃': [/* 5个动作 */],
'背|徒手': [/* 5个动作 */],
// ... 共48个动作
}
时长自适应算法:
let totalMin = routine.length * 4 // 每个动作约4分钟
if (minutes > 0 && minutes < totalMin) {
routine = routine.slice(0, Math.max(2, Math.floor(minutes / 4)))
totalMin = routine.length * 4
}
2.4 Page 层:UI展示
Page 层实现了训练部位、器械类型、训练时长三个维度的选择交互,以及训练计划的结果展示。
三、鸿蒙技术深度解析
3.1 @State 三条件联动
本应用的状态管理涉及三个独立选择维度的联动:
@State selectedPart: string = '' // 选中的训练部位
@State selectedEquipment: string = '' // 选中的器械类型
@State selectedMinutes: number = 30 // 选中的训练时长
条件联动的关键逻辑:
- 按钮显隐控制:当部位和器械都选中时,显示"生成训练计划"按钮
- 结果生成:三个状态共同作为参数传递给 Service 层
- 重置功能:一键清空所有选择状态
if (this.selectedPart !== '' && this.selectedEquipment !== '') {
Text('生成训练计划')
// ...
.onClick(() => { this.onGenerate() })
}
3.2 Slider 滑动选择时长
训练时长选择使用鸿蒙的 Slider 组件,支持15-60分钟范围,步进5分钟:
Slider({
value: this.selectedMinutes,
min: 15,
max: 60,
step: 5,
style: SliderStyle.InSet
})
.blockColor(COLOR_PRIMARY)
.trackColor(COLOR_BORDER)
.selectedColor(COLOR_PRIMARY)
.layoutWeight(1)
.onChange((value: number) => { this.selectedMinutes = value })
Slider 设计的要点:
- 左侧标注"15min"、右侧标注"60min",范围一目了然
- 当前值实时显示:
Text('当前:${this.selectedMinutes}分钟') step: 5提供5分钟的步进粒度,兼顾灵活性和精确性
3.3 @Builder 训练表卡片
训练结果以卡片形式展示,每个动作独立成行,包含序号、动作名称、组数×次数、休息时间:
@Builder
buildResultCard(data: WorkoutData) {
Column() {
Row() {
Text('🏋️ 训练计划')
Blank()
Text('总计 ${data.total_min} 分钟')
}
ForEach(data.routine, (exercise: Exercise, idx: number) => {
Row() {
Column() {
Text('${idx + 1}')
// 圆形序号
}
Column() {
Text(exercise.name)
Row() {
Text('${exercise.sets}组 × ${exercise.reps}次')
Text('休息 ${exercise.rest}')
}
}
}
})
}
}
卡片设计的特点:
- 圆形序号标识动作序号,视觉突出
- 组数/次数和休息时间使用标签样式(tag-style),简洁清晰
- 总时长在右上角突出显示
3.4 Scroll 滚动展示
训练计划可能包含5个以上的动作,使用 Scroll 确保所有内容可以完整展示:
if (this.currentData !== null) {
Scroll() {
Column() {
this.buildResultCard(this.currentData)
}
.padding({ bottom: 20 })
}
.layoutWeight(1)
.scrollBar(BarState.Off)
}
四、AI 应用亮点分析
4.1 48个动作库覆盖
应用内置了48个训练动作,覆盖6个训练部位和4种器械类型的组合:
胸部训练(徒手/哑铃):
- 标准俯卧撑、宽距俯卧撑、窄距俯卧撑、钻石俯卧撑
- 哑铃卧推、哑铃飞鸟、上斜哑铃卧推等
背部训练(徒手/哑铃):
- 超人式伸展、仰卧划船、鸟狗式
- 哑铃划船、单臂哑铃划船、哑铃硬拉等
腿部训练(徒手/器械):
- 深蹲、弓步蹲、臀桥、靠墙静蹲
- 杠铃深蹲、腿举、腿弯举、腿屈伸等
肩部训练(徒手/哑铃):
- 派克俯卧撑、倒立撑、YTWL徒手
- 哑铃肩推、哑铃侧平举、阿诺德推举等
核心训练(徒手):
- 卷腹、俄罗斯转体、仰卧举腿、死虫式、侧平板支撑
全身训练(弹力带):
- 弹力带深蹲、弹力带划船、弹力带推胸等
4.2 54种组合
虽然理论组合为6×4=24种,但通过时长维度的加入,实际提供了超过54种不同的训练方案:
训练部位(6) × 器械类型(4) = 24 种组合模式
每种模式 × 不同时长切片 = 丰富的变体
4.3 时长自适应算法
这是本应用最具技术含量的 AI 亮点。当用户选择较短训练时长时,系统会自动裁剪动作数量以适应时间限制:
let totalMin = routine.length * 4 // 估算总时长
if (minutes > 0 && minutes < totalMin) {
// 按比例裁剪动作数量
routine = routine.slice(0, Math.max(2, Math.floor(minutes / 4)))
totalMin = routine.length * 4
}
算法逻辑:
- 先根据部位和器械获取完整的动作列表(通常5个动作)
- 估算每个动作耗时约4分钟(含组间休息)
- 如果用户选择时长短于总时长,按比例裁剪动作数量
- 确保至少保留2个动作,保证训练的有效性
五、关键技术挑战与解决方案
5.1 挑战一:动作库的组织和扩展
挑战:48个动作需要合理的组织方式,便于维护和扩展。
解决方案:
- 采用
Record<string, Exercise[]>映射表结构 - 键为
"部位|器械"组合,值为动作数组 - 新增动作只需在对应数组末尾添加,不影响现有逻辑
- 支持兜底键(如
"${part}|徒手")确保总有可用方案
5.2 挑战二:时长与训练内容的匹配
挑战:用户选择的时长不一定与预设动作数量匹配。
解决方案:
- 每个动作的标准耗时估算为4分钟(含组间休息)
- 通过
slice方法动态裁剪动作数量 - 保留至少2个核心动作,保证训练质量
- 显示实际生成的训练总时长,让用户了解计划的时间安排
5.3 挑战三:训练数据的清晰呈现
挑战:每个动作涉及名称、组数、次数、休息时间等多个数据维度。
解决方案:
- 使用 Row 布局将动作序号和详情分列展示
- 组数/次数和休息时间使用标签样式并排显示
- 蓝色圆形序号提供清晰的视觉索引
六、用户交互体验设计
6.1 蓝色的运动主题
应用采用蓝色系配色(#EFF6FF背景、#3B82F6主题色),传达专业、冷静的运动氛围:
const COLOR_BG = '#EFF6FF'
const COLOR_PRIMARY = '#3B82F6'
const COLOR_SELECTED_BG = '#DBEAFE'
6.2 清晰的训练计划展示
训练计划的展示设计体现了人体工程学的考虑:
- 圆形序号便于快速定位动作
- 组数和次数采用 tag 标签样式,一目了然
- 总时长在卡头顶部突出显示
- 每个动作独立成行,间距适中
6.3 即时数据反馈
- Slider 滑动时实时显示选中时长
- 训练生成后自动滚动到结果区域
- 重置按钮一键清空
七、总结
健身动作生成 应用展示了鸿蒙 ArkTS 在健身领域的技术实力,三个核心技术亮点值得关注:
- 三条件状态联动:通过 @State 管理部位、器械、时长三个维度的选择状态
- 时长自适应算法:根据用户选择的时间动态调整训练计划
- @Builder 训练表组件:将复杂的训练数据组织成清晰的卡片式布局
未来展望:未来可以引入训练记录功能、进度追踪、动作视频演示、智能调整训练强度等功能,打造更完整的 AI 私教体验。
更多推荐



所有评论(0)