健身动作生成:鸿蒙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个部位×多种器械的组合:
constroutines:Record<string,Exercise[]>={'胸|徒手':[/* 5个动作 */],'胸|哑铃':[/* 5个动作 */],'背|徒手':[/* 5个动作 */],// ... 共48个动作}时长自适应算法:
lettotalMin=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 三条件联动
本应用的状态管理涉及三个独立选择维度的联动:
@StateselectedPart:string=''// 选中的训练部位@StateselectedEquipment:string=''// 选中的器械类型@StateselectedMinutes: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 训练表卡片
训练结果以卡片形式展示,每个动作独立成行,包含序号、动作名称、组数×次数、休息时间:
@BuilderbuildResultCard(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 亮点。当用户选择较短训练时长时,系统会自动裁剪动作数量以适应时间限制:
lettotalMin=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主题色),传达专业、冷静的运动氛围:
constCOLOR_BG='#EFF6FF'constCOLOR_PRIMARY='#3B82F6'constCOLOR_SELECTED_BG='#DBEAFE'6.2 清晰的训练计划展示
训练计划的展示设计体现了人体工程学的考虑:
- 圆形序号便于快速定位动作
- 组数和次数采用 tag 标签样式,一目了然
- 总时长在卡头顶部突出显示
- 每个动作独立成行,间距适中
6.3 即时数据反馈
- Slider 滑动时实时显示选中时长
- 训练生成后自动滚动到结果区域
- 重置按钮一键清空
七、总结
健身动作生成应用展示了鸿蒙 ArkTS 在健身领域的技术实力,三个核心技术亮点值得关注:
- 三条件状态联动:通过 @State 管理部位、器械、时长三个维度的选择状态
- 时长自适应算法:根据用户选择的时间动态调整训练计划
- @Builder 训练表组件:将复杂的训练数据组织成清晰的卡片式布局
未来展望:未来可以引入训练记录功能、进度追踪、动作视频演示、智能调整训练强度等功能,打造更完整的 AI 私教体验。
