微信小程序——实现音乐播放器(上下切换歌曲、进度条拉动、暂停与继续播放)

这篇具有很好参考价值的文章主要介绍了微信小程序——实现音乐播放器(上下切换歌曲、进度条拉动、暂停与继续播放)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

小伙伴们你们有没有想过自己搞一个播放器,播上自己喜欢的歌单,那是多么的惬意啊~
之前,小编遇到一个项目,语音导览的播放器。其实跟播放歌单一个道理。
但是一看微信开发文档里面的音频API又是那么多,我们该如何选择呢?在这里小编选择了使用wx.createAudioContext();这个API。
当然啊这个需要注意的是:从基础库 1.6.0 开始,这个接口就停止维护,推荐使用 wx.createInnerAudioContext 代替;并且需要小程序基础库版本不低于 1.9.6。

wx.createAudioContext()

那么这个接口该如何正确使用呢?
AudioContext 实例,可通过 wx.createAudioContext 获取。
AudioContext 通过 id 跟一个 audio 组件绑定,操作对应的 audio 组件。

效果图

微信小程序——实现音乐播放器(上下切换歌曲、进度条拉动、暂停与继续播放)

可以看到该播放器有切换上下曲按钮、暂停按钮以及进度条
小编是这样实现的

wxml布局

<!-- 播放器样式 -->

<audio id="myAudio" class="audio_a" src="{{audio}}"  bindtimeupdate='bindtimeupdate'></audio>
<view class="audioV" wx:if="{{audio!=''}}">
  <view class="audioV_L_R">
    <!-- 左边的图片 -->
    <view class="audioV_left">
      <view class="audioV_left_v">
        <image class="audioV_left_img" src="{{detail.audio_cover}}"></image>
        <image class="audioV_left_play" src="/images/play1.png" wx:if="{{isplay==false}}" bindtap="clickplay"></image>
        <image class="audioV_left_play" src="/images/puse1.png" wx:if="{{isplay==true}}" bindtap="stop"></image>
      </view>
    </view>
    <!-- 右边的控制 -->
    <view class="audioV_right">
      <view class="audioV_right_top">
        <view class="audioV_right_top_name">{{CN==true?detail.name:detail.name_e}}</view>
        <view class="audioV_right_top_contro">
          <image class="audioV_right_top_last" src="../../../images/last.png" bindtap="getLast"></image>
          <image class="audioV_right_top_play" wx:if="{{isplay==false}}" bindtap="clickplay" src="../../../images/play2.png"></image>
          <image class="audioV_right_top_play" wx:if="{{isplay==true}}" bindtap="stop" src="../../../images/puse2.png"></image>
          <image class="audioV_right_top_next" src="../../../images/next.png" bindtap="getNext"></image>
        </view>
      </view>
      <!-- 拖动条--进度条 -->
      <view class="audioV_right_slider">
      	<!--slider 进度条的使用可以在微信开发文档上看看这些配置的用法哦-->
        <slider line-size="{{15}}" color="#000" blockColor="#944f4c" bindchange='sliderChange' activeColor='#944f4c' block-size="{{12}}" value='{{playP}}' />
      </view>
      
    </view>
  </view>
</view>

css样式

/* 播放器 */
.audioV{
  width: 100%;
  position: fixed;
  overflow: auto;
  bottom: 0rpx;
  background: #fff;
}
.audioV_L_R{
  width: 100%;
  position: relative;
  overflow: auto;
}
.audioV_left{
  width: 25%;
  padding: 15rpx 21rpx;
  box-sizing: border-box;
  float: left;
  height: 141rpx;
}
.audioV_left_v{
  position: relative;
  overflow: auto;
  height: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
}
.audioV_left_img{
  width: 111rpx;
  height: 100%;
  position: absolute;
  /* background-color: red; */
  border-radius: 8rpx;
}
.audioV_left_play{
  width: 48rpx;
  height: 48rpx;
  z-index: 2;
}
.audioV_right{
  width: 75%;
  float: left;
  padding: 15rpx 36rpx 0rpx 0rpx;
  box-sizing: border-box;

}
.audioV_right_top{
  width: 100%;
  position: relative;
  overflow: auto;
  padding-top: 10rpx;
  box-sizing: border-box;
}
.audioV_right_top_name{
  width: max-content;
  float: left;
  font-size: 30rpx;
  font-family: SourceHanSansCN, SourceHanSansCN-Medium;
  font-weight: 500;
  color: #000000;
  margin-top: 10rpx;
}
.audioV_right_top_contro{
  width: max-content;
  float: right;
  display: flex;
  justify-content: center;
  align-items: center;
}
.audioV_right_top_last{
  width: 22rpx;
  height: 30rpx;
}
.audioV_right_top_play{
  width: 59rpx;
  height: 59rpx;
  margin-left: 30rpx;
  margin-right: 30rpx;
}
.audioV_right_top_next{
  width: 22rpx;
  height: 30rpx;
}
.audioV_right_contro{
  width: 100%;
  height: 6rpx;
  background: #000;
  position: relative;
  border-radius: 20rpx;
  margin-top: 19rpx;
}
.audioV_right_contro view:nth-child(1){
  height: 100%;
  background: #944f4c;
  border-radius: 3rpx;
  float: left;
}
.audioV_right_contro view:nth-child(2){
  width: 15rpx;
  height: 15rpx;
  opacity: 1;
  background: #944f4c;
  border-radius: 50%;
  float: left;
  margin-top: -5rpx;
}
.audioV_right_slider{
  box-sizing: border-box;
  width: 100%;
  position: relative;
  margin-top: -15rpx;
  text-align: center;
}
.audioV_right_slider slider{
  width: 96%;
  margin-left: 15rpx;
}

重点来了!!!!

js控制

data: {
    // 判断是否播放,状态
    isplay:false,
    //总的进度
    playAll:0,
    //播放的秒数
    playS:0,
    // 播放的百分比
    playP:0,
	//音频链接
    audio:'',
  },
onLoad: function (options) {
	var that= this;
    that.audioCtx = wx.createAudioContext('myAudio')
    //请求完数据将赋值给data的参数
    //we.request以后
    that.setData({
		audio:e.data.data.data.c_audio,
		isplay:true
    })
    //这里使用的是
    //AudioContext.play()
	//播放音频。
    that.audioCtx.play()
},
//监听播放
//audio 组件的监听事件
bindtimeupdate(res) {
    var that = this;
    // console.log("播放信息",res)
    // console.log('bindtimeupdate', res.detail.currentTime, '时间总时长-->', res.detail.duration);
    that.setData({
      //播放进度
      playAll:res.detail.duration,
      //播放的秒数
      playS:res.detail.currentTime,
      //计算进度条的播放百分比
      playP:(res.detail.currentTime/res.detail.duration)*100,
    })
    //判断当前播放事件大于等于音频的总时长时
    //停止播放。进度条保留在100%
    if(res.detail.currentTime>=res.detail.duration){
      that.setData({
        isplay:false,
        playP:100
      })
      //设置定时器500毫秒以后进度条回到起点
      setTimeout(() => {
        that.setData({
          playP:0
        })
      }, 500);
    }
},


  //切换上一篇
  getLast:function(){
    var that = this;
    console.log("当前的id",that.data.detail)
    //这里是小编的一个全局的歌单-因为这里需求和歌单播放器有点不一样,但是原理一样的
    for(var i = 0;i<app.globalData.GuideMapId.length; i++){
      if(that.data.detail.mid == app.globalData.GuideMapId[i]){
        console.log("上一篇id:",app.globalData.GuideMapId[i-1])
        if(app.globalData.GuideMapId[i-1] == undefined||app.globalData.GuideMapId[i-1]=='undefined'||app.globalData.GuideMapId[i-1]==''||app.globalData.GuideMapId[i-1]==null){
          // wx.showModal({  
          //   title: '提示',  
          //   content: '无法再上一篇咯~',  
          //   success: function(res) {
          //       if (res.confirm) {  
          //       console.log('用户点击确定')  
          //       } else if (res.cancel) {
          //       console.log('用户点击取消')
          //       }  
          //   }
          // })
          that.setData({
            audio:''
          })
          var id = {
            id:app.globalData.GuideMapId[app.globalData.GuideMapId.length-1]
          }
          console.log(id)
          that.onLoad(id)
          // that.setData({
          //   showModel:true,
          //   showToast:true,
          //   modelMsg:'抱歉!这是第一篇咯',
          //   modelMsg_e:'Sorry!No more',
          // })
        }else{
          // that.audioCtx.destroy();
          that.setData({
            audio:''
          })
          var id = {
            id:app.globalData.GuideMapId[i-1]
          }
          console.log(id)
          that.onLoad(id)
        }
      }
    }
  },
  //获取下一篇
  getNext:function(){
    var that = this;
    console.log("当前的id",that.data.detail)
    for(var i = 0;i<app.globalData.GuideMapId.length; i++){
      if(that.data.detail.mid == app.globalData.GuideMapId[i]){
        console.log("下一篇id:",app.globalData.GuideMapId[i+1])
        if(app.globalData.GuideMapId[i+1] == undefined||app.globalData.GuideMapId[i+1]=='undefined'||app.globalData.GuideMapId[i+1]==''||app.globalData.GuideMapId[i+1]==null){
          // wx.showModal({  
          //   title: '提示',  
          //   content: '无法再下一篇咯~',  
          //   success: function(res) {  
          //       if (res.confirm) {  
          //       console.log('用户点击确定')  
          //       } else if (res.cancel) {
          //       console.log('用户点击取消')
          //       }  
          //   }
          // })
          // that.setData({
          //   showModel:true,
          //   showToast:true,
          //   modelMsg:'抱歉!这是最后一篇咯',
          //   modelMsg_e:'Sorry!No more',
          // })
          console.log("这是最后一篇:",i,app.globalData.GuideMapId)
          that.setData({
            audio:''
          })
          var id = {
            id:app.globalData.GuideMapId[0]
          }
          console.log(id)
          that.onLoad(id)
        }else{
          // that.audioCtx.destroy();
          that.setData({
            audio:''
          })
          var id = {
            id:app.globalData.GuideMapId[i+1]
          }
          console.log(id)
          that.onLoad(id)
        }
      }
    }
  },
  //拖动进度条--监听进度条的拖动
  sliderChange:function(e){
    console.log("拖动到",e.detail.value)
    var that = this;
    //计算播放的秒数
    var gotoplay = e.detail.value/100*that.data.playAll
    that.setData({
      playS:gotoplay,
      //设置进度条到百分多少
      playP:e.detail.value,
    })
    //AudioContext.seek(number position)
	//跳转到指定播放的秒数位置。
    that.audioCtx.seek(gotoplay);
  },
  //播放
  clickplay: function () {
    var that= this;
    that.audioCtx.play();
    that.setData({
      isplay: true
    });
  },
  // 停止
  stop: function () {
    var that= this;
    //AudioContext.pause()
	//暂停音频
    that.audioCtx.pause()
    that.setData({
      isplay: false
    });
  },
  

当然,小伙伴们可以使用文档说的wx.createInnerAudioContext()接口试试,他的使用方法跟wx.createAudioContext()接口的使用方法大同小异。
好了,这是小编的一些开发思路,如果各位大佬有更好的方法,麻烦在下方评论或者私聊小编哦~
让小编一起学习。文章来源地址https://www.toymoban.com/news/detail-430483.html

到了这里,关于微信小程序——实现音乐播放器(上下切换歌曲、进度条拉动、暂停与继续播放)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微信小程序--音乐播放器

    说明: 这个项目旨在练习组件以及页面的设计。页面和交互的实现可能有多种方式,这里只为了对组件和项目的结构进行熟悉了解。后续会有更加完善的项目。 由于涉及到mp3外链导入音乐,预览二维码在外链失效时会出错,这里不放预览二维码了;另预览二维码存在有效时

    2024年02月09日
    浏览(41)
  • 微信小程序音乐播放器实践

    1.成品展示: 实现搜索音乐,同步歌词,控制播放等功能 2.设计: 采用微信开发文档中的audio组件的作为代码原型,进行扩展,链接audio | 微信开放文档 (qq.com) 3、具体设计 思维导图 链接:https://pan.baidu.com/s/1whZC2xOP4HvbDMjMPA7pRQ  提取码:ljsb 3.1 播放界面index 3.2 索引界面list

    2024年02月11日
    浏览(41)
  • 《微信小程序》音乐播放器项目

    需求:在装有node.js的机器上使用微信开发者工具开发一个音乐播放项目 写这个项目的时候电脑前后蓝屏了5次,制作不易,希望大佬们给个双击,顺子在这感谢啦! 展示: pages–index–index.js 01.png 02.png 02stop.png 03.png 04.png 05.png 06.png banner.jpg banner2.jpg banner3.jpg cover.jpg cover1.png

    2024年02月11日
    浏览(46)
  • 微信小程序——【云音乐播放器】

    目录 第一章 开发准备 一、项目结构 二、新建微信小程序项目 第二章 标签页切换 一、常用组件介绍 二、编写页面结构和样式 第三章 音乐推荐 一、组件介绍 二、编写音乐推荐页面结构和样式 第四章 播放器 一、任务分析 二、组件介绍 三、实现播放器功能 四、编写播放器

    2024年02月09日
    浏览(43)
  • 音乐播放器微信小程序

    一:学习目标: 掌握swiper组件、scroll-view组件的使用; 掌握image组件的使用; 掌握slider组件的使用; 掌握音频API的使用;  二:目录: 1. 开发前的准备 1.1 音乐小程序 项目展示 : 1.1.1: 音乐推荐 界面展示: 1.1.2: 播放器 界面展示: 1.1.3: 播放列表 界面展示: 1.2: 项目

    2024年02月05日
    浏览(69)
  • 基于微信小程序的音乐播放器设计与实现(源码+lw+部署文档+讲解等)

    💗 博主介绍 :✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻 精彩专栏 推荐订阅 👇🏻 2023-2024年最值得选的微信小程序毕业设

    2024年02月03日
    浏览(32)
  • 微信小程序音乐播放器【含源码】

    微信小程序音乐播放器 取源码私聊

    2024年02月06日
    浏览(35)
  • 微信小程序仿网易音乐播放器项目

    主页样式 播放页样式 搜索页样式 排行榜页样式 小控件样式 网易云音乐API接口 后端接口,使用node写的,使用了网易云音乐API: 封装的api文件 主页面功能点 banner,滑动菜单栏采用微信的API( swiper 与 scroll-view )进行开发 滑动到底部重新获取后续的歌曲,使用onReachBottom周期

    2024年02月06日
    浏览(39)
  • 基于微信小程序的音乐播放器设计

    目 录 1绪论 1 1.1选题背景及意义 1 1.2发展现状 1 1.2.1什么是微信小程序 1 1.2.2小程序市场的现状 4 1.3研究主要内容 4 2系统技术 5 2.1 Java语言 5 2.2 SSM框架 6 2.3 Vue.js框架 7 2.4 Eclipse开发工具 8 2.5数据库 9 2.6系统开发环境概述 10 3系统分析 12 3.1 功能需求(用例图分析) 12 3.1.1 网络音

    2024年02月11日
    浏览(33)
  • java微信小程序音乐播放器分享系统

    随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,音乐播放器小程序被用户普遍使用,为方便用户能够可以随时进行音乐播放器小程序的数据信息管理,特开发了基于音乐

    2024年02月11日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包