微信小程序实现点击拍照长按录像功能

代码里面注释写的都很详细,直接上代码。官方的组件属性中有触摸开始和触摸结束属性。本功能依靠这些属性实现。

.wxml代码:
<!-- 相机 pages/camera/camera.wxml-->
<!-- 相机 -->
<camera wx:if="{{!videoSrc}}" device-position="back" flash="off" binderror="error" style="width: {{cameraWidth}}px; height: {{cameraHeight}}px;">
  <!-- 拍完显示照片 -->
  <cover-image wx:if="{{image1Src}}" src='{{image1Src}}'></cover-image>
  <cover-view>
    <!-- 拍照按钮 -->
    <button id='btn-photo-video' bindtouchstart="handleTouchStart" bindtouchend="handleTouchEnd" bindlongpress="handleLongPress" bindtap="handleClick">
      点击/长按</button>
  </cover-view>
</camera>
<video wx:if="{{videoSrc}}" src="{{videoSrc}}" controls></video>
.wxss代码:
/* pages/camera/camera.wxss */

cover-image,video {
  margin-top:100%;
  position: absolute;
  width: 200rpx;
  height: 200rpx;
}
#btn-photo-video{
  /* position: absolute; */
  margin-top:100%;
  width: 242rpx;
  left: 2%;
}
.js代码:
// pages/camera/camera.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    cameraHeight: '',
    cameraWidth: '',
    image1Src: '',
    videoSrc: '',
    num: 0,
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function(options) {
    //调用设置相机大小的方法
    this.setCameraSize();
    this.ctx = wx.createCameraContext();
    console.log(this.lijiajun)

  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function() {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function() {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function() {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function() {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function() {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function() {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function() {

  },

  /**
   * 获取系统信息 设置相机的大小适应屏幕
   */
  setCameraSize() {
    //获取设备信息
    const res = wx.getSystemInfoSync();
    //获取屏幕的可使用宽高,设置给相机
    this.setData({
      cameraHeight: res.windowHeight,
      cameraWidth: res.windowWidth
    })
    console.log(res)
  },

  /**
   *拍照的方法 
   */
  takePhoto() {

    this.ctx.takePhoto({
      quality: 'high',
      success: (res) => {
        this.setData({
          image1Src: res.tempImagePath
        })
      },
      fail() {
        //拍照失败
        console.log("拍照失败");
      }
    })
  },

  /**
   * 开始录像的方法
   */
  startShootVideo() {

    console.log("========= 调用开始录像 ===========")
    this.ctx.startRecord({
      success: (res) => {
        wx.showLoading({
          title: '正在录像',
        })
      },
      fail() {
        console.log("========= 调用开始录像失败 ===========")
      }
    })
  },

  /**
   * 结束录像
   */
  stopShootVideo() {

    console.log("========= 调用结束录像 ===========")
    this.ctx.stopRecord({
      success: (res) => {
        wx.hideLoading();
        this.setData({
          videoSrc: res.tempVideoPath,
        })
      },
      fail() {
        wx.hideLoading();
        console.log("========= 调用结束录像失败 ===========")
      }
    })
  },

  //touch start 手指触摸开始
  handleTouchStart:   function(e)  {    
    this.startTime  =  e.timeStamp;    
    console.log(" startTime = "  +  e.timeStamp);  
    console.log(" 手指触摸开始 " ,  e);  
    console.log(" this " , this);  
  },

  //touch end 手指触摸结束
  handleTouchEnd:   function(e)  {    
    this.endTime  =  e.timeStamp;    
    console.log(" endTime = "  +  e.timeStamp);  
    console.log(" 手指触摸结束 ", e);
    //判断是点击还是长按 点击不做任何事件,长按 触发结束录像
    if (this.endTime - this.startTime > 350) {
      //长按操作 调用结束录像方法
      this.stopShootVideo();
    }

  },

  /**
   * 点击按钮 - 拍照
   */
  handleClick:   function(e)  {    
    console.log("endTime - startTime = "  +  (this.endTime  -  this.startTime));        
    if  (this.endTime  -  this.startTime  <  350)  {    
      console.log("点击");
      //调用拍照方法
      this.takePhoto();    
    }
  },

  /**
   * 长按按钮 - 录像
   */
  handleLongPress:   function(e)  {
    console.log("endTime - startTime = "  +  (this.endTime  -  this.startTime));
    console.log("长按");
    // 长按方法触发,调用开始录像方法
    this.startShootVideo();
  },
})

 

posted @ 2023-04-18 16:39  时光独醒  阅读(271)  评论(0编辑  收藏  举报