H5触摸事件判断滑动方向

银角大王
• 阅读 11399

为了给触摸界面提供有力支持, 触摸事件提供了响应用户对触摸屏或者触摸板上操作的能力.

接口

TouchEvent

TouchEvent 是一类描述手指在触摸平面(触摸屏、触摸板等)的状态变化的事件。这类事件用于描述一个或多个触点,使开发者可以检测触点的移动,触点的增加和减少,等等。每 个 Touch 对象代表一个触点; 每个触点都由其位置,大小,形状,压力大小,和目标 element 描述。 TouchList 对象代表多个触点的一个列表.

触摸事件的类型

为了区别触摸相关的状态改变,存在多种类型的触摸事件。可以通过检查触摸事件的 TouchEvent.type 属性来确定当前事件属于哪种类型

  • touchstart:当用户在触摸平面上放置了一个触点时触发。
  • touchend:当一个触点被用户从触摸平面上移除(当用户将一个手指离开触摸平面)时触发。
  • touchmove:当用户在触摸平面上移动触点时触发。
  • touchcancel:当触点由于某些原因被中断时触发。

判断滑动方向

基本原理就是记录开始滑动(touchStart)和结束滑动(touchEnd)的坐标位置,然后进行相对位置的计算。

touchStart:function(e){
    startX = e.touches[0].pageX;
    startY = e.touches[0].pageY;
    e = e || window.event;
 },
touchEnd:function(e){
    const that = this;
    endX = e.changedTouches[0].pageX;
    endY = e.changedTouches[0].pageY;
    that.upOrDown(startX,startY,endX,endY);
},
upOrDown:function (startX, startY, endX, endY) {
    const that = this;
    let direction = that.GetSlideDirection(startX, startY, endX, endY);
    switch(direction) {
      case 0:
        console.log("没滑动");
        break;
      case 1:
        console.log("向上");
        break;
      case 2:
        console.log("向下");
        break;
      case 3:
        console.log("向左");
        break;
      case 4:
        console.log("向右");
        break;
      default:
        break;
    }
  },
//根据起点和终点返回方向 1:向上,2:向下,3:向左,4:向右,0:未滑动
  GetSlideDirection:function (startX, startY, endX, endY) {
    const that = this;
    let dy = startY - endY;
    let dx = endX - startX;
    let result = 0;
    //如果滑动距离太短
    if(Math.abs(dx) < 2 && Math.abs(dy) < 2) {
      return result;
    }
    let angle = that.GetSlideAngle(dx, dy);
    if(angle >= -45 && angle < 45) {
      result = 4;
    }else if (angle >= 45 && angle < 135) {
      result = 1;
    }else if (angle >= -135 && angle < -45) {
      result = 2;
    }
    else if ((angle >= 135 && angle <= 180) || (angle >= -180 && angle < -135)) {
      result = 3;
    }
    return result;
  },
  //返回角度
  GetSlideAngle:function (dx, dy) {
    return Math.atan2(dy, dx) * 180 / Math.PI;
  }

原生JS方法

除了H5新增的方法外,还可以用原生JS判断view的滑动方向,代码如下(可直接运行):
要注意的是chrome对document.body.scrollTop一直是0,需要改成document.documentElement.scrollTop

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>菜鸟教程(runoob.com)</title>
  <style>
    div {
      border: 1px solid black;
      width: 200px;
      height: 100px;
      overflow: scroll;
    }
  </style>
</head>
<body style="overflow: scroll">
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<h1>HEllo word</h1>
<script>
  function scroll( fn ) {
    var beforeScrollTop = document.documentElement.scrollTop,
      fn = fn || function() {};
    console.log('beforeScrollTop',beforeScrollTop);
    window.addEventListener("scroll", function() {
      var afterScrollTop = document.documentElement.scrollTop,
        delta = afterScrollTop - beforeScrollTop;
      console.log('beforeScrollTop',beforeScrollTop);
      console.log('afterScrollTop',afterScrollTop);
      if( delta === 0 ) return false;
      fn( delta > 0 ? "down" : "up" );
      beforeScrollTop = afterScrollTop;
    }, false);
  }

  scroll(function(direction) { console.log(direction) });
</script>

</body>
</html>
点赞
收藏
评论区
推荐文章
绣鸾 绣鸾
2年前
Alfred 5 快速启动和工作流自动化工具 Mac
是一款Mac电脑上的快速启动和工作流自动化工具,它可以帮助用户快速访问文件、应用程序、web搜索和系统工具,提高工作效率。以下是Alfred的特点:快速启动:用户可以通过Alfred快速启动应用程序、打开文件或执行系统命令,无需使用鼠标或触摸板。智能搜索:
Android事件分发-基础原理和场景分析
和其他平台类似,Android中View的布局是一个树形结构,各个ViewGroup和View是按树形结构嵌套布局的,从而会出现用户触摸的位置坐标可能会落在多个View的范围内,这样就不知道哪个View来响应这个事件,为了解决这一问题,就出现了事件分发机制。
Stella981 Stella981
3年前
RK3288 USB触摸屏(hid设备)无法使用,需要添加PID和VID
 RK3288 Android5.1现象:USB接口触摸屏插到板子上,触摸屏无法使用,有可能出现更奇葩的,同一套代码,有的板子可以用,有的板子不能用。1、打开串口调试,插上触摸屏,读取触摸屏的PID(idVendor)和VID(idProduct)。37.456833usb31.1.1:newfullspe
Stella981 Stella981
3年前
CoordinatorLayout,NestedScrollView,AppbarLayout源码解析
NestedScrollView.java1.触摸事件@OverridepublicbooleanonTouchEvent(MotionEventev){initVelocityTrackerIfNotExists();MotionEventvtev
燕青 燕青
1年前
mac 触控板增强神器:Bettertouchtool for Mac中文版 支持M1
是一款Mac上的触摸板手势控制工具,可以帮助用户根据自己的习惯和需求定制触摸板手势操作,提高工作效率和操作体验。首先,Bettertouchtool支持多种手势控制,包括双指手势、三指手势、四指手势等,并且可以根据用户需求进行定制。这些手势控制包括但不限于
点击按住说话按钮事件有延迟
问题原因:该问题原因是由于系统的某些手势delaysTouchesBegan属性为YES,当按钮处在某些特定位置时触摸事件会先被这些系统的手势拦截,系统不响应才会继续分发,而按钮的UIControlEventTouchDown事件是需要立即响应的,所以会导
赵颜 赵颜
1年前
TS223 触摸键检测IC ——2.0V~5.5V 低功耗和宽工作电压 SSOP16、SOT-23-6封装形式
TS223是触摸键检测IC,提供1个触摸键。触摸检测IC是为了用可变面积的键取代传统的按钮键而设计的。低功耗和宽工作电压是触摸键的DC和AC特点。采用SSOP16、SOT236的封装形式封装。主要特点:●工作电压2.0V5.5V●工作电流@VDD3V,无负
元宇宙华锐 元宇宙华锐
5个月前
AR互动与传统的交互方式相比更加丰富多元
AR互动的另一个显著特点,是其丰富多元的互动方式。与传统的交互方式相比,AR互动不再局限于鼠标、键盘、触摸屏等有限的输入方式,而是通过多种先进的技术手段,实现了更加自然、丰富的人机交互。手势交互是AR互动中最常见的方式之一。用户可以通过简单的手势操作,如点
绣鸾 绣鸾
2年前
Alfred 5快速启动和工作流自动化工具
Alfred是一款Mac电脑上的快速启动和工作流自动化工具,它可以帮助用户快速访问文件、应用程序、web搜索和系统工具,提高工作效率。以下是Alfred的特点:快速启动:用户可以通过Alfred快速启动应用程序、打开文件或执行系统命令,无需使用鼠标或触摸板
绣鸾 绣鸾
1年前
Alfred 5 for Mac工作流自动化、效率办公工具
是一款Mac电脑上的快速启动和工作流自动化工具,它可以帮助用户快速访问文件、应用程序、web搜索和系统工具,提高工作效率。以下是Alfred的特点:快速启动:用户可以通过Alfred快速启动应用程序、打开文件或执行系统命令,无需使用鼠标或触摸板。智能搜索:
流浪剑客 流浪剑客
1年前
「更新」Bettertouchtool for Mac中文版 触控版增强工具
是一款功能强大的Mac触控板增强软件,它允许用户自定义触摸栏、魔术鼠标和键盘快捷键等输入设备的操作和手势。通过BetterTouchTool,用户可以更高效地操作和控制Mac设备。主要特点和功能包括:自定义触摸栏和魔术鼠标:允许用户自定义MacBook触摸
银角大王
银角大王
Lv1
永远怀揣浪漫情怀。
文章
2
粉丝
0
获赞
0