收藏
回答

movable-view组件沿着屏幕边缘进行拖拽,停止时并不会触发touchend事件?

<template>
  <view>
    <movable-area
      class="movable-area"
      :style="{
        zIndex: isRemove ? 982 : 981,
      }"
      :scale-area="false"
    >
      <movable-view
        class="movable-view"
        :class="!isRemove ? 'animation-info' : ''"
        style="pointer-events: auto"
        @click="clickBtn"
        @touchstart="touchstart"
        @touchend="touchend"
        @change="onChange"
        direction="all"
        inertia="true"
        :x="x"
        :y="y"
        :disabled="disabled"
        :out-of-bounds="false"
        :damping="200"
        :friction="100"
      >
        <slot></slot>
      </movable-view>
    </movable-area>
  </view>
</template>


<script>
export default {
  props: {
    //是否禁用拖动
    disabled: {
      type: Boolean,
      default: false,
    },
    //是否自动停靠
    canDocking: {
      type: Boolean,
      default: true,
    },
    //按钮默认位置离底部距离(px)
    bottomPx: {
      type: Number,
      default: 200,
    },
    //按钮默认位置离右边距离(px)
    rightPx: {
      type: Number,
      default: 375,
    },
  },
  data() {
    return {
      left: 0,
      top: 0,
      isRemove: false,
      windowWidth: 0,
      windowHeight: 0,
      btnWidth: 0,
      btnHeight: 0,
      x: 0,
      y: 600,
      old: {
        x: 0,
        y: 0,
      },
      topHeight: 0,
    };
  },
  mounted() {
    const that = this;
    uni.getSystemInfo({
      success: function (res) {
        that.topHeight = res.safeArea.top * 2;
      },
    });
    this.$nextTick(() => {
      this.getSysInfo();
    });
  },
  methods: {
    getSysInfo() {
      let sysInfo = uni.getSystemInfoSync();
      this.windowWidth = sysInfo.windowWidth;
      this.windowHeight = sysInfo.windowHeight;
      // #ifdef MP-WEIXIN
      let view = uni.createSelectorQuery().in(this).select(".movable-view");
      view
        .boundingClientRect((rect) => {
          if (!rect) return;
          this.btnWidth = rect.width;
          this.btnHeight = rect.height;
          this.x = this.old.x;
          this.y = this.old.y;
          this.$nextTick((res) => {
            // this.x = this.windowWidth - this.btnWidth - this.rightPx;
            this.x = 0;
            this.y = this.windowHeight - this.btnHeight - this.bottomPx;
          });
        })
        .exec();
      // #endif
      // #ifdef MP-ALIPAY
      let view = my.createSelectorQuery().in().select(".movable-view");
      view.boundingClientRect().exec((rect) => {
        if (!rect) return;
        this.btnWidth = rect[0].width;
        this.btnHeight = rect[0].height;
        this.x = this.old.x;
        this.y = this.old.y;
        this.$nextTick((res) => {
          //   this.x = this.windowWidth - this.btnWidth - this.rightPx;
          this.x = 0;
          this.y = this.windowHeight - this.btnHeight - this.bottomPx;
        });
      });
      // #endif
    },
    //移动按钮
    onChange(e) {
      this.old.x = e.detail.x;
      this.old.y = e.detail.y;
    },
    //开始移动
    touchstart(e) {
      this.isRemove = true;
    },
    //结束移动
    touchend(e) {
      if (this.canDocking && this.old.x) {
        this.x = this.old.x;
        this.y = this.old.y;
        let bWidth = (this.windowWidth - this.btnWidth) / 2;
        if (this.x < 0 || (this.x > 0 && this.x <= bWidth)) {
          this.$nextTick((res) => {
            this.x = 0;
          });
        } else {
          this.$nextTick((res) => {
            this.x = this.windowWidth - this.btnWidth;
          });
        }
        if (this.y <= this.topHeight) {
          this.$nextTick((res) => {
            this.y = this.topHeight;
          });
        }
        this.isRemove = false;
      }
      this.$nextTick(() => {
        this.$emit("dragIconDTouchend");
      });
    },
    //点击按钮
    clickBtn() {
      this.$emit("clickBtn");
    },
    updateY(y) {
      this.y = y;
    },
  },
};
</script>


<style scoped>
.movable-view {
  width: 146rpx;
  height: 146rpx;
  /* background: linear-gradient(360deg, #287BF8 0%, #6EA8FF 100%); */
  /* box-shadow: 0px 4rpx 12rpx 0px #ADC3F8; */
  border-radius: 50rpx;
  color: #ffffff;
  font-size: 26rpx;
  touch-action: none;
  display: flex;
  align-items: center;
  justify-content: center;
}


.animation-info {
  transition: left 0.25s ease;
}


.movable-area {
  width: 100%;
  height: 100%;
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  pointer-events: none;
}
</style>

我有两个拖拽组件,在停止时动态计算两个组件的位置并算出是否重叠然后更新位置,但是实际测试中只要沿着屏幕边缘进行拖拽时,组件的touchend事件并不会响应,调试中也没有log输出

回答关注问题邀请回答
收藏

1 个回答

  • 社区技术运营专员-Jahozheng
    社区技术运营专员-Jahozheng
    星期三 11:19

    你好,麻烦提供出现问题的具体机型、微信版本号、系统版本号,以及能复现问题的代码片段(https://developers.weixin.qq.com/miniprogram/dev/devtools/minicode.html)

    星期三 11:19
    有用
    回复
登录 后发表内容