<template> <view class="global-voice-box"> <view v-if="!showBig"> <view class="flex small-box" @click.prevent="showBig=true"> <view style="flex:1;overflow: hidden;"> <view class="van-ellipsis">{{title}}</view> <view class="time" style="font-size:24rpx;color:#666">时长 {{audioTime|formatVoiceTime}}</view> </view> <image class="pause-img" :src="play?require('@/static/audio-doing.png'):require('@/static/audio-pause-3.png')" mode="aspectFill" @click.stop="handleChangePlayStatus" /> <van-icon @click.stop="handleClosePopAudio" name="cross" size="18" color="#BBC3C9"/> </view> <van-progress color="#D4AC78" track-color="#fff" :show-pivot="false" stroke-width="2px" custom-class="bot-progress" :percentage="percentage" /> </view> <view class="big-box" v-else> <view class="flex top" style="overflow: hidden;"> <van-icon name="arrow-down" size="18" color="#BBC3C9" @click="showBig=false" /> <view class="van-ellipsis" style="flex:1;margin:0 10rpx;text-align:center">{{title}}</view> <van-icon @click.stop="handleClosePopAudio" name="cross" size="18" color="#BBC3C9"/> </view> <view class="flex center"> <image class="pause-img" :src="play?require('@/static/audio-doing.png'):require('@/static/audio-pause-3.png')" mode="aspectFill" @click.stop="handleChangePlayStatus" /> <text class="time">{{curTime|formatVoiceTime}}</text> <slider activeColor="#e3b377" :max="audioTime" :value="curTime" @change="handleAudioSliderChange($event)" block-size="16" class="slider" /> <text class="time">{{audioTime|formatVoiceTime}}</text> </view> </view> </view> </template> <script> import {apiViewLogUpdate} from '@/api/common' export default { filters:{ formatVoiceTime(e){ let m=parseInt(e/60) let s=parseInt(e%60) return `${m>9?m:'0'+m}:${s>9?s:'0'+s}` } }, computed: { audioData(){ return this.$store.state.audio }, //用户监听音频是否变化了 是否需要初始化 audioInit(){ return { reportId:this.$store.state.audio.reportId, voiceId:this.$store.state.audio.voiceId, questionId:this.$store.state.audio.questionId } }, percentage(){ return parseInt((this.curTime/this.audioTime)*100) }, reportAudioShow(){ return this.$store.state.report.audioData.show } }, watch:{ audioInit:{ handler(nval){ console.log(nval); this.init() }, immediate:true }, showBig:{ handler(nval){ this.$store.commit('audio/showBig',nval) }, immediate:true } }, data() { return { showBig:false, curTime:0, audioTime:0,//当前音频总时长 title:'',//当前音频标题 play:false } }, methods: { init(){ console.log('audioBox init'); let delyTime=0 if(this.$store.state.report.audioData.show){ this.globalBgMusic.stop() delyTime=300 } console.log('audioBox init',delyTime); const curAudio=this.$store.state.audio.list[this.$store.state.audio.index] setTimeout(() => { if(this.globalBgMusic.src!=curAudio.url){ this.handleUpdateAudioPlayTime() this.globalBgMusic.src=curAudio.url this.globalBgMusic.title=curAudio.title } this.audioTime=curAudio.time this.title=curAudio.title this.curTime=parseInt(this.globalBgMusic.currentTime) this.play=!this.globalBgMusic.paused this.listenAudio() }, delyTime); }, //音频播放事件 listenAudio(){ console.log('设置监听事件'); this.globalBgMusic.onPlay(()=>{ console.log('开始播放'); this.play=true this.$store.commit('audio/updateAudioPause',false) }) this.globalBgMusic.onPause(()=>{ console.log('音频暂停'); this.handleUpdateAudioPlayTime() this.play=false this.$store.commit('audio/updateAudioPause',true) }) this.globalBgMusic.onStop(()=>{ console.log('音频停止'); this.handleUpdateAudioPlayTime() this.$store.commit('audio/removeAudio') }) this.globalBgMusic.onEnded(()=>{ console.log('音频onEnded'); this.handleUpdateAudioPlayTime() const index=this.$store.state.audio.index if(index==this.$store.state.audio.list.length-1){ this.$store.commit('audio/removeAudio') }else{ this.handleAudioChange('next') } }) this.globalBgMusic.onError((e)=>{ console.log('音频onError',e); this.$store.commit('audio/removeAudio') uni.showToast({ title: '音频播放错误', icon: 'none' }) }) this.globalBgMusic.onTimeUpdate(()=>{ // console.log('时间更新'); this.curTime=parseInt(this.globalBgMusic.currentTime) this.$store.commit('audio/updateAudioTime',this.curTime) }) }, //关闭弹窗停止播放的音频 handleClosePopAudio(){ this.globalBgMusic.stop() }, //音频切换(暂时没有用到因为都是一个音频 如果后期有多个 直接在页面dom调用此方法即可) handleAudioChange(type){ let temIndex=this.$store.state.report.audioData.index if(type=='before'){ if(temIndex>0){ let index=temIndex-1 this.$store.commit('audio/updateAudioIndex', index) this.init() } }else{ if(temIndex<this.$store.state.report.audioData.list.length-1){ let index=temIndex+1 this.$store.commit('audio/updateAudioIndex', index) this.init() } } }, //拖动进度条 handleAudioSliderChange(e){ const value=e.detail.value this.globalBgMusic.seek(value) }, //音频点击暂停播放 handleChangePlayStatus(){ if(!this.globalBgMusic.paused){ this.globalBgMusic.pause() }else{ this.globalBgMusic.play() } }, // 记录音频播放 时长 handleUpdateAudioPlayTime(){ if(!this.$store.state.audio.recordId||this.$store.state.audio.curTime==0) return apiViewLogUpdate({ id:this.$store.state.audio.recordId, stop_seconds:parseInt(this.$store.state.audio.curTime), source:this.$store.state.audio.lastType }).then(res=>{ console.log('音频播放时间记录成功'); }) } }, } </script> <style> .bot-progress{ width: 100%; } </style> <style lang="scss" scoped> .global-voice-box{ position: fixed; background: #FFFFFF; border: 1px solid #E4E4E4; box-shadow: 0px 0px 40rpx rgba(50, 35, 17, 0.25); left: 20rpx; right: 20rpx; bottom: calc(130rpx + constant(safe-area-inset-bottom)); bottom: calc(130rpx + env(safe-area-inset-bottom)); z-index: 99; .small-box{ padding: 18rpx 48rpx 18rpx 20rpx; position: relative; align-items: center; .pause-img{ width: 60rpx; height: 60rpx; margin-right: 44rpx; margin-left: 30rpx; flex-shrink: 0; } } .big-box{ padding: 33rpx 30rpx; .center{ align-items: center; margin-top: 20rpx; .time{ font-size: 24rpx; } .pause-img{ width: 60rpx; height: 60rpx; margin-right: 34rpx; } .slider{ flex: 1; } } } } </style>