本文将带你使用鸿蒙Next的最新API,手把手开发一个完整的音乐播放器应用。包括播放控制、进度条拖动、旋转动画封面图等功能,并详细讲解每一部分的实现原理。

一、技术栈与开发环境

  • 操作系统:HarmonyOS Next

  • 语言:TypeScript(ArkTS)

  • 框架:声明式UI开发框架(Stage模型)

  • 能力模块@kit.MediaKit(用于多媒体播放)

  • 组件特性@Component, @State, @Entry 装饰器


二、功能预览

本播放器主要功能包括:

  • 在线音乐播放(AVPlayer)

  • 封面旋转动画

  • 实时显示播放时间和总时长

  • 进度条拖动调整播放位置

  • 上一首 / 下一首控制

  • 状态感知与自动重载播放


三、项目结构与数据准备

1. 数据准备 arrMusic

export const arrMusic = [
  {
    title: "海阔天空",
    author: "Beyond",
    musicUrl: "https://example.com/music1.mp3",
    imageUrl: "https://example.com/img1.jpg"
  },
  {
    title: "晴天",
    author: "周杰伦",
    musicUrl: "https://example.com/music2.mp3",
    imageUrl: "https://example.com/img2.jpg"
  }
];

这是一个模拟的数据源,包含了歌曲名称、作者、封面、播放地址。


四、播放核心逻辑详解

我们使用 @kit.MediaKit 提供的 media.createAVPlayer() 接口创建播放器对象,并通过生命周期 aboutToAppear() 加载音乐资源:

1. 创建与初始化播放器

this.avPlayer = await media.createAVPlayer();

一旦播放器创建完成,我们需要监听其生命周期状态:

this.avPlayer.on('stateChange', (state, reason) => {
  this.strState = state;
  switch (state) {
    case 'initialized':
      this.avPlayer?.prepare();
      break;
    case 'prepared':
      this.avPlayer?.play();
      break;
    case 'completed':
      this.avPlayer?.stop();
      break;
    case 'released':
      this.loadAvPlayer(url);
      break;
  }
});

2. 设置播放资源路径

this.avPlayer.url = arrMusic[this.index].musicUrl;

注意:此URL必须是可被鸿蒙设备访问的资源地址,建议使用 HTTPS 在线链接或本地文件路径。


五、时间进度与监听事件

1. 获取总时长 & 当前播放时间

this.avPlayer.on('durationUpdate', duration => {
  this.duration = duration;
});

this.avPlayer.on('timeUpdate', current => {
  this.current = current;
});

通过 durationUpdatetimeUpdate 事件,我们可以实现播放时间的实时更新和 UI 显示。

2. 下载缓冲监听

this.avPlayer.on('bufferingUpdate', num => {
  console.log(num == 4 ? '下载完成' : '下载中');
});

当缓存状态为 4 时,表示下载完成,可以优化播放体验。


六、旋转动画封面实现

封面图旋转使用 rotate() 属性,并结合定时器更新角度:

setInterval(() => {
  this.intNum += 25;
}, 900);

Image(arrMusic[this.index].imageUrl)
  .height(200)
  .width(200)
  .borderRadius(100)
  .rotate({ angle: this.intNum })

动画每900ms旋转25度,形成动感唱片效果。


七、播放控制逻辑

1. 上一首 / 下一首切换逻辑

.onClick(() => {
  this.avPlayer?.reset();
  if (this.index > 0) {
    this.index--;
    this.loadAvPlayer(arrMusic[this.index].musicUrl);
  }
})

2. 播放 / 暂停控制

.onClick(() => {
  if (this.avPlayer?.state == 'playing') {
    this.avPlayer?.pause();
  } else {
    this.avPlayer?.play();
  }
})

3. 拖动进度条实现快进 / 快退

Slider({
  value: this.current,
  max: this.duration
}).onChange(val => {
  this.avPlayer?.seek(val);
});

通过 seek() 方法可以跳转播放位置,单位为毫秒。


八、完整UI构建

通过鸿蒙Next声明式UI语法(类似于React JSX),构建清晰组件层级:

Column({ space: 20 }) {
  Stack() {
    // 封面图、旋转动画
  }
  Column() {
    // 歌曲标题 + 作者
  }
  Slider() {
    // 播放进度条
  }
  Row() {
    // 当前时间 + 总时长显示
  }
  Row() {
    // 播放按钮集合
  }
}

样式细节:

  • justifyContent(FlexAlign.SpaceBetween):两端对齐

  • borderRadius(100):封面图圆形

  • .fontSize(18).fontWeight(700):高亮当前歌曲标题


九、常见问题与建议

问题 建议
播放失败 检查资源链接是否可访问
没有声音 确保设备音量开启,并未被其他App占用
状态不切换 使用release()后需重新loadAvPlayer加载资源
UI卡顿 避免主线程执行复杂逻辑或高频DOM更新

十、结语

通过本文的示例,你已经掌握了在 HarmonyOS Next 下如何构建一个结构清晰、功能完善的音乐播放器。鸿蒙声明式开发模型下,UI与逻辑清晰解耦,AVPlayer 提供的状态监听与控制机制也极其强大。

下一步,你可以尝试添加歌词显示、播放模式(循环/随机)、后台播放控制等进阶功能。

如需了解更多鸿蒙Next的能力与组件,可以参考官网文档:

👉 HarmonyOS Next 开发者文档

代码仓库:U7Music: 用于实现音频播放器

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐