健身动作生成:鸿蒙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       // 选中的训练时长

条件联动的关键逻辑

  1. 按钮显隐控制:当部位和器械都选中时,显示"生成训练计划"按钮
  2. 结果生成:三个状态共同作为参数传递给 Service 层
  3. 重置功能:一键清空所有选择状态
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
}

算法逻辑

  1. 先根据部位和器械获取完整的动作列表(通常5个动作)
  2. 估算每个动作耗时约4分钟(含组间休息)
  3. 如果用户选择时长短于总时长,按比例裁剪动作数量
  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 在健身领域的技术实力,三个核心技术亮点值得关注:

  1. 三条件状态联动:通过 @State 管理部位、器械、时长三个维度的选择状态
  2. 时长自适应算法:根据用户选择的时间动态调整训练计划
  3. @Builder 训练表组件:将复杂的训练数据组织成清晰的卡片式布局

未来展望:未来可以引入训练记录功能、进度追踪、动作视频演示、智能调整训练强度等功能,打造更完整的 AI 私教体验。

Logo

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

更多推荐