博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
H5案例分享:移动端touch事件判断滑屏手势的方向
阅读量:4708 次
发布时间:2019-06-10

本文共 3719 字,大约阅读时间需要 12 分钟。

移动端touch事件判断滑屏手势的方向

方法一

  1. 当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和纵坐标startY;
  2. 当触发touchmove事件时,在获取此时手指的横坐标moveEndX和纵坐标moveEndY;最后,通过这两次获取的坐标差值来判断手指在手机屏幕上的滑动方向。

思路:用touchmove的最后坐标减去touchstart的起始坐标,X的结果如果正数,则说明手指是从左往右划动;X的结果如果负数,则说明手指是从右往左划动;Y的结果如果正数,则说明手指是从上往下划动;Y的结果如果负数,则说明手指是从下往上划动。

具体代码如下

    var mybody = document.getElementsByTagName('body')[0];

   

    //滑动处理

    var startX, startY, moveEndX, moveEndY, X, Y;   

    mybody.addEventListener('touchstart', function(e) {

        e.preventDefault();

        startX = e.touches[0].pageX;

        startY = e.touches[0].pageY;

    });

    mybody.addEventListener('touchmove', function(e) {

        e.preventDefault();

        moveEndX = e.changedTouches[0].pageX;

        moveEndY = e.changedTouches[0].pageY;

        X = moveEndX - startX;

        Y = moveEndY - startY;

        if ( X > 0 ) {alert(‘向右’);}

        else if ( X < 0 ) {alert(‘向左’);}

        else if ( Y > 0) {alert(‘向下’);}

        else if ( Y < 0 ) { alert(‘向上’);}

        else{alert(‘没滑动’); }

    });

 

然而在实际的操作中,手指的上下滑动很难做到直上直下,只要稍微有点斜,只要稍微有点斜,就会被X轴的判断先行接管,而与我们实际的操作意愿相背离。此时就需要添加特殊的判断技巧,修改代码如下

    var mybody = document.getElementsByTagName('body')[0];

   

    //滑动处理

    var startX, startY, moveEndX, moveEndY, X, Y;   

    mybody.addEventListener('touchstart', function(e) {

        e.preventDefault();

        startX = e.touches[0].pageX;

        startY = e.touches[0].pageY;

    }, false);

    mybody.addEventListener('touchmove', function(e) {

        e.preventDefault();

        moveEndX = e.changedTouches[0].pageX;

        moveEndY = e.changedTouches[0].pageY;

        X = moveEndX - startX;

        Y = moveEndY - startY;

        

        if ( Math.abs(X) > Math.abs(Y) && X > 0 ) {

            alert("向右");

        }

        else if ( Math.abs(X) > Math.abs(Y) && X < 0 ) {

            alert("向左");

        }

        else if ( Math.abs(Y) > Math.abs(X) && Y > 0) {

            alert("向下");

        }

        else if ( Math.abs(Y) > Math.abs(X) && Y < 0 ) {

            alert("向上");

        }

        else{

            alert("没滑动");

        }

    });

 

以上代码,在测试时仍不能达到预期的效果,因为还有一个问题——body的元素的高仔细查查,发现其值是0

故还应该在此基础上添加以下代码

    var mybody = document.getElementsByTagName('body')[0];

    var h = document.documentElement.clientHeight;

        mybody.style.height = h + 'px';

到此,已实现了手机移动端手指的上滑、下滑、左滑和右滑操作。

 

方法二

1、滑动屏幕事件使用HTML5中的touchstart滑动开始事件和touchmove滑动结束事件。

2、方向的判断:以起点做平面坐标系,与终点连线做直线,直线与x正半轴计算角度;我们以45度角为方向分割线,如:只要滑动角度大于等于45度且小于135度,则判断它方向为向上滑。如图所示:

3、使用Math.atan2来计算起点与终点形成的直线角度。

 

注意:标准坐标系与屏幕坐标系并不相同,在屏幕坐标系中,上半轴为负值,要实现转换,只需要调换Y坐标起点与终于位置即可。

 

代码如下:

      var h = document.documentElement.clientHeight,

          mybody = document.getElementsByTagName('body')[0];

          mybody.style.height = h + 'px';

 

 

        //返回角度

        function GetSlideAngle(dx,dy) {

          return Math.atan2(dy,dx) * 180 / Math.PI;

        }

 

        //根据起点和终点返回方向 1:向上,2:向下,3:向左,4:向右,0:未滑动

        function GetSlideDirection(startX,startY, endX, endY) {

          var dy = startY - endY;

          var dx = endX - startX;

          var result = 0;

 

          //如果滑动距离太短

          if (Math.abs(dx) < 2 && Math.abs(dy) < 2) {

             return result;

          }

          var angle = 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;

        }

 

 

        //滑动处理

        var startX, startY;

        mybody.addEventListener('touchstart', function (ev){

          ev.preventDefault();

          startX = ev.touches[0].pageX;

          startY = ev.touches[0].pageY; 

        }, false);

 

        mybody.addEventListener('touchmove', function (ev){

          var endX, endY;

          ev.preventDefault();

          endX = ev.changedTouches[0].pageX;

          endY = ev.changedTouches[0].pageY;

 

        var direction = GetSlideDirection(startX, startY, endX, endY);

        switch (direction){

          case 0:

            alert("没滑动");

            break;

          case 1:

            alert("向上");

            break;

          case 2:

            alert("向下");

            break;

          case 3:

            alert("向左");

            break;

          case 4:

            alert("向右");

            break;

          default:          

        } 

      }, false);

 

PS:用touchmove事件获取终点坐标,而不是用touchend事件,是因为当你只是点击屏幕的时候,就会触发touchEnd事件,但是不会触发touchMove事件。这样会造成touchEnd中取得的endX,从而造成endY值不准确。比如先滑动再点击,可能同样会触发滑动事件

另外此代码只是提供了判断滑屏方向的思路,还需要根据具体的项目需求进行修改完善!

转载于:https://www.cnblogs.com/yangmengsheng/p/5973487.html

你可能感兴趣的文章
常见安全漏洞及整改建议[备忘]
查看>>
同IP不同端口Session冲突问题
查看>>
linux上安装Docker
查看>>
NoSQL数据库介绍(2)
查看>>
判断素数
查看>>
4.Oracle 密码文件
查看>>
jwchat 的安装和配置、Service unavailable、Authorization failed问题汇总
查看>>
人,男人,女人
查看>>
在Ubuntu下创建一个新的用户
查看>>
机顶盒中动画、倒影、悬浮效果实现!!!!
查看>>
分享一个3D球面标签云
查看>>
php中的$_GET怎样获取带有井号“#”的參数
查看>>
读取硬盘序列号
查看>>
Socket程序中的Error#10054错误
查看>>
浅谈滚服游戏如果实现一键合服
查看>>
iOS中UITableView分割线左侧顶齐
查看>>
javascript之DOM编程改变CSS样式(简易验证码显示)
查看>>
variant conversion error for variable:v8
查看>>
Android学习(一)—— Android studio的安装与配置
查看>>
电子书下载:Professional Web Design: Techniques and Templates, 4th Edition
查看>>