小程序實現長按錄音,上劃取消發送

最近在使用mpvue開發小程序,須要用到錄音功能,因而打算參照微信的錄音方案:"長按錄音鬆開發送,上劃取消發送"。在網上找了一圈都沒發現類似的案例,沒辦法只能本身實現。html

下面講解只貼上關鍵代碼

1. html部分。

微信小程序事件接口:vue

類型 觸發條件
touchstart 手指觸摸動做開始
touchmove 手指觸摸後移動
touchend 手指觸摸動做結束
longpress 手指觸摸後,超過350ms再離開,若是指定了事件回調函數並觸發了這個事件,tap事件將不被觸發
longtap 手指觸摸後,超過350ms再離開(推薦使用longpress事件代替)

分析:長按錄音須要longpress事件,鬆開發送須要touchend事件,上滑取消發送須要touchmove事件。由此可有如下html代碼小程序

//html部分 class部分只是控制樣式 與功能無關
<div class="input weui-grid" hover-class="weui-grid_active" :class="record.type" @longpress="handleRecordStart" @touchmove="handleTouchMove" @touchend="handleRecordStop">
        <image class="weui-grid__icon"  :src="record.iconPath"/>
        <div class="weui-grid__label">{{record.text}}</div>
</div>

2. JS部分

2.1. 首先定義錄音的數據結構:

舊版的小程序錄音接口wx.startRecord和wx.stopRecord在1.6.0版本後再也不維護了,因此使用其建議的wx.getRecordManager接口。微信小程序

注意:使用wx.getRecordManager接口的話,應調用相應的音頻控制接口 wx.createInnerAudioContext()來播放和控制錄音.
data(){
          record: {
          text: "長按錄音",
          type: "record",
          iconPath: require("@/../static/icons/record.png"),
          handler: this.handleRecordStart
          }, //與錄音相關的數據結構
    recorderManager: wx.getRecorderManager(), //錄音管理上下文    
    startPoint: {}, //記錄長按錄音開始點信息,用於後面計算滑動距離。
          sendLock: true, //發送鎖,當爲true時上鎖,false時解鎖發送

  },

2.2. 監聽錄音stop

onLoad(){
  this.recorderManager.onStop(res => {
            if (this.sendLock) {
              //上鎖不發送
            } else {//解鎖發送,發送網絡請求
              if (res.duration < 1000)
                    wx.showToast({
                          title: "錄音時間過短",
                          icon: "none",
                          duration: 1000
                    });
               else this.contents = [...this.contents,{ type: "record", content: res }];//contents是存儲錄音結束後的數據結構,用於渲染.
            }
          });
}

2.3. 長按錄音方法

在這個方法中須要作的事:api

  • 記錄長按的點信息,用於後面計算手指滑動的距離,實現上滑取消發送.
  • 作一些界面樣式的控制.
  • 開始錄音
handleRecordStart(e) {
          //longpress時觸發
           this.startPoint = e.touches[0];//記錄長按時開始點信息,後面用於計算上劃取消時手指滑動的距離。
           this.record = {//修改錄音數據結構,此時錄音按鈕樣式會發生變化。
                text: "鬆開發送",
               type: "recording",
                 iconPath: require("@/../static/icons/recording.png"),
                   handler: this.handleRecordStart
              };
              this.recorderManager.start();//開始錄音
              wx.showToast({
                title: "正在錄音,上劃取消發送",
                icon: "none",
                duration: 60000//先定義個60秒,後面能夠手動調用wx.hideToast()隱藏
              });
              this.sendLock = false;//長按時是不上鎖的。
              
      },

2.4. 鬆開發送

在這個方法中須要作的事:微信

  • 作一些樣式的控制.
  • 結束錄音.
handleRecordStop() {
          // touchend(手指鬆開)時觸發
          this.record = {//復原在start方法中修改的錄音的數據結構
            text: "長按錄音",
            type: "record",
            iconPath: require("@/../static/icons/record.png"),
            handler: this.handleRecordStart
          };
          wx.hideToast();//結束錄音、隱藏Toast提示框
          this.recorderManager.stop();//結束錄音
      }

2.5. 上劃取消發送

在這個方法中須要作的事:網絡

  • 計算手指上滑的距離
  • 根據距離判斷是否須要取消發送
  • 若是取消發送,最重要的是this.sendLock = true,上鎖不發送
handleTouchMove(e) {
          //touchmove時觸發
          var moveLenght = e.touches[e.touches.length - 1].clientY - this.startPoint.clientY; //移動距離
          if (Math.abs(moveLenght) > 50) {
            wx.showToast({
                  title: "鬆開手指,取消發送",
                  icon: "none",
                  duration: 60000
            });
            this.sendLock = true;//觸發了上滑取消發送,上鎖
          } else {
            wx.showToast({
                  title: "正在錄音,上劃取消發送",
                  icon: "none",
                  duration: 60000
            });
            this.sendLock = false;//上劃距離不足,依然能夠發送,不上鎖
          }
    },
  }

2.6. 演示GIF

GIF.gif

原文連接: Rychou我的博客-小程序實現長按錄音,上劃取消發送
相關文章
相關標籤/搜索