最近呢席覆,用小程序做了一款音頻播放器直砂,自我感覺還闊以菌仁,接下來呢,給大家分享一下静暂,大家先來看看效果圖哦~
播放器.gif
這里呢济丘,我選擇的是 wx.createInnerAudioContext 這個方法,大家可以結(jié)合文檔來看這篇文章哦~
wxml
<view class="audios">
<view class="play_pause_btn" bindtap="stratPlay">
<image class="btn" wx:if="{{!isplay}}" src="../../assets/image/correctAudios/play.png"></image>
<image class="btn" wx:else src="../../assets/image/correctAudios/pause.png"></image>
</view>
<view class="play_process">
<view style="font-size: 22rpx;font-family:Helvetica;">{{startTime}}</view>
<view class="slider_out" style="width: {{selfSliderWidth}}">
<slider data-offset="{{processLen}}" style="width: 95%;margin-left: 10rpx;" bindchange='sliderChange' bindtouchstart="handleSliderMoveStart" bindtouchend="handleSliderMoveEnd" value="{{processLen}}" min="0" max="100" step="1" activeColor='#000' block-size="12" backgroundColor="rgba(199,199,204,1)"/>
</view>
<view style="font-size: 22rpx;font-family:Helvetica;">{{endTime}}</view>
</view>
</view>
js: 1洽蛀、初始化狀態(tài)
data() {
url: '',
duration: '',
myAudio: '',
startTime: '00:00',
endTime: '00:00',
isplay: false,
processLen: 0,
isMovingSlider: false,
},
onReady(){
this.data.myAudio = wx.createInnerAudioContext();
this.data.myAudio.src = this.data.url;
wx.setInnerAudioOption({
obeyMuteSwitch: false
})
this.data.endTime = setTimes(this.data.duration);
this.data.myAudio.seek(0);
this.setData({
isplay: false,
startTime: '00:00',
endTime: this.data.endTime,
processLen: 0,
})
}
js: 2摹迷、點擊播放、暫停郊供、以及播放的進度
this.data.isplay = !this.data.isplay;
if(this.data.isplay) {
this.data.myAudio.play();
setTimeout(() => {
this.data.myAudio.paused;
}, 200)
} else {
this.data.myAudio.pause();
}
this.setData({
isplay: this.data.isplay
})
// 播放中...
this.data.myAudio.onTimeUpdate(() => {
if(!this.data.isMovingSlider) {
let per = (this.data.myAudio.currentTime this.data.myAudio.duration) * 100;
this.setData({
startTime: setTimes(this.data.myAudio.currentTime),
processLen: per
})
}
})
// 播放結(jié)束
this.data.myAudio.onEnded(() => {
this.setData({
isplay: false,
startTime: "00:00",
processLen: 0
})
})
// 播放出錯
this.data.myAudio.onError((err) => {
console.log('audio error => ', err)
})
js: 3峡碉、進度條的拖拽
sliderChange(e) {
let long = (e.detail.value * this.data.duration) / 100;
this.data.myAudio.seek(long);
this.data.myAudio.pause();
setTimeout(() => {
this.data.myAudio.play();
})
}, 500)
this.setData({
isplay: true,
startTime: setTimes(long)
})
}
// 解決onTimeUpdate事件觸發(fā)slider控件更新”和“手動拖動觸發(fā)slider更新”沖突的問題
handleSliderMoveStart() {
this.setData({
isMovingSlider: true
});
},
handleSliderMoveEnd() {
this.setData({
isMovingSlider: false
});
}
js: 4、銷毀音頻實例
onUnload() {
this.data.myAudio.destory()
}
wxss
.audios {
display: flex;
align-items: center;
height: 88rpx;
padding: 0 40rpx;
margin: 0 auto;
box-sizing: border-box;
background:rgba(255,255,255,1);
box-shadow: 2rpx 2rpx 12rpx 0rpx rgba(199,199,204,0.6);
border-radius: 20rpx;
}
.audios .play_pause_btn {
width: 40rpx;
height: 44rpx;
margin-right: 40rpx;
}
.play_pause_btn .btn{
width: 100%;
height: 100%;
}
.audios .play_process {
flex: 1;
display: flex;
justify-content: space-between;
align-items: center;
}
代碼中所用到的setTimes方法
const setTimes = (value) => {
let theTime = parseInt(value);//秒
let theTime1 = 0;//分
if(theTime > 60){
theTime1 = parseInt(theTime / 60);
theTime = parseInt(theTime % 60);
if(theTime1 > 60) {
theTime1 = parseInt(theTime1 % 60);
}
}
let theTime_y = parseInt(theTime);
if(theTime_y < 10) {
theTime_y = '0' + theTime_y
}
let results = "" + theTime_y;
if(theTime1 > 0 || theTime1 == 0) {
let theTime1_y = parseInt(theTime1);
if(theTime1_y < 10){
theTime1_y = '0' + theTime1_y;
}
results = "" + theTime1_y + ":" + results;
}
return results;
}
嗯~驮审,到這就寫的差不多了鲫寄,希望能夠幫助大家,如若有地方不正確疯淫,還希望在評論區(qū)多多指出地来,或者私信小編哦,三克油??