微信小程序自定义音乐进度条的实例代码
程序员文章站
2022-12-31 15:11:09
需求:显示音乐播放按钮、可手动拖拽进度条;页面中含多个音乐,播放当前音乐时暂停其他音乐播放。
小程序自带标签 audio
小程序自带的audio标签含固定的样式,且有最...
需求:显示音乐播放按钮、可手动拖拽进度条;页面中含多个音乐,播放当前音乐时暂停其他音乐播放。
小程序自带标签 audio
小程序自带的audio标签含固定的样式,且有最小尺寸。目前项目也不含name和author字段,所以放弃audio标签。
实现效果图
初始化音乐数据
<text>{{currentprocess}}</text> <slider bindchange="" bindtouchstart="" bindtouchend="" max="{{totalprocessnum}}" min="0" value="{{currentprocessnum}}" disabled="{{canslider}}"></slider> <text>{{totalprocess}}</text> <image src="{{audiolistobj['q'+questionobj.id].imgurl}}" data-audioid="q{{questionobj.id}}" bindtap="clickplayaudio"></image> <!-- clickplayaudio 播放按钮触发事件 --> src: _this.data.questionobj.audio, currentprocess: '--:--',//显示 将currentprocessnum处理成时间形式展示 currentprocessnum: 0,//赋值 totalprocess: '--:--', totalprocessnum: 1, seek: -1, imgurl: '../../images/play.png', canslider: false //是否可以滑动,防止加载音乐时 用户滑动进度条
点击播放按钮触发事件
说明:
•因页面中音乐数量较多,所以只有当用户点击播放,再去加载audio文件。
•wx.getbackgroundaudiomanager()对象,同一时间只会播放一个audio文件。当重新赋值src时,会切换文件。
•利用ontimeupdate方法实时更新播放进度。
•onended方法处理audio播放完毕后的数据重新初始化事件。
•变量clickplayaudiofunctionisruning用来防止用户连续点击按钮。
const _this = this; const _data = _this.data; //防止用户点击播放按钮太快 if (_data.clickplayaudiofunctionisruning){ return ; } _this.setdata({ clickplayaudiofunctionisruning: true }) var _obj = _this.data.audiolistobj; const audioid = $this.currenttarget.dataset.audioid; var backgroundaudiomanager = wx.getbackgroundaudiomanager(); if (_this.data.audiolistobj[audioid].imgurl == '../../images/play.png'){ console.log('转换至播放状态') //切换所有播放按钮为暂停状态 for (var j in _this.data.audiolistobj) { if (j && _this.data.audiolistobj[j]) { _this.data.audiolistobj[j].imgurl = '../../images/play.png'; } } _this.setdata({ audiolistobj: _this.data.audiolistobj, }) //暂停正在播放音乐 wx.stopbackgroundaudio(); _obj[audioid].imgurl = '../../images/paused.png'; backgroundaudiomanager.title = '测试'; //设置音乐开始时间 if (_this.data.audiolistobj[audioid].currentprocessnum != 0){ backgroundaudiomanager.starttime = _this.data.audiolistobj[audioid].currentprocessnum; } backgroundaudiomanager.src = _this.data.audiolistobj[audioid].src; _obj[audioid].canslider = true; backgroundaudiomanager.play(); // 背景音频自然播放结束事件 backgroundaudiomanager.onended(function () { var _obj = _this.data.audiolistobj; _obj[audioid].imgurl = '../../images/play.png'; _obj[audioid].currentprocess = 0; _obj[audioid].currentprocessnum = 0; _this.setdata({ audiolistobj: _obj }) }) //背景音频播放进度更新事件 backgroundaudiomanager.ontimeupdate(function (callback) { _obj = _this.data.audiolistobj; //设置总时长 if (_obj[audioid] && _obj[audioid].totalprocess && (_obj[audioid].totalprocess == '--:--' || _obj[audioid].totalprocess == '00:00')) { console.log(_this.formattime(backgroundaudiomanager.duration)) _obj[audioid].totalprocess = _this.formattime(backgroundaudiomanager.duration); _obj[audioid].totalprocessnum = backgroundaudiomanager.duration; _this.setdata({ audiolistobj: _obj }) } if (!_this.data.ismovingslider) { //更新进度 _obj[audioid].currentprocess = _this.formattime(backgroundaudiomanager.currenttime); _obj[audioid].currentprocessnum = backgroundaudiomanager.currenttime; _this.setdata({ audiolistobj: _obj }) } }) } else if (_this.data.audiolistobj[audioid].imgurl == '../../images/paused.png'){ console.log('转换至暂停状态') _obj[audioid].imgurl = '../../images/play.png' wx.pausebackgroundaudio(); backgroundaudiomanager.pause(); } _this.setdata({ audiolistobj: _obj, clickplayaudiofunctionisruning: false })
滑动进度条触发事件
const _this = this; const _data = _this.data; const _obj = _this.data.audiolistobj; const position = $this.detail.value; const audioid = $this.currenttarget.dataset.audioid; var backgroundaudiomanager = app.globaldata.bgaudiolistmanager; _obj[audioid].currentprocess = _this.formattime(position); _obj[audioid].currentprocessnum = position; //如果正在播放 if (_obj[audioid].imgurl == '../../images/paused.png'){ _obj[audioid].seek = position; if (_obj[audioid].seek != -1) { wx.seekbackgroundaudio({ position: math.floor(position), }) _obj[audioid].seek = -1; } } _this.setdata({ audiolistobj: _obj })
开始滑动触发事件
this.setdata({ ismovingslider: true });
结束滑动触发事件
this.setdata({ ismovingslider: false });
总结
以上所述是小编给大家介绍的微信小程序自定义音乐进度条的实例代码,希望对大家有所帮助
上一篇: 3dsmax制作室内软包物品经典教程
下一篇: 处暑吃鸭子炖什么好?处暑应该吃什么?
推荐阅读
-
Thinkphp5微信小程序获取用户信息接口的实例详解
-
微信小程序实战篇之购物车的实现代码示例
-
基于tp5小程序登录的实现 demo版本 获取code 返回token 解密微信数据信息 和验证数据来源真实性(包含小程序前端和php后端代码 )
-
微信小程序仿抖音视频之整屏上下切换功能的实现代码
-
Django实现微信小程序支付的示例代码
-
微信小程序之自定义组件的实现代码(附源码)
-
微信小程序page的生命周期和音频播放及监听实例详解
-
微信小程序中的video视频实现 自定义播放按钮、封面图、视频封面上文案
-
微信小程序地图绘制线段并且测量(实例代码)
-
微信小程序开发之Mustache语法的代码实例分享