要求
1.頁面包含一個音樂列表,點擊列表中的音樂可以播放對應的音樂。
2.播放中的音樂在列表中有標識,并且可以暫停或繼續(xù)播放。
3.顯示當前音樂的播放進度和總時長,并可以拖動進度條調整播放進度。
4.點擊切換按鈕可以切換到下一首音樂。
5.點擊循環(huán)按鈕可以切換音樂的播放模式(單曲循環(huán)、列表循環(huán)、隨機播放)。
代碼實現
wxml 文件
<view class="container">
<scroll-view scroll-y class="music-list">
<view wx:for="{{ musicList }}" wx:key="{{ index }}" class="music-item" bindtap="onMusicTap" data-index="{{ index }}">
<view class="music-name">{{ item.name }}</view>
<view class="music-artist">{{ item.artist }}</view>
</view>
</scroll-view>
<audio id="audio" src="{{ currentMusic.src }}" bindtimeupdate="onTimeUpdate" bindended="onEnded"></audio>
<view class="player">
<view class="controls">
<button class="control-btn" bindtap="onPrev">上一首</button>
<button class="control-btn" bindtap="onPlayOrPause">{{ playing ? '暫停' : '播放' }}</button>
<button class="control-btn" bindtap="onNext">下一首</button>
<button class="control-btn" bindtap="onChangeMode">模式</button>
</view>
<view class="progress">
<text>{{ currentTime }}</text>
<slider max="{{ duration }}" value="{{ currentPosition }}" bindchange="onSliderChange" />
<text>{{ durationStr }}</text>
</view>
</view>
</view>
wxss 文件
.container {
padding: 20rpx;
}
.music-list {
height: 300rpx;
}
.music-item {
padding: 10rpx;
border-bottom: 1rpx solid #eee;
text-align: left;
}
.player {
margin-top: 20rpx;
display: flex;
flex-direction: column;
align-items: center;
}
.controls {
display: flex;
justify-content: space-around;
width: 100%;
margin-bottom: 10rpx;
}
.control-btn {
background-color: #009688;
color: #fff;
padding: 10rpx 20rpx;
border-radius: 4rpx;
}
progress {
display: flex;
align-items: center;
}
.slider {
flex: 1;
margin: 0 10rpx;
}
js文件
Page({
data: {
musicList: [
{ name: '歌曲1', artist: '歌手1', src: 'music1.mp3' },
{ name: '歌曲2', artist: '歌手2', src: 'music2.mp3' },
// 更多音樂...
],
currentMusic: {},
playing: false,
duration: 0,
currentPosition: 0,
currentTime: '00:00',
durationStr: '00:00',
playMode: 0, // 0: 列表循環(huán),1: 單曲循環(huán),2: 隨機播放
},
onMusicTap(e) {
const index = e.currentTarget.dataset.index;
const music = this.data.musicList[index];
this.setData({
currentMusic: music,
playing: true,
});
this.playMusic();
},
onPlayOrPause() {
if (this.data.playing) {
this.pauseMusic();
} else {
this.playMusic();
}
},
playMusic() {
const audio = this.selectComponent('#audio');
audio.play();
this.setData({
playing: true,
});
},
pauseMusic() {
const audio = this.selectComponent('#audio');
audio.pause();
this.setData({
playing: false,
});
},
onPrev() {
let currentIndex = this.data.musicList.findIndex(item => item.src === this.data.currentMusic.src);
if (currentIndex === 0) {
currentIndex = this.data.musicList.length - 1;
} else {
currentIndex--;
}
const music = this.data.musicList[currentIndex];
this.setData({
currentMusic: music,
playing: true,
});
this.playMusic();
},
onNext() {
let currentIndex = this.data.musicList.findIndex(item => item.src === this.data.currentMusic.src);
if (currentIndex === this.data.musicList.length - 1) {
currentIndex = 0;
} else {
currentIndex++;
}
const music = this.data.musicList[currentIndex];
this.setData({
currentMusic: music,
playing: true,
});
this.playMusic();
},
onTimeUpdate(e) {
const duration = e.detail.duration;
const currentPosition = e.detail.currentTime;
const currentTime = this.formatTime(currentPosition);
const durationStr = this.formatTime(duration);
this.setData({
duration: duration,
currentPosition: currentPosition,
currentTime: currentTime,
durationStr: durationStr,
});
},
onEnded() {
if (this.data.playMode === 1) {
// 單曲循環(huán)
const audio = this.selectComponent('#audio');
audio.seek(0);
audio.play();
} else {
this.onNext();
}
},
onSliderChange(e) {
const value = e.detail.value;
const audio = this.selectComponent('#audio');
audio.seek(value);
},
onChangeMode() {
let playMode = this.data.playMode;
playMode = (playMode + 1) % 3;
this.setData({
playMode: playMode,
});
},
formatTime(time) {
const minutes = Math.floor(time / 60);
const seconds = Math.floor(time % 60);
const minuteStr = minutes < 10 ? '0' + minutes : '' + minutes;
const secondStr = seconds < 10 ? '0' + seconds : '' + seconds;
return minuteStr + ':' + secondStr;
},
});
解析
其中,onPrev() 和 onNext() 函數實現了切換到上一首和下一首音樂的邏輯。通過 findIndex()
函數找到當前音樂在列表中的位置,然后根據播放模式計算出下一首或上一首音樂的位置,更新當前音樂并播放。onTimeUpdate() 函數實現了更新播放進度的邏輯,通過 detail 參數獲取音頻的總時長和當前播放進度,并格式化成 00:00
的形式,更新頁面數據。onEnded() 函數實現了音樂播放結束的邏輯,根據當前的播放模式決定是單曲循環(huán)還是切換到下一首音樂。
onSliderChange() 函數實現了調整播放進度的邏輯,通過 seek() 函數跳轉到指定的時間點。
onChangeMode() 函數實現了切換播放模式的邏輯,通過取余操作循環(huán)切換三種播放模式。文章來源:http://www.zghlxwxcb.cn/news/detail-814720.html
到這里也就結束了,希望對您有所幫助。文章來源地址http://www.zghlxwxcb.cn/news/detail-814720.html
到了這里,關于微信小程序實現一個音樂播放器的功能的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!