微信小程序内拖动及缩放功能实现

2,630 阅读1分钟

功能描述:微信小程序中实现图片区域拖动及缩放功能

  • index.wxml

    <view class="img" catchtouchstart="touchstartCallback"  catchtouchmove="touchmoveCallback" catchtouchend="touchendCallback"  >
      <image style="transform:translate({{stv.offsetX}}px, {{stv.offsetY}}px) scale({{stv.scale}});" src="../../img/03.png"></image>
    </view>
    
  • index.js

     data() {
          stv: {
            offsetX: 0,
            offsetY: 0,
            zoom: false, //是否缩放状态
            distance: 0,  //两指距离
            scale: 1,  //缩放倍数
          }
     }
     
     
     
     // 触摸开始
    touchstartCallback: function(e) {
      console.log('touchstartCallback');
      console.log(e);
    
      if (e.touches.length === 1) {
        let {clientX, clientY} = e.touches[0];
        this.startX = clientX;
        this.startY = clientY;
        this.touchStartEvent = e.touches;
      } else {
        let xMove = e.touches[1].clientX - e.touches[0].clientX;
        let yMove = e.touches[1].clientY - e.touches[0].clientY;
        let distance = Math.sqrt(xMove * xMove + yMove * yMove);
        this.setData({
          'stv.distance': distance,
          'stv.zoom': true, //缩放状态
        })
      }
    },
    // 触摸移动中
    touchmoveCallback: function(e) {
      //console.log('touchmoveCallback');
      //console.log(e);
    
      if (e.touches.length === 1) {
        // 单指移动
        if (this.data.stv.zoom) {
          // 缩放状态,不处理单指
          return ;
        }
        let {clientX, clientY} = e.touches[0];
        let offsetX = clientX - this.startX;
        let offsetY = clientY- this.startY;
        this.startX = clientX;
        this.startY = clientY;
        let {stv} = this.data;
        stv.offsetX += offsetX;
        stv.offsetY += offsetY;
        stv.offsetLeftX = -stv.offsetX;
        stv.offsetLeftY = -stv.offsetLeftY;
        this.setData({
          stv: stv
        });
      } else {
        // 双指缩放
        let xMove = e.touches[1].clientX - e.touches[0].clientX;
        let yMove = e.touches[1].clientY - e.touches[0].clientY;
        let distance = Math.sqrt(xMove * xMove + yMove * yMove);
    
        let distanceDiff = distance - this.data.stv.distance;
        let newScale = this.data.stv.scale + 0.005 * distanceDiff;
    
        this.setData({
          'stv.distance': distance,
          'stv.scale': newScale,
        })
      }
    },
    // 触摸结束
    touchendCallback: function(e) {
      console.log('touchendCallback');
      console.log(e);
    
      if (e.touches.length === 0) {
        this.setData({
          'stv.zoom': false, //重置缩放状态
        })
      }
    },