1. 程式人生 > >微信小程式:自定義音樂進度條

微信小程式:自定義音樂進度條

需求:顯示音樂播放按鈕、可手動拖拽進度條;頁面中含多個音樂,播放當前音樂時暫停其他音樂播放。

小程式自帶標籤 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
    });

備註:

程式碼只用於參考,具體如何實現要結合自己的專案結構。

相關推薦

程式定義音樂進度

需求:顯示音樂播放按鈕、可手動拖拽進度條;頁面中含多個音樂,播放當前音樂時暫停其他音樂播放。 小程式自帶標籤 audio 小程式自帶的audio標籤含固定的樣式,且有最小尺寸。目前專案也不含name和author欄位,所以放棄audio標籤。 實現

程式--15定義元件

關於自定義元件有兩個知識點需要說一下: 1.子元件向父元件傳引數 在子元件內部,這樣觸發事件,傳遞引數 在父元件內部這樣接收引數 2. 父元件向子元件傳引數 在父元件這裡定義一個now-in 在子元件這裡引入 這樣的話,nowIn就相當於data裡

程式 Canvas 定義時間顯示器 數碼管顯示

微信小程式自定義時間顯示器Demo 廢話不多話,還是依舊上圖再說,哈哈 怎麼樣,效果還是不錯的吧,因專案要求,要畫出類似於數碼管顯示的時間樣式,沒辦法,雖然不咋過好弄,但工作畢竟得做,於是乎,樓主,花了3個小時在那裡硬生生的算座標,差不多還是給擼出來,樓主寫成了一個外掛,方便大

程式定義select下拉選項框元件

知識點:元件,animation,獲取當前點選元素的索引與內容 微信小程式中沒有select下拉選項框,所以只有自定義。自定義的話,可以選擇模板的方式,也可以選擇元件的方式來建立。 這次我選擇了元件,這樣只需引入元件和新增資料,其它的不用管,就能實現多個地方重複使用了。

程式之——定義分享按鈕(完整版)

1.宣告 onShareAppMessage 函式   onShareAppMessage() {          return {        title: '彈出分享時顯示的分享標

程式開發---定義tabBar

最近開發微信小程式,公司要求做一個類似閒魚的tabbar,但是網上大多資料的tabbar都會在頁面切換的時候重新渲染,所以我寫了一個不會重新渲染的tabbar,有需要的直接拿走不謝。https://github.com/SuRuiGit/wxapp-customTabbar

程式定義toast例項 —— 程式實戰系列(6)

微信提供了一個toast的api  wx.showToast() 本來是比較好的,方便使用,但是這個toast會顯示出圖示,而且不能去除。 假設:我們執行完業務的時候,toast一下,當執行成功的

程式定義輪播圖例項 —— 程式實戰系列(3)

輪播圖是大部分應用的一個常用的功能,常用於廣告投放、產品展示、活動展示等等。 漂亮的輪播圖效果可以吸引使用者的點選,達到推廣產品的作用。 廢話少說,下面開始動手。 業務需求: 5個圖片輪番播放,

程式定義模態框例項

原文連結:https://mp.weixin.qq.com/s/23wPVFUGY-lsTiQBtUdhXA1概述由於官方API提供的顯示模態彈窗,只能簡單地顯示文字內容,不能對對話方塊內容進行自定義,欠缺靈活性,所以自己從模態彈窗的原理角度來實現了自定義的模態對話方塊。今天

程式定義抽屜選單(從下拉出)例項 —— 程式實戰系列(7)

微信提供了動畫api,就是下面這個 通過使用這個建立動畫的api,可以做出很多特效出來 下面介紹一個抽屜選單的案例 實現程式碼: wxml: <!--button--> &l

程式定義元件

微信小程式中的元件前言之前做小程式開發的時候,對於開發來說比較頭疼的莫過於自定義元件了,當時官方對這方面的文件也只是寥寥幾句,一筆帶過而已,所以寫起來真的是非常非常痛苦!!好在微信小程式的庫從 1.6.3 開始,官方對於自定義元件這一塊有了比較大的變動,首先比較明顯的感覺就是文件比以前全多了,有木有!(小程式

程式(三)定義分享按鈕和原生分享&區分不同按鈕的分享&帶引數分享和獲取

官方的分享 點選右上角的三個點 /** * 使用者點選右上角分享 */ onShareAppMessage: function(ops) { wx.showShareMenu({

程式 —— 解決定義彈窗出現後,蒙層下的頁面仍可以滾動的問題

在微信小程式開發中,會碰到自定義彈窗出現後,蒙層下面的頁面仍可以滾動的問題。 例如: 解決方法: 1. 先點擊出現蒙層時,頁面的最外層view:height:100vh (靈活設定,

程式佈局 定義彈出層

很常見的就就是點選篩選 出現篩選條件的場景 效果 WXML <!--index.wxml--> <button bindtap='showModal'>點這裡</

程式定義輪播圖swiper dots樣式

在做微信小程式開發過程中,常用的元件就是swiper元件,通過該控制元件來實現輪播圖效果,但是swiper元件的指示點預設是小黑點,一般情況下,我們可以根據API文件中swiper的相關屬性方法進行顏色修改,如下: indicator-color='#dbdb

程式定義抽屜式選單(底部,從下向上拉出)

微信提供了動畫api,就是下面這個通過使用這個建立動畫的api,可以做出很多特效出來下面介紹一個抽屜選單的案例實現程式碼:wxml:<!--button--> <view class="btn" bindtap="powerDrawer" data-stat

程式程式掃描定義二維碼到指定頁面的坑

重點 測試版本不需要釋出也可以進行測試 測試階段不釋出,只能掃描測試連結中的地址中的二維碼,其他的就算符合規範也不可以 如果是要動態匹配引數,那麼動態部分必定是/後面的字串 如果是要動態匹配引數,那

程式 帶可拖動進度和時間顯示的音訊播放器

眾所周知,微信官方自帶的音訊播放器是沒有進度條的,為了實現有進度條,並且拖動,只能自己寫一個了; 下面是演示圖 ①頁面載入完成後,能夠直接顯示音訊的時長 ②播放時,進度條變化,播放時間變化,拖動進度條可以跳轉到改進度播放 話不多說,直接上程式碼 首先是微信官

程式帶open-type和定義背景的按鈕

小編推薦:Fundebug專注於JavaScript、微信小程式、微信小遊戲,Node.js和Java實時BUG監控。真的是一個很好用的bug監控費服務,眾多大佬公司都在使用。 在小程式開發過程中,經常遇到一種情況:頁面中的一個按鈕需要帶有open-type,同時還要靈活地設定這個

程式音樂播放器的使用1

首先第一點。這個音樂播放其實也沒什麼大的問題,但是有些時候可能要根據pm來開發的時候回有點噁心,比如我就遇到了。勉強提交了一個版本後,開始好好的梳理下這個audio的一開始的時候,pm跟我說我肯定想到的是使用backgroundaudio來播放音樂的,畢竟光是audio元件就