「Mac畅玩鸿蒙与硬件47」UI互动应用篇24 - 虚拟音乐控制台 ...

锦通  金牌会员 | 2024-12-23 23:13:31 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 880|帖子 880|积分 2640

本篇将带你实现一个虚拟音乐控制台。用户可以通过界面控制音乐的播放、暂停、切换歌曲,并检察当前播放的歌曲信息。页面还支持调整音量和动态显示播放进度,是音乐播放器界面开辟的基础功能示例。


关键词



  • UI互动应用
  • 音乐控制
  • 播放控制
  • 动态展示
  • 状态管理
  • 按钮与进度条

一、功能说明

虚拟音乐控制台支持以下功能:

  • 播放/暂停控制:通过按钮切换播放与暂停状态。
  • 歌曲切换:点击“下一首”按钮切换到歌曲列表中的下一首。
  • 进度条动态更新:实时显示当前播放进度,播放结束后自动切换到下一首歌曲。
  • 音量调节:通过滑块调整音量,音量值实时更新在界面上。
  • 歌曲信息展示:显示当前播放的歌曲名称和状态。
  • 图片展示:在界面顶部添加一张图片,提升视觉结果。

二、所需组件



  • @Entry 和 @Component 装饰器
  • Column 和 Row 结构组件
  • Text 组件用于显示当前歌曲信息
  • Button 组件用于音乐播放控制(播放、暂停、下一首)
  • Slider 组件用于音量调节
  • Progress 组件用于动态显示播放进度
  • Image 组件用于展示示例图片
  • @State 修饰符用于状态管理

三、项目结构



  • 项目名称:VirtualMusicControl
  • 自定义组件名称:MusicControlPage
  • 代码文件:MusicControlPage.ets、Index.ets

四、代码实现

  1. // 文件名:MusicControlPage.ets
  2. @Component
  3. export struct MusicControlPage {
  4.   @State isPlaying: boolean = false; // 播放状态
  5.   @State currentSong: string = '歌曲1'; // 当前播放的歌曲
  6.   @State songList: string[] = ['歌曲1', '歌曲2', '歌曲3']; // 歌曲列表
  7.   @State songIndex: number = 0; // 当前歌曲索引
  8.   @State songProgress: number = 0; // 当前播放进度(百分比)
  9.   @State volume: number = 50; // 音量(0-100)
  10.   private intervalId: number | null = null; // 定时器 ID
  11.   // 切换到下一首歌曲
  12.   nextSong(): void {
  13.     this.songIndex = (this.songIndex + 1) % this.songList.length;
  14.     this.currentSong = this.songList[this.songIndex];
  15.     this.songProgress = 0; // 播放新歌曲时重置进度条
  16.   }
  17.   // 播放/暂停切换
  18.   togglePlayPause(): void {
  19.     this.isPlaying = !this.isPlaying;
  20.     if (this.isPlaying) {
  21.       this.startTimer();
  22.     } else {
  23.       this.clearTimer();
  24.     }
  25.   }
  26.   // 更新播放进度
  27.   updateProgress(): void {
  28.     if (this.isPlaying) {
  29.       this.songProgress += 2; // 每秒增加2%
  30.       if (this.songProgress >= 100) {
  31.         this.songProgress = 0; // 播放结束时重置进度
  32.         this.nextSong(); // 自动切换到下一首
  33.       }
  34.     }
  35.   }
  36.   // 启动定时器
  37.   startTimer(): void {
  38.     if (!this.intervalId) {
  39.       this.intervalId = setInterval(() => this.updateProgress(), 1000); // 每秒更新进度
  40.     }
  41.   }
  42.   // 清理定时器
  43.   clearTimer(): void {
  44.     if (this.intervalId) {
  45.       clearInterval(this.intervalId);
  46.       this.intervalId = null;
  47.     }
  48.   }
  49.   onInit(): void {
  50.     this.startTimer(); // 页面加载时启动定时器
  51.   }
  52.   onDestroy(): void {
  53.     this.clearTimer(); // 页面销毁时清理定时器
  54.   }
  55.   build(): void {
  56.     Column({ space: 20 }) {
  57.       // 添加图片
  58.       Image($r('app.media.cat')) // 添加一张图片
  59.         .width(158)
  60.         .height(188);
  61.       Text('虚拟音乐控制台')
  62.         .fontSize(24)
  63.         .fontWeight(FontWeight.Bold)
  64.         .alignSelf(ItemAlign.Center);
  65.       // 显示当前歌曲信息
  66.       Text(`当前播放: ${this.currentSong}`)
  67.         .fontSize(18)
  68.         .alignSelf(ItemAlign.Center);
  69.       // 播放/暂停按钮
  70.       Button(this.isPlaying ? '暂停' : '播放')
  71.         .onClick(() => this.togglePlayPause())
  72.         .margin({ top: 10 });
  73.       // 下一首按钮
  74.       Button('下一首')
  75.         .onClick(() => this.nextSong())
  76.         .margin({ top: 10 });
  77.       // 播放进度条
  78.       Progress({
  79.         value: this.songProgress,
  80.         total: 100,
  81.         type: ProgressType.Linear,
  82.       })
  83.         .color(Color.Green)
  84.         .height(8)
  85.         .margin({ top: 10 });
  86.       // 显示音量
  87.       Text(`音量: ${this.volume}`)
  88.         .fontSize(18)
  89.         .alignSelf(ItemAlign.Center)
  90.         .margin({ top: 10 });
  91.       // 音量调节滑块
  92.       Slider({
  93.         value: this.volume,
  94.         min: 0,
  95.         max: 100,
  96.       })
  97.         .blockColor(Color.Blue)
  98.         .trackColor(Color.Gray)
  99.         .onChange((value: number) => (this.volume = value));
  100.     }
  101.     .padding(20)
  102.     .width('100%')
  103.     .height('100%');
  104.   }
  105. }
复制代码
  1. // 文件名:Index.ets
  2. import { MusicControlPage } from './MusicControlPage';
  3. @Entry
  4. @Component
  5. struct Index {
  6.   build() {
  7.     Column() {
  8.       MusicControlPage() // 调用虚拟音乐控制台页面
  9.     }
  10.     .padding(20)
  11.   }
  12. }
复制代码
  结果示例:用户可以通过播放/暂停按钮控制音乐的播放,通过下一首按钮切换歌曲,进度条展示当前播放进度。界面顶部还显示了一张图片,加强了视觉结果。
  

  
五、代码解读


  • 图片展示

    • 使用 Image 组件加载图片,放置在界面顶部,宽度 158px,高度 188px。

  • 播放控制

    • togglePlayPause() 切换播放和暂停状态,同时启动或清理定时器。

  • 歌曲切换

    • nextSong() 切换歌曲,重置播放进度,支持循环播放。

  • 动态进度条

    • Progress 组件绑定 songProgress,实时更新播放进度。

  • 音量调节

    • Slider 实现音量调节,用户拖动滑块实时调整音量值。

  • 状态管理

    • 使用 @State 管理播放状态、歌曲信息和音量,实现界面与功能的实时同步。


六、优化建议


  • 增加“上一首”按钮,支持更多的播放控制功能。
  • 添加播放列表展示,允许用户选择播放的歌曲。
  • 通事后端支持真实音频播放,扩展实际应用场景。

七、结果展示



  • 图片展示:顶部显示一张图片,增加视觉元素。
  • 播放控制:用户通过按钮控制播放、暂停和切换歌曲。
  • 动态进度条:实时更新歌曲播放进度。
  • 音量调节:滑块调整音量,实时更新界面显示。

八、干系知识点



  • 「Mac畅玩鸿蒙与硬件15」鸿蒙UI组件篇5 - Slider和Progress组件
  • 「Mac畅玩鸿蒙与硬件11」鸿蒙UI组件篇1 - Text和Button组件详解

小结

通过本篇教程,用户学会了构建一个交互式的虚拟音乐控制台,包括播放控制、动态进度条更新和音量调节功能,展示了鸿蒙 UI 组件的组合使用。

下一篇预告

在下一篇「UI互动应用篇25 - 浅易购物车功能实现」中,我们将探讨如何实现一个浅易购物车功能,支持商品的添加、移除和总价计算。

上一篇: 「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预告组件

下一篇: 「Mac畅玩鸿蒙与硬件48」UI互动应用篇25 - 浅易购物车功能实现


作者:SoraLuna
链接:https://www.nutpi.net/thread?topicId=503
來源:坚果派
著作权归作者所有。贸易转载请联系作者得到授权,非贸易转载请注明出处。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

锦通

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表