音乐管理者实例.onPlay(()=>{})
:监听音乐播放时的事件。
音乐管理者实例.onPause(()=>{})
:监听音乐暂停时的事件。
音乐管理者实例.onStop(()=>{})
:监听音乐停止时的事件。
onLoad(options) {
//获取事件对象
let that = this;
const eventChannel = this.getOpenerEventChannel();
eventChannel.on('song', function(data) {
that.setData({
song: data
})
});
wx.setNavigationBarTitle({
title: this.data.song.name
});
// 音乐管理者播放监听
this.backgroundAudioManager = wx.getBackgroundAudioManager();
this.backgroundAudioManager.onPlay(() => {
this.setData({
isPlay: true
})
});
// 音乐管理者暂停监听
this.backgroundAudioManager.onPause(() => {
this.setData({
isPlay: false
})
});
// 音乐管理者停止监听
this.backgroundAudioManager.onStop(() => {
this.setData({
isPlay: false
})
});
},
实现这样的功能,其实 要改动的地方 还是很多的。如果学习过 后端的话,你会感觉到这些改动 很好理解!但是如果主学 前端 做 结构界面美化啥的,那绝对是有点儿 小难度。
App.js
:是一个 小程序 全局的 js,这里面的 方法 和 数据 都是全局的!!!也就是说 如果 做 页面的 之间的 通讯 其实也可以 利用 这个 东西来做。
我们 可以 把 背景音乐管理者的 作用域 提高到全局,这样的话,我们就不用担心 返回 界面后,背景音乐管理者 被销毁的事了。只要不被销毁,那么 就可以 继续的 播放!
isMusicPlay
:是判断 点击这个音乐进去后,是否继续播放该音乐。
musicID
:现在 待 继续播放的 音乐 ID 是谁。如果你 再次点击的音乐不是这个ID 我们肯定是不会 继续播放的!
backgroundAudioManager.play()
:如果之前暂停了。那么就可以 实现 继续播放的 功能。
// pages/songDetail/songDetail.js
import request from "../../utils/request";
const appInstance = getApp();
Page({
/**
* 页面的初始数据
*/
data: {
isPlay: false, // 标识音乐是否播放
song: {},
preMusicId: "" // 之前播放的音乐 ID
},
// 点击播放/暂停的 回调函数
handleMusicPlay(){
this.setData({
isPlay:!this.data.isPlay
});
this.musicControl(this.data.isPlay,this.data.song.id)
},
// 控制音乐播放/暂停的 功能函数
async musicControl(isPlay, musicId) {
if (isPlay) {// 音乐开始播放
if(this.data.preMusicId === musicId){
appInstance.globalData.backgroundAudioManager.play();
}else{
// 获取音乐播放链接
let musicLinkData = await request('song/url', {id: musicId});
appInstance.globalData.backgroundAudioManager.title = this.data.song.name;
appInstance.globalData.backgroundAudioManager.src = musicLinkData.data[0].url;
this.setData({
preMusicId: musicId
})
}
} else {// 暂停播放
appInstance.globalData.backgroundAudioManager.pause();
}
},
/**
* 生命周期函数--监听页面加载
*/
onLoad(options) {
//获取事件对象
let that = this;
const eventChannel = this.getOpenerEventChannel();
eventChannel.on('song', function(data) {
that.setData({
song: data
})
});
wx.setNavigationBarTitle({
title: this.data.song.name
});
if(appInstance.globalData.isMusicPlay && this.data.song.id === appInstance.globalData.musicID){
this.handleMusicPlay();
}
// 音乐管理者播放监听
appInstance.globalData.backgroundAudioManager = wx.getBackgroundAudioManager();
appInstance.globalData.backgroundAudioManager.onPlay(() => {
this.setData({
isPlay: true
});
appInstance.globalData.musicID = this.data.preMusicId;
appInstance.globalData.isMusicPlay = true;
});
// 音乐管理者暂停监听
appInstance.globalData.backgroundAudioManager.onPause(() => {
this.setData({
isPlay: false
})
appInstance.globalData.musicID = this.data.preMusicId;
appInstance.globalData.isMusicPlay = true;
});
// 音乐管理者停止监听
appInstance.globalData.backgroundAudioManager.onStop(() => {
this.setData({
isPlay: false
})
appInstance.globalData.musicID = this.data.preMusicId;
appInstance.globalData.isMusicPlay = false;
});
},
/**
* 生命周期函数--监听页面初次渲染完成
*/
onReady() {
},
/**
* 生命周期函数--监听页面显示
*/
onShow() {
},
/**
* 生命周期函数--监听页面隐藏
*/
onHide() {
},
/**
* 生命周期函数--监听页面卸载
*/
onUnload() {
},
/**
* 页面相关事件处理函数--监听用户下拉动作
*/
onPullDownRefresh() {
},
/**
* 页面上拉触底事件的处理函数
*/
onReachBottom() {
},
/**
* 用户点击右上角分享
*/
onShareAppMessage() {
}
})
musicControl()
,如果我们暂停和播放的音乐,一直都是同一个的话!那么 我们 其实不需要 每次 都 设置 src 和 titile。设置一次就够了。这个时候 我们可以 声明 一个 变量 preMusicId
来记录 我们之前 设置 src 和 title 的 音乐 是谁。如果 这次 我们 再次 暂停和 播放的 音乐 就是 它的话。那么 就只需要 paly()
和 pause()
就好了!