uniapp小程序怎么判断滑动的方向

项目场景:

获取手机上手指滑动的距离超过一定距离 来操作一些逻辑


解决方案:

在uniapp中,可以通过监听触摸事件来判断滑动的方向。常用的触摸事件包括touchstarttouchmove, 和 touchend。通过这些事件的参数,可以计算出用户的滑动起点和终点,进而判断滑动方向

touchStart 方法记录了触摸开始时的坐标,touchMove 方法在触摸移动时更新了坐标,touchEnd 方法则在触摸结束时计算出滑动的方向。getSwipeDirection 方法用于根据起点和终点的坐标判断出水平或垂直方向的滑动,如果水平方向的位移大于阈值,则判定为水平滑动;如果垂直方向的位移大于阈值,则判定为垂直滑动。

<template>
  <view @touchstart="touchStart" @touchmove="touchMove" @touchend="touchEnd">
    <!-- 滑动区域内容 -->
    <view 
        v-for="(item,index) in 20" 
        :key="index" 
        style="border:1rpx solid #ccc;height:100rpx">
        测试11111
    </view>
  </view>
</template>
 
<script>
export default {
  data() {
    return {
      startX: 0, // 触摸开始的X坐标
      startY: 0, // 触摸开始的Y坐标
      endX: 0,   // 触摸结束的X坐标
      endY: 0,   // 触摸结束的Y坐标
    };
  },
  methods: {
    touchStart(event) {
      this.startX = event.touches[0].pageX;
      this.startY = event.touches[0].pageY;
    },
    touchMove(event) {
      // 移动时更新结束坐标
      this.endX = event.touches[0].pageX;
      this.endY = event.touches[0].pageY;
    },
    touchEnd(event) {
      let direction = this.getSwipeDirection(
        this.startX, this.startY, this.endX, this.endY
        );
      console.log('Swipe direction: ' + direction);
    },
    getSwipeDirection(startX, startY, endX, endY) {
      const threshold = 30; // 设定一个阈值,用于判断是否是滑动
      const deltaX = endX - startX;
      const deltaY = endY - startY;
 
      // 如果水平方向的位移大于垂直方向,且水平方向的位移大于阈值,则认为是水平滑动
      if (Math.abs(deltaX) > Math.abs(deltaY) && Math.abs(deltaX) > threshold) {
        return deltaX > 0 ? 'right' : 'left';
      }
      // 如果垂直方向的位移大于水平方向,且垂直方向的位移大于阈值,则认为是垂直滑动
      else if (Math.abs(deltaY) > Math.abs(deltaX) && Math.abs(deltaY) > threshold) {
        return deltaY > 0 ? 'down' : 'up';
      }
      // 其他情况视为无效滑动
      return 'none';
    },
  },
};
</script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是uniapp小程序做卡片滑动效果的方法: 1.使用swiper组件实现卡片滑动效果,代码如下: ```html <swiper class="swiper-container" indicator-dots="false" autoplay="false" circular="true" vertical="false" duration="300" easing-function="easeInOutCubic"> <swiper-item class="swiper-item" v-for="(item, index) in list" :key="index"> <!-- 卡片内容 --> </swiper-item> </swiper> ``` 2.使用touch事件实现卡片滑动效果,代码如下: ```html <view class="card" v-for="(item, index) in list" :key="index" :style="{transform: 'translateX(' + item.translateX + 'px) translateY(' + item.translateY + 'px) rotate(' + item.rotate + 'deg)'}" @touchstart="touchstart(index, $event)" @touchmove="touchmove(index, $event)" @touchend="touchend(index, $event)"> <!-- 卡片内容 --> </view> ``` ```javascript data() { return { list: [ { translateX: 0, translateY: 0, rotate: 0, startX: 0, startY: 0, moveX: 0, moveY: 0, isTouch: false }, // ... ] } }, methods: { touchstart(index, e) { this.list[index].startX = e.touches[0].clientX this.list[index].startY = e.touches[0].clientY this.list[index].isTouch = true }, touchmove(index, e) { if (!this.list[index].isTouch) return let moveX = e.touches[0].clientX - this.list[index].startX let moveY = e.touches[0].clientY - this.list[index].startY let rotate = moveX / 10 this.list[index].translateX = moveX this.list[index].translateY = moveY this.list[index].rotate = rotate }, touchend(index, e) { if (!this.list[index].isTouch) return this.list[index].isTouch = false if (Math.abs(this.list[index].translateX) > 100) { // 滑动成功 } else { // 滑动失败 this.list[index].translateX = 0 this.list[index].translateY = 0 this.list[index].rotate = 0 } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值