手势滑动组件封装及使用笔记

1、swiperAction.vue

<template>
  <!-- 滑动手势组件 -->
  <!-- 1 slot插槽 -->
  <!-- 2 向父组件传递滑动方向 -->
  <view @touchstart="handleTouchStart" @touchend="handleTouchEnd">
    <slot></slot>
  </view>
</template>
<script>
/**
 * 1 给容器绑定两个触屏事件 touchstart 和touchend
 * 2 用户按下屏幕事件
 *  1 记录用户按下屏幕事件 Date.now() 时间戳 返回1970-1-1到现在的毫秒数
 *  2 记录用户按下屏幕的坐标 event.changedTouches[0].clientX 和 clientY
 * 3 用户手指离开屏幕事件
 *  1 记录用户手指离开屏幕的时间 Date.now()
 *  2 记录用户手指离开屏幕的坐标
 *  3 根据按下和离开的时间 运算 判断 用户按下屏幕时长是否合法
 *  4 根据按下和离开的坐标 判断距离是否合法 判断滑动方向
 */
export default {
  data() {
    return {
      // 按下时间
      starTime: 0,
      // 按下坐标
      startX: 0,
      startY: 0
    }
  },
  methods: {
    //  手指按下屏幕
    handleTouchStart(event) {
      this.startTime = Date.now()
      this.startX = event.changedTouches[0].clientX
      this.startY = event.changedTouches[0].clientY
    },
    // 手指离开屏幕
    handleTouchEnd(event) {
      const endTime = Date.now()
      const endX = event.changedTouches[0].clientX
      const endY = event.changedTouches[0].clientY

      // 判断时长
      if (endTime - this.startTime > 2000) {
        return
      }
      let direction = ''
      // 判断用户滑动距离绝对值是否合法,合法:判断滑动方向
      if (
        Math.abs(endX - this.startX) > 10 &&
        Math.abs(endY - this.startY) < 10
      ) {
        direction = endX - this.startX > 0 ? 'right' : 'left'
      } else {
        return
      }

      this.$emit('swiperaction', { direction })
    }
  }
}
</script>

2、使用

<swiper-action @swiperaction="handleSwiperAction">
      <view class="high-img">
        <image :src="imgDetail.thumb" mode="widthFix"></image>
      </view>
    </swiper-action>
 // 手指左右滑动事件
    handleSwiperAction(params) {
      // 判断 imgIndex 是否超出数组范围
      // params.direction为left,imgIndex++,
      // params.direction === "left" && this.imgIndex < imgList.length-1
      // params.direction为right,imgIndex--
      // params.direction === "right" && this.imgIndex > 0
      const { imgList } = getApp().globalData
      if (params.direction === 'left' && this.imgIndex < imgList.length - 1) {
        this.imgIndex++
        this.getData()
      } else if (params.direction === 'right' && this.imgIndex > 0) {
        this.imgIndex--
        this.getData()
      } else {
        uni.showToast({
          title: '没有更多了~',
          icon: 'none'
        })
      }
    },
上一篇:不到 150 行代码写一个 Python 版的贪吃蛇


下一篇:Python:贪吃蛇小游戏