鸿蒙开发—黑马云音乐之music页面播放音乐(下)

目录

1.暂停播放和恢复播放

2.上一首、下一首功能


1.暂停播放和恢复播放

src/main/ets/services/AvPlayerManager.ets:

export interface songItemType {
  img: string
  name: string
  author: string
  url: string
  id: string
}

//作用:负责管理播放对象的各种方法封装的
import media from '@ohos.multimedia.media'
import emitter from '@ohos.events.emitter'

//定义并导出播放对象管理类
export class AvPlayerManager {
  static avPlayer: media.AVPlayer = Object()

  //   1.0 封装初始化AvPlayer对象的方法
  // init方法将来在ets页面的aboutToAppear方法中调用
  static async init() {
    // 创建对象并且保存到全局的静态变量中
    AvPlayerManager.avPlayer = await media.createAVPlayer()

    //  监听状态的改变
    AvPlayerManager.avPlayer.on('stateChange', (state) => {
      //  查看state的状态
      console.log('mylog', '当前状态:', state)
      // 准备播放
      if (state == 'initialized') {
        AvPlayerManager.avPlayer.prepare()
      }

      // 播放
      if (state == 'prepared') {
        AvPlayerManager.avPlayer.play()
      }
    })
  }

  //  2.0 设置播放源(并且要能够实现重置)
  static async playMusic(music: songItemType) {
    console.log('mylog,播放歌曲:', music.name, 'url=', music.url)
    await AvPlayerManager.avPlayer.reset() //重置播放对象使其空闲
    AvPlayerManager.avPlayer.url = music.url //给播放对象设置播放源
  }

  // 3.0 设置暂停方法
  static async pause(){
    AvPlayerManager.avPlayer.pause()
  }

  // 4.0 设置恢复播放方法
  static async reWork(){
    AvPlayerManager.avPlayer.play()
  }

  //  5. 0负责使用emitter发送数据的
  static sendMusicData(music: songItemType) {
    /*
     * {
      img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/0.jpg',
      name: '直到世界的尽头',
      author: 'WANDS',
      url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/0.m4a',
      id: '0000'
    }
     * */
    // 注意点:emitter只能传字符串格式的数据,所以我们需要JSON.stringify(music)转成json字符串
    emitter.emit({ eventId: 0 }, { data: { item: JSON.stringify(music) } })
  }
}

方法实现如下:

// 3.0 设置暂停方法

static async pause(){

AvPlayerManager.avPlayer.pause()

}

// 4.0 设置恢复播放方法

static async reWork(){

AvPlayerManager.avPlayer.play()

}

之后的思路在播放按钮图片增加onclik属性,调用该方法就可以实现暂停和播放。

src/main/ets/pages/Index.ets:

import { FindPage } from './FindPage'
import { MimePage } from './mimePage'
import { MomentPage } from './momentPage'
import { MuiscPage } from './muiscPage'
import { RecommendPage } from './recommendPage'
import emitter from '@ohos.events.emitter'
import { AvPlayerManager } from '../services/AvPlayerManager'

@Entry
@Component
struct Index {
  @State currentIndex: number = 0 //页面加载的时候就应该把第一个tab点亮
  @State img: string = ''
  @State name: string = ''
  @State author: string = ''

  aboutToAppear() {
    // 立哨兵->监听是否有消息发送过来
    emitter.on({ eventId: 0 }, (rec) => {
      console.log('mylog->', JSON.stringify(rec.data['item']))
      // rec.data['item'] -> 获取到的是music这个对象的字符串形式(JSON)
      let obj = JSON.parse(rec.data['item']) //将json字符串转成对象

      this.img = obj['img']
      this.name = obj['name']
      this.author =obj['author']
    })
  }

  @Builder
  tabBuilder(text: string, img: Resource, index: number) {

    // 三元表达式
    // 条件成立?取值1:取值2
    Column({ space: 5 }) {
      Image(img)
        .width(25)
        .borderRadius(25)
        .backgroundColor(this.currentIndex == index ? '#d2577c' : '')
        .padding(2)
        .fillColor(this.currentIndex == index ? Color.White : '#4bb0c4')

      Text(text)
        .fontColor(this.currentIndex == index ? '#d2577c' : '#4bb0c4')
    }
  }

  build() {
    Stack({ alignContent: Alignment.Bottom }) {
      //  底部导航栏
      Tabs({ barPosition: BarPosition.End }) {
        TabContent() {
          RecommendPage()
        }
        .tabBar(this.tabBuilder('推荐', $r('app.media.ic_recommend'), 0))
        .backgroundColor(Color.Black)

        TabContent() {
          FindPage()
        }
        .tabBar(this.tabBuilder('发现', $r('app.media.ic_find'), 1))
        .backgroundColor(Color.Black)

        TabContent() {
          MuiscPage()
        }
        .tabBar(this.tabBuilder('muisc', $r('app.media.ic_logo'), 2))
        .backgroundColor(Color.Black)

        TabContent() {
          MomentPage()
        }
        .tabBar(this.tabBuilder('动态', $r('app.media.ic_moment'), 3))
        .backgroundColor(Color.Black)

        TabContent() {
          MimePage()
        }
        .tabBar(this.tabBuilder('我的', $r('app.media.ic_mine'), 4))
        .backgroundColor(Color.Black)

      }
      .onChange((index: number) => {
        console.log('当前索引', index)
        this.currentIndex = index
      })
      .backgroundColor('#ff3b3b3b')

      //  播放歌曲信息后面完成
      Row() {
        Row({ space: 10 }) {
          Image(this.img)
            .height(50)

          Column() {
            Text(this.name)
              .width('100%')
              .fontColor(Color.White)

            Text(this.author)
              .width('100%')
              .fontColor(Color.White)
              .fontSize(12)
          }

        }
        .padding({ left: 10 })
        .layoutWeight(2)
        .height('100%')

        Row() {
          Image($r('app.media.ic_prev'))
            .height(25)
            .fillColor('#4bb0c4')

          /*播放按钮*/
          Image($r('app.media.ic_play'))
            .height(25)
            .fillColor('#4bb0c4')
            .onClick(()=>{
              AvPlayerManager.reWork()
            })

          // 暂停按钮
          Image($r('app.media.ic_paused'))
            .height(25)
            .fillColor('#4bb0c4')
            .onClick(()=>{
            //  对播放对象发出一个暂停的指令
              AvPlayerManager.pause()
            })

          Image($r('app.media.ic_next'))
            .height(25)
            .fillColor('#4bb0c4')
        }
        .justifyContent(FlexAlign.SpaceBetween)
        .layoutWeight(1)
        .height('100%')
      }
      .backgroundColor(Color.Black)
      .height(60)
      .margin({ bottom: 55 })

    }
    .height('100%')
    .backgroundColor(Color.Black)
  }
}

index增加代码如下:

/*播放按钮*/

Image($r('app.media.ic_play'))

.height(25)

.fillColor('#4bb0c4')

.onClick(()=>{

AvPlayerManager.reWork()

})
// 暂停按钮

Image($r('app.media.ic_paused'))

.height(25)

.fillColor('#4bb0c4')

.onClick(()=>{

// 对播放对象发出一个暂停的指令

AvPlayerManager.pause()

})

2.上一首、下一首功能

src/main/ets/services/AvPlayerManager.ets:

export interface songItemType {
  img: string
  name: string
  author: string
  url: string
  id: string
}

//作用:负责管理播放对象的各种方法封装的
import media from '@ohos.multimedia.media'
import emitter from '@ohos.events.emitter'

//定义并导出播放对象管理类
export class AvPlayerManager {
  static avPlayer: media.AVPlayer = Object()
  static index: number = 0 //表示第一首歌
  static songs: songItemType[] = [] //全局变量-》在此类所有方法里面都可以用,外部任何页面也可以调用

  //   1.0 封装初始化AvPlayer对象的方法
  // init方法将来在ets页面的aboutToAppear方法中调用
  static async init(musicList: songItemType[]) {
    // 将局部变量musicList赋值给全局变量songs
    AvPlayerManager.songs = musicList

    // 创建对象并且保存到全局的静态变量中
    AvPlayerManager.avPlayer = await media.createAVPlayer()

    //  监听状态的改变
    AvPlayerManager.avPlayer.on('stateChange', (state) => {
      //  查看state的状态
      console.log('mylog', '当前状态:', state)
      // 准备播放
      if (state == 'initialized') {
        AvPlayerManager.avPlayer.prepare()
      }

      // 播放
      if (state == 'prepared') {
        AvPlayerManager.avPlayer.play()
      }
    })
  }

  //  2.0 设置播放源(并且要能够实现重置)
  static async playMusic(music: songItemType) {
    console.log('mylog,播放歌曲:', music.name, 'url=', music.url)
    await AvPlayerManager.avPlayer.reset() //重置播放对象使其空闲
    AvPlayerManager.avPlayer.url = music.url //给播放对象设置播放源
  }

  // 3.0 设置暂停方法
  static async pause() {
    AvPlayerManager.avPlayer.pause()
  }

  // 4.0 设置恢复播放方法
  static async reWork() {
    AvPlayerManager.avPlayer.play()
  }

  // 播放下一首
  static async next() {
    // 如果当前是最后一首,应该从第一首播
    if(AvPlayerManager.index == AvPlayerManager.songs.length -1){
      AvPlayerManager.index = -1  //从第一首歌播放
    }
    // 针对索引自增1
    AvPlayerManager.index++

    //  根据新的索引号,取得数组中的最新的歌曲数据
    let music = AvPlayerManager.songs[AvPlayerManager.index]

    //   播放新歌曲
    AvPlayerManager.playMusic(music)

    //  发送消息给index.ets
    AvPlayerManager.sendMusicData(music)
  }

  // 播放上一首
  static async pre() {
    // 考虑边界问题:当index已经是0了,就不能再减1了
    if (AvPlayerManager.index == 0) {
      //  从最后一首歌播(获取到数组长度赋值给)AvPlayerManager.index
      AvPlayerManager.index = AvPlayerManager.songs.length
    }
    // 针对索引自减1
    AvPlayerManager.index--

    //  根据新的索引号,取得数组中的最新的歌曲数据
    let music = AvPlayerManager.songs[AvPlayerManager.index]

    //   播放新歌曲
    AvPlayerManager.playMusic(music)

    //  发送消息给index.ets
    AvPlayerManager.sendMusicData(music)
  }

  //  5. 0负责使用emitter发送数据的
  static sendMusicData(music: songItemType) {
    /*
     * {
      img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/0.jpg',
      name: '直到世界的尽头',
      author: 'WANDS',
      url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/0.m4a',
      id: '0000'
    }
     * */
    // 注意点:emitter只能传字符串格式的数据,所以我们需要JSON.stringify(music)转成json字符串
    emitter.emit({ eventId: 0 }, { data: { item: JSON.stringify(music) } })
  }
}

在AvPlayerManager.ets内增加

static songs: songItemType[] = []

在此类所有方法里面都可以用,外部任何页面也可以调用

static async init(musicList: songItemType[]) {

// 将局部变量musicList赋值给全局变量songs

AvPlayerManager.songs = musicList

将传来的musicList赋值给AvPlayerManager.songs,获取当前的歌曲信息。

播放下一首方法:

static async next() {

// 如果当前是最后一首,应该从第一首播

if(AvPlayerManager.index == AvPlayerManager.songs.length -1){

AvPlayerManager.index = -1 //从第一首歌播放

}

// 针对索引自增1

AvPlayerManager.index++

// 根据新的索引号,取得数组中的最新的歌曲数据

let music = AvPlayerManager.songs[AvPlayerManager.index]

// 播放新歌曲

AvPlayerManager.playMusic(music)

// 发送消息给index.ets

AvPlayerManager.sendMusicData(music)

}

播放上一首方法:

static async pre() {

// 考虑边界问题:当index已经是0了,就不能再减1了

if (AvPlayerManager.index == 0) {

// 从最后一首歌播(获取到数组长度赋值给)AvPlayerManager.index

AvPlayerManager.index = AvPlayerManager.songs.length

}

// 针对索引自减1

AvPlayerManager.index--

// 根据新的索引号,取得数组中的最新的歌曲数据

let music = AvPlayerManager.songs[AvPlayerManager.index]

// 播放新歌曲

AvPlayerManager.playMusic(music)

// 发送消息给index.ets

AvPlayerManager.sendMusicData(music)

}

src/main/ets/pages/muiscPage.ets:

import { AvPlayerManager, songItemType } from '../services/AvPlayerManager'

@Entry
@Component
export struct MuiscPage {
  // 歌曲列表
  @State songs: songItemType[] = [
    {
      img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/0.jpg',
      name: '直到世界的尽头',
      author: 'WANDS',
      url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/0.m4a',
      id: '0000'
    },
    {
      img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/1.jpg',
      name: '画',
      author: '赵磊',
      url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/1.mp3',
      id: '0001'
    },
    {
      img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/2.jpg',
      name: 'Sweet Dreams',
      author: 'TPaul Sax / Eurythmics',
      url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/2.mp3',
      id: '0002'
    },
    {
      img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/3.jpg',
      name: '奢香夫人',
      author: '凤凰传奇',
      url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/3.m4a',
      id: '0003'
    },
    {
      img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/4.jpg',
      name: '空心',
      author: '光泽',
      url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/4.mp3',
      id: '0004'
    },
    {
      img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/5.jpg',
      name: '反转地球',
      author: '潘玮柏',
      url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/5.mp3',
      id: '0005'
    },
    {
      img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/6.jpg',
      name: 'No.9',
      author: 'T-ara',
      url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/6.m4a',
      id: '0006'
    },
    {
      img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/7.jpg',
      name: '孤独',
      author: 'G.E.M.邓紫棋',
      url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/7.m4a',
      id: '0007'
    },

    {
      img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/8.jpg',
      name: 'Lose Control',
      author: 'Hedley',
      url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/8.m4a',
      id: '0008'
    },
    {
      img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/9.jpg',
      name: '倩女幽魂',
      author: '张国荣',
      url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/9.m4a',
      id: '0009'
    },
    {
      img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/10.jpg',
      name: '北京北京',
      author: '汪峰',
      url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/10.m4a',
      id: '0010'
    },
    {
      img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/11.jpg',
      name: '苦笑',
      author: '汪苏泷',
      url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/11.mp3',
      id: '0011'
    },
    {
      img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/12.jpg',
      name: '一生所爱',
      author: '卢冠廷 / 莫文蔚',
      url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/12.m4a',
      id: '0012'
    },
    {
      img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/13.jpg',
      name: '月半小夜曲',
      author: '李克勤',
      url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/13.mp3',
      id: '0013'
    },
    {
      img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/14.jpg',
      name: 'Rolling in the Deep',
      author: 'Adele',
      url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/14.m4a',
      id: '0014'
    },
    {
      img: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/15.jpg',
      name: '海阔天空',
      author: 'Beyond',
      url: 'http://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/15.m4a',
      id: '0015'
    }
  ]

  async aboutToAppear() {
    await AvPlayerManager.init(this.songs)
  }

  build() {
    Column() {
      // 信息区域
      Column({ space: 40 }) {
        // 喜欢的音乐
        Row({ space: 10 }) {
          Column() {
            Image($r('app.media.ic_favorite'))
              .width(80)
              .fillColor('#ff5286')
          }
          .justifyContent(FlexAlign.Center)
          .width(100)
          .height(100)
          .backgroundColor(Color.White)
          .borderRadius(10)

          // 文字信息
          Column({ space: 10 }) {
            Text('我喜欢的音乐')
              .fontColor(Color.White)
              .width('100%')
              .fontWeight(700)

            Text('黑马程序员')
              .fontColor('#ffb7b8ba')
              .width('100%')
              .fontSize(12)
          }
        }
        .width('100%')
        // 三个按钮
        Row() {
          Button({ type: ButtonType.Normal }) {
            Row({ space: 10 }) {
              Image($r('app.media.ic_share'))
                .width(20)
                .fillColor('#d2577c')

              Text('分享').fontColor(Color.White)
                .fontSize(12)
            }
          }
          .backgroundColor('#ff363737')
          .width(90)
          .height(40)
          .borderRadius(20)

          Button({ type: ButtonType.Normal }) {
            Row({ space: 10 }) {
              Image($r('app.media.ic_comment'))
                .width(20)
                .fillColor('#d2577c')

              Text('评论').fontColor(Color.White).fontSize(12)
            }
          }
          .backgroundColor('#ff363737')
          .width(90)
          .height(40)
          .borderRadius(20)

          Button({ type: ButtonType.Normal }) {
            Row({ space: 10 }) {
              Image($r('app.media.ic_collect'))
                .width(20)
                .fillColor('#d2577c')

              Text('收藏').fontColor(Color.White).fontSize(12)
            }
          }
          .backgroundColor('#ff363737')
          .width(90)
          .height(40)
          .borderRadius(20)

        }
        .width('100%')
        .justifyContent(FlexAlign.SpaceBetween)
      }
      .padding({ top: 30, right: 20, bottom: 30, left: 20 })
      .width('100%')
      // .backgroundColor(Color.Pink)
      .layoutWeight(1)
      .radialGradient({
        center: ['90%', '-10%'], // 设置中心点
        radius: '150%', // 设置半径
        colors: [ // 设置颜色的
          ['#5c4111', 0.2],
          [Color.Transparent, 1] //Color.Transparent表示透明色
        ]
      })

      // 播放列表
      Column() {
        // 全部播放容器
        Row({ space: 5 }) {
          Image($r('app.media.ic_play'))
            .width(15)
            .fillColor('#d2577c')
          Text('播放全部(16)')
            .fontColor(Color.White)
            .fontSize(12)
        }
        .width('100%')
        .padding(10)

        //   歌曲列表
        List() {
          ForEach(this.songs, (item: songItemType, index: number) => {
            if (index < 3) {
              // 每一首歌曲的信息布局(带图片)
              ListItem() {
                Row() {
                  // 如果是第0个,则显示黄色文字编号
                  if (index == 0) {
                    Text((index + 1).toString())
                      .fontColor(Color.Yellow)
                      .width(30)
                      .textAlign(TextAlign.Center)
                  }
                  // 如果是第1个,则显示红色文字编号
                  if (index == 1) {
                    Text((index + 1).toString())
                      .fontColor('#d2577c')
                      .width(30)
                      .textAlign(TextAlign.Center)
                  }
                  // 如果是第2个,则显示蓝色文字编号
                  if (index == 2) {
                    Text((index + 1).toString())
                      .fontColor('#0094ff')
                      .width(30)
                      .textAlign(TextAlign.Center)
                  }

                  Row({ space: 10 }) {
                    Image(item.img)
                      .width(30)
                      .borderRadius(5)
                    Column() {
                      Text(item.name)
                        .fontColor('#ff9fa0a1')
                        .fontSize(12)
                        .width('100%')

                      Text(item.author)
                        .fontColor('#ff9fa0a1')
                        .fontSize(10)
                        .width('100%')
                    }
                  }
                  .layoutWeight(1)

                  Image($r('app.media.ic_more'))
                    .fillColor(Color.White)
                    .width(15)
                }
                .width('100%')
                .padding({ top: 8, bottom: 8 })
              }
              .onClick(() => {
                //  用户点击就将此歌曲对象传入avplayerManager.playMusic()
                AvPlayerManager.playMusic(item)
                // 同步数据
                AvPlayerManager.sendMusicData(item)

                // 将用户点击的歌曲索引赋值给播放器管理者中的索引
                AvPlayerManager.index = index
              })

            } else {
              // 每一首歌曲的信息布局(不带图片)
              ListItem() {
                Row() {
                  Text((index + 1).toString())
                    .fontColor(Color.White)
                    .width(30)
                    .textAlign(TextAlign.Center)
                  Row({ space: 10 }) {
                    Column() {
                      Text(item.name)
                        .fontColor('#ff9fa0a1')
                        .fontSize(12)
                        .width('100%')

                      Text(item.author)
                        .fontColor('#ff9fa0a1')
                        .fontSize(10)
                        .width('100%')
                    }
                  }
                  .layoutWeight(1)

                  Image($r('app.media.ic_more'))
                    .fillColor(Color.White)
                    .width(15)
                }
                .width('100%')
                .padding({ top: 8, bottom: 8 })
              }
              .onClick(() => {
                //  用户点击就将此歌曲对象传入avplayerManager.playMusic()
                AvPlayerManager.playMusic(item)
                // 同步数据
                AvPlayerManager.sendMusicData(item)
                // 将用户点击的歌曲索引赋值给播放器管理者中的索引
                AvPlayerManager.index = index
              })
            }
          })

          // 增加ListItem来防止最后一个歌曲看不到的问题
          ListItem() {
            Text('已经到低了~~~~')
              .fontColor(Color.White)
              .width('100%')
              .textAlign(TextAlign.Center)
          }
          .height(60)
          .padding({ bottom: 40 })
        }

      }
      .width('100%')
      .backgroundColor('#ff333333')
      .layoutWeight(2)
      .borderRadius({ topLeft: 10, topRight: 10 })
    }
    .height('100%')
    .width('100%')
    .backgroundColor(Color.Black)
  }
}

async aboutToAppear() {

await AvPlayerManager.init(this.songs)

}

调用AvPlayerManager对象的init方法,播放歌曲。

src/main/ets/pages/Index.ets:

import { FindPage } from './FindPage'
import { MimePage } from './mimePage'
import { MomentPage } from './momentPage'
import { MuiscPage } from './muiscPage'
import { RecommendPage } from './recommendPage'
import emitter from '@ohos.events.emitter'
import { AvPlayerManager } from '../services/AvPlayerManager'

@Entry
@Component
struct Index {
  @State currentIndex: number = 0 //页面加载的时候就应该把第一个tab点亮
  @State img: string = ''
  @State name: string = ''
  @State author: string = ''
  @State isplaying: boolean = true // 这个状态变量用来控制页面的播放和暂停按钮显示的 false:表示当前暂停  true:正在播放歌曲

  aboutToAppear() {
    // 立哨兵->监听是否有消息发送过来
    emitter.on({ eventId: 0 }, (rec) => {
      console.log('mylog->', JSON.stringify(rec.data['item']))
      // rec.data['item'] -> 获取到的是music这个对象的字符串形式(JSON)
      let obj = JSON.parse(rec.data['item']) //将json字符串转成对象

      this.img = obj['img']
      this.name = obj['name']
      this.author = obj['author']
    })
  }

  @Builder
  tabBuilder(text: string, img: Resource, index: number) {

    // 三元表达式
    // 条件成立?取值1:取值2
    Column({ space: 5 }) {
      Image(img)
        .width(25)
        .borderRadius(25)
        .backgroundColor(this.currentIndex == index ? '#d2577c' : '')
        .padding(2)
        .fillColor(this.currentIndex == index ? Color.White : '#4bb0c4')

      Text(text)
        .fontColor(this.currentIndex == index ? '#d2577c' : '#4bb0c4')
    }
  }

  build() {
    Stack({ alignContent: Alignment.Bottom }) {
      //  底部导航栏
      Tabs({ barPosition: BarPosition.End }) {
        TabContent() {
          RecommendPage()
        }
        .tabBar(this.tabBuilder('推荐', $r('app.media.ic_recommend'), 0))
        .backgroundColor(Color.Black)

        TabContent() {
          FindPage()
        }
        .tabBar(this.tabBuilder('发现', $r('app.media.ic_find'), 1))
        .backgroundColor(Color.Black)

        TabContent() {
          MuiscPage()
        }
        .tabBar(this.tabBuilder('muisc', $r('app.media.ic_logo'), 2))
        .backgroundColor(Color.Black)

        TabContent() {
          MomentPage()
        }
        .tabBar(this.tabBuilder('动态', $r('app.media.ic_moment'), 3))
        .backgroundColor(Color.Black)

        TabContent() {
          MimePage()
        }
        .tabBar(this.tabBuilder('我的', $r('app.media.ic_mine'), 4))
        .backgroundColor(Color.Black)

      }
      .onChange((index: number) => {
        console.log('当前索引', index)
        this.currentIndex = index
      })
      .backgroundColor('#ff3b3b3b')

      //  播放歌曲信息后面完成
      Row() {
        Row({ space: 10 }) {
          Image(this.img)
            .height(50)

          Column() {
            Text(this.name)
              .width('100%')
              .fontColor(Color.White)

            Text(this.author)
              .width('100%')
              .fontColor(Color.White)
              .fontSize(12)
          }

        }
        .padding({ left: 10 })
        .layoutWeight(2)
        .height('100%')

        Row() {
          // 上一首
          Image($r('app.media.ic_prev'))
            .height(25)
            .fillColor('#4bb0c4')
            .onClick(()=>{
              AvPlayerManager.pre()
            })

          if (this.isplaying == false) {
            /*播放按钮*/
            Image($r('app.media.ic_play'))
              .height(25)
              .fillColor('#4bb0c4')
              .onClick(() => {
                AvPlayerManager.reWork()

                //将isplaying状态变量的值改为 true
                this.isplaying = true
              })
          }

          if (this.isplaying == true) {
            // 暂停按钮
            Image($r('app.media.ic_paused'))
              .height(25)
              .fillColor('#4bb0c4')
              .onClick(() => {
                //  对播放对象发出一个暂停的指令
                AvPlayerManager.pause()

                //  将isplaying状态变量的值改为false
                this.isplaying = false
              })
          }

          // 下一首
          Image($r('app.media.ic_next'))
            .height(25)
            .fillColor('#4bb0c4')
            .onClick(()=>{
              AvPlayerManager.next()
            })
        }
        .justifyContent(FlexAlign.SpaceBetween)
        .layoutWeight(1)
        .height('100%')
      }
      .backgroundColor(Color.Black)
      .height(60)
      .margin({ bottom: 55 })

    }
    .height('100%')
    .backgroundColor(Color.Black)
  }
}

// 上一首

Image($r('app.media.ic_prev'))

.height(25)

.fillColor('#4bb0c4')

.onClick(()=>{

AvPlayerManager.pre()

})

在index页面的播放栏的上一首按钮图片中增加属性,调用AvPlayerManager.pre(),实现上一首播放。

// 下一首

Image($r('app.media.ic_next'))

.height(25)

.fillColor('#4bb0c4')

.onClick(()=>{

AvPlayerManager.next()

})

}

同样,给播放栏的下一首按钮图片中增加属性,调用AvPlayerManager.next(),实现下一首播放。

提一嘴,Index页面使用if (this.isplaying == false)判断播放状态,实现点击播放按钮后,出现暂停按钮,点击暂停按钮后出现播放按钮。

相关推荐
- 羊羊不超越 -33 分钟前
App渠道来源追踪方案全面分析(iOS/Android/鸿蒙)
android·ios·harmonyos
长弓三石2 小时前
鸿蒙网络编程系列44-仓颉版HttpRequest上传文件示例
前端·网络·华为·harmonyos·鸿蒙
SameX4 小时前
鸿蒙 Next 电商应用安全支付与密码保护实践
前端·harmonyos
SuperHeroWu75 小时前
【HarmonyOS】键盘遮挡输入框UI布局处理
华为·harmonyos·压缩·keyboard·键盘遮挡·抬起
努力变厉害的小超超9 小时前
ArkTS中的组件基础、状态管理、样式处理、class语法以及界面渲染
笔记·鸿蒙
sanzk9 小时前
华为鸿蒙应用开发
华为·harmonyos
SoraLuna14 小时前
「Mac畅玩鸿蒙与硬件28」UI互动应用篇5 - 滑动选择器实现
macos·ui·harmonyos
ClkLog-开源埋点用户分析15 小时前
ClkLog企业版(CDP)预售开启,更有鸿蒙SDK前来助力
华为·开源·开源软件·harmonyos
mg66815 小时前
鸿蒙系统的优势 开发 环境搭建 开发小示例
华为·harmonyos
模拟IC攻城狮15 小时前
华为海思招聘-芯片与器件设计工程师-模拟芯片方向- 机试题-真题套题题目——共8套(每套四十题)
嵌入式硬件·华为·硬件架构·芯片