
// v1.0.6 播放列表 - 使用List组件支持滚动List({ space: 8, scroller: this.scroller }) {ForEach(this.audioList, (item: AudioFile, index: number) => {ListItem() {// 每首歌曲的展示行Row({ space: 15 }) {// 左侧:播放状态图标// 中间:歌曲信息// 右侧:时长显示}.onDoubleClick(() => {this.playAudioByIndex(index); // 双击播放!})}})}.height(180) // 固定高度.scrollBar(BarState.Auto) // 自动滚动条
// v1.0.6 音频文件信息接口interfaceAudioFile {id: string; // 唯一标识name: string; // 显示名称(用户看到的)fileName: string; // 实际文件名(rawfile中的)duration?: number; // 时长(秒)- 可选字段}
// v1.0.6 播放列表相关状态@State audioList: AudioFile[] = [{ id: '1', name: '将进酒', fileName: 'qiangjinjiu.mp4' },{ id: '2', name: '声声慢', fileName: 'shengshengman.m4a' },{ id: '3', name: '苟活', fileName: 'gouhuo.mp3' },{ id: '4', name: '簪花入梦', fileName: 'zanhuarumeng.mp3' },{ id: '5', name: '踢踏舞', fileName: 'tita.mp3' },{ id: '6', name: '李白', fileName: 'libai.mp3' },{ id: '7', name: '新年好', fileName: 'xnh.mp3' },{ id: '8', name: '大海啊故乡', fileName: 'dahai.m4a' }];
文件格式支持:列表中包含了多种音频格式(.mp4、.m4a、.mp3),鸿蒙AVPlayer支持这些常见格式
文件存放位置:务必确保这些文件都放置在项目的resources/rawfile/目录下
文件名一致:fileName字段必须与实际文件名完全一致,包括大小写
文件大小:实际音频文件大小可能不同,需注意存储空间
播放顺序:列表顺序决定界面默认显示顺序
ID唯一性:每个音频文件的id需保持唯一,便于列表项识别和更新
这个列表包含古典诗词、现代歌曲等多种风格的音频,可以很好地展示播放器的功能多样性。
List({space: 8 // 列表项间距}) {// 列表内容区}
ForEach(this.audioList, (item: AudioFile, index: number) => {ListItem() {// 每个列表项的UI}}, (item: AudioFile) => item.id) // 关键:唯一key
重要提示:ForEach的第三个参数是key生成函数,必须提供!用于识别哪些项需要重新渲染,可以极大提升性能。
每个列表项包括一个标记该视频文件是否处于播放状态的图标,歌曲名称,播放状态,播放时长(可选)。
Row({ space: 15 }) {// 1. 状态图标(播放中/普通)Image(this.currentAudioIndex === index &&this.playerState === PlayerState.PLAYING ?$r('app.media.playing_icon') :$r('app.media.music_icon'))// 2. 歌曲信息(用Column纵向布局)Column({ space: 3 }) {Text(item.name) // 歌曲名if (this.currentAudioIndex === index) {Text(this.getPlayStatusText()) // 播放状态}}.layoutWeight(1) // 关键:占满剩余空间// 3. 时长显示if (item.duration) {Text(this.formatTime(item.duration))}}.backgroundColor(this.currentAudioIndex === index ? '#F0F8FF' : '#FFFFFF')
.scrollBar(BarState.Auto) // 自动显示滚动条.scrollBarColor('#409EFF') // 滚动条颜色.edgeEffect(EdgeEffect.Spring) // 滚动边缘效果

.onClick(() => {// 单击:选中歌曲this.currentAudioIndex = index;// 双击:播放歌曲this.playAudioByIndex(index);})

// 当前播放项高亮.backgroundColor(this.currentAudioIndex === index ?'#F0F8FF' : '#FFFFFF')// 当前播放项文字颜色.fontColor(this.currentAudioIndex === index ?'#409EFF' : '#333')
AudioFile接口 | ||
| 歌曲选择 | 只能播固定文件-》列表任意选择 |