下面是一个示例代码,可以实现在地图上触摸拖动时带有拖动范围框的微信小程序:

// index.js
Page({
  data: {
    mapWidth: 0,
    mapHeight: 0,
    startX: 0,
    startY: 0,
    moveX: 0,
    moveY: 0,
    rangeLeft: 0,
    rangeTop: 0,
    rangeWidth: 0,
    rangeHeight: 0,
    rangeVisible: false
  },

  onLoad: function() {
    // 获取地图宽高
    const query = wx.createSelectorQuery()
    query.select('.map').boundingClientRect((res) => {
      this.setData({
        mapWidth: res.width,
        mapHeight: res.height
      })
    }).exec()
  },

  onTouchStart: function(e) {
    this.setData({
      startX: e.touches[0].clientX,
      startY: e.touches[0].clientY
    })
  },

  onTouchMove: function(e) {
    const moveX = e.touches[0].clientX - this.data.startX
    const moveY = e.touches[0].clientY - this.data.startY

    // 计算范围框的位置和大小
    const rangeLeft = Math.min(this.data.startX, this.data.startX + moveX)
    const rangeTop = Math.min(this.data.startY, this.data.startY + moveY)
    const rangeWidth = Math.abs(moveX)
    const rangeHeight = Math.abs(moveY)

    // 检查范围框是否超出地图边界
    if (rangeLeft < 0 || rangeTop < 0 || rangeLeft + rangeWidth > this.data.mapWidth || rangeTop + rangeHeight > this.data.mapHeight) {
      return
    }

    this.setData({
      moveX: moveX,
      moveY: moveY,
      rangeLeft: rangeLeft,
      rangeTop: rangeTop,
      rangeWidth: rangeWidth,
      rangeHeight: rangeHeight,
      rangeVisible: true
    })
  },

  onTouchEnd: function() {
    this.setData({
      startX: 0,
      startY: 0,
      moveX: 0,
      moveY: 0,
      rangeVisible: false
    })
  }
})
<!-- index.wxml -->
<view class="container">
  <view class="map" bindtouchstart="onTouchStart" bindtouchmove="onTouchMove" bindtouchend="onTouchEnd">
    <view class="range" hidden="{{!rangeVisible}}" style="left: {{rangeLeft}}px; top: {{rangeTop}}px; width: {{rangeWidth}}px; height: {{rangeHeight}}px;"></view>
  </view>
</view>
/* index.wxss */
.container {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 100%;
  height: 100%;
}

.map {
  position: relative;
  width: 300px;
  height: 300px;
  background-color: #ccc;
}

.range {
  position: absolute;
  border: 2px dashed #f00;
  pointer-events: none;
}

这个示例中,map代表地图容器,range代表拖动范围框。当在地图上触摸拖动时,通过计算触摸点的位移来确定范围框的位置和大小,并且检查范围框是否超出地图边界。拖动范围框的样式通过动态设置style属性来实现


原文地址: https://www.cveoy.top/t/topic/iUma 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录