如何用JavaScript实现手势库

本篇文章给大家介绍一下js实现日期比较大小的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

如何用JavaScript实现手势库

Start 事件

如何用JavaScript实现手势库

首先我们会触发一个 start 事件,也就是当我们手指触摸到屏幕时第一个触发的事件。这时会有三种情况:

手指松开  会触发 end 事件,这样就构成一个 tap 点击的行为通过监听 end 事件来实现即可手指拖动超过 10 px  这种就是 pan start 拖动的行为我们可以在 move 事件判断当前与上一个触点的距离手指停留在当前位置超过 0.5s  这种就是 press start 按压的行为我们可以添加一个 setTimeout 来实现

Press 事件

如何用JavaScript实现手势库

立即学习“Java免费学习笔记(深入)”;

所以我们第一步就是在 start 函数中加入一个 setTimout 的 handler 处理程序。

let handler;let start = point => {  handler = setTimeout(() => {    console.log('presss ');  }, 500);};

登录后复制

一般来说 press 是我们比较常见的一个行为。但是实际上这里是 press start 事件,后面还会跟随着一个 press end 的事件。我们也可以统称这个为 press 事件,然后这个手势库的使用者只需要监听这个 press 事件即可,极少的情况下是需要监听 press end 事件的。

这里我们需要注意的是,当我们触发其他的事件的时候,这个 500 毫秒的 setTimout 是有可能会被取消掉的。所以我们需要给这段逻辑一个 handler,并且放在全局作用域中,让其他事件可以获取到这个变量,并且可使用它取消掉这个处理逻辑。

Pan 事件

如何用JavaScript实现手势库

接下来我们就去监听移动 10px 的 pan 事件,这里就需要我们记录一开始用户触摸屏幕时的 x 和 y 坐标,当用户移动手指的时候,持续计算新移动到的位置与初始位置的距离。如果这个距离超过了 10px 就可以触发我们的 pan start 的事件了。

所以首先我们需要在 start 函数中加入 startX 和 startY 的坐标记录,这里要注意的是,因为这两个值都是会在多个地方被使用的,所以也是需要在全局作用域中声明。

然后在 move 函数中计算当前触点与起点的直径距离。这里我们需要用到数学中的直径运算公式  z 2 x^2 + y^2 = z^2x 2 +y 2 =z 2 ,而这里面的 x 是 当前触点的 x 坐标 – 起点的 x 坐标 的 x 轴的距离, y 就是 当前出点的 y 坐标 – 起点的 y 坐标 运算出来的 y 轴的距离。最终两个距离二次幂相加就是直径距离的二次幂。

 在代码中我们一般都会尽量避免使用根号运算,因为根号运算会对性能有一定的影响。我们知道最终要判断的是直径距离是否是大于一个固定的 10px。那就是说 z = 10,而 z 的二次幂就是 100,所以我们直接判断这个直径距离是否大于 100 即可。

这里还有一个需要注意的,就是当我们手指移动超过 10px 之后,如果我们手指没有离开屏幕而是往回移动了,这样的话我们距离起点已经不够 10px了。但是这个其实也是算 pan 事件,因为我们确实有移动超过 10px 距离,超过这个距离之后所有的移动都是属于 pan 事件。

所以我们需要一个 isPan 的状态,第一次移动超出 10px 的时候,就会触发 pan-start 事件,并且把 isPan 置为 true,而后面的所有移动都会触发 pan 事件。

根据我们上面讲到的 press 事件,如果我们按下手指后 0.5 秒内出现了移动,那么 press 事件就会被取消。所以这里我们就需要 clearTimeout 把 pressstart 的 handler 给清楚掉。

let handler;let startX, startY;let isPan = false;let start = point => {  (startX = point.clientX), (startY = point.clientY);  isPan = false;  handler = setTimeout(() => {    console.log('pressstart');  }, 500);};let move = point => {  let dx = point.clientX - startX,    dy = point.clientY - startY;  let d = dx ** 2 + dy ** 2;  if (!isPan && d > 100) {    isPan = true;    console.log('pan-start');    clearTimeout(handler);  }  if (isPan) {    console.log(dx, dy);    console.log('pan');  }};

登录后复制

Tap 事件

如何用JavaScript实现手势库

Tap 的这个逻辑我们可以在 end 事件里面去检查。首先我们默认有一个 isTap 等于 true 的状态,如果我们触发了 pan 事件的话,那就不会去触发 tap 的逻辑了,所以 tap 和 pan 是互斥的关系。但是为了不让它们变得很耦合,所以我们不使用原有的 isPan 作为判断状态,而是另外声明一个 isTap 的状态来记录。

这里我们 tap 和 pan 都有单独的状态,那么我们 press 也不例外,所以也给 press 加上一个 isPress 的状态,它的默认值是 false。如果我们 0.5 秒的定时器被触发了,isPress 也就会变成 true。

既然我们给每个事件都加入了状态,那么这里我们就给每一个事件触发的时候设置好这些状态的值。

press 时  isTap = falseisPan = falseisPress = truepan 时  isTap = falseisPan = trueisPress = falsetap 时  isTap = trueisPan = falseisPress = false

如果我们发现用户没有移动,也没有按住触屏超过 0.5 秒,当用户离开屏幕时就会调用 end 函数,这个时候我们就可以认定用户的操作就是 tap。这里我们要注意的是,我们 press 的 0.5 秒定时器是没有被关闭的,所以我们在 isTap 的逻辑中需要 clearTimeout(handler)。

说到取消 press 定时器,其实我们 handler 的回调函数中,也需要做一个保护代码逻辑,在触发了 press-start 之后,我们需要保证每次点击屏幕只会触发一次,所以在 setTimout 的回调函数中的最后,我们需要加上 handler = null。这样只要 press-start 触发了,就不会再被触发。

let handler;let startX, startY;let isPan = false,  isPress = false,  isTap = false;let start = point => {  (startX = point.clientX), (startY = point.clientY);  isPan = false;  isTap = true;  isPress = false;  handler = setTimeout(() => {    isPan = false;    isTap = false;    isPress = true;    console.log('press-start');    handler = null;  }, 500);};let move = point => {  let dx = point.clientX - startX,    dy = point.clientY - startY;  let d = dx ** 2 + dy ** 2;  if (!isPan && d > 100) {    isPan = true;    isTap = false;    isPress = false;    console.log('pan-start');    clearTimeout(handler);  }  if (isPan) {    console.log(dx, dy);    console.log('pan');  }};let end = point => {  if (isTap) {    console.log('tap');    clearTimeout(handler);  }};

登录后复制

End 事件

到了最后这里我们要处理的就是所有的结束时间,包括 press-end 和 pan-end。

这两个 end 事件都会在 end 函数中判断所得,如果在用户操作的过程中触发了 pan-start 或者 press-start 事件,到了 end 函数这里,对应的状态就会是 true。

所以我们对 end 函数做了以下改造:

let end = point => {  if (isTap) {    console.log('tap');    clearTimeout(handler);  }  if (isPan) {    console.log('pan-end');  }  if (isPress) {    console.log('press-end');  }};

登录后复制

最后我们需要在 cancel 事件触发的时候,清楚掉 press 事件的 setTimeout。既然我们的操作被打断了,那也不可能会触发我们的长按事件了。

// 加入 cancellet cancel = point => {  clearTimeout(handler);  console.log('cancel');};

登录后复制

我们除了 flick 的逻辑,我们已经完成所有手势库里面的事件了。并且也能正确的区分这几种手势操作了。

【推荐学习:javascript高级教程】

以上就是如何用JavaScript实现手势库的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2713451.html

(0)
上一篇 2025年3月7日 21:23:49
下一篇 2025年2月19日 02:27:45

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • js中==和===的区别是什么

    区别:“==”表示相等,“====”表示严格相等。“==”运算符会在进行相等比较之前先进行必要值的类型转换;而“===”运算符不会执行类型转换,因此如果两个值类型不同,那么比较时,直接返回false。 本教程操作环境:windows7系统、…

    2025年3月7日
    200
  • 详解JavaScript中怎么实现队列结构

    本篇文章带大家了解一下队列数据结构,详细介绍一下其具有的操作以及在javascript中实现队列结构的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。 1. 队列数据结构 队列是一种“先入先出”(FIFO)数据结构的类…

    2025年3月7日 编程技术
    200
  • javascript 删除函数是什么

    javascript删除函数是指Delete函数,该函数用于删除指定的文件或文件夹,其使用语法如“object.Delete( force );”,其中参数object是必选项,应为File或Folder对象的名称。 本文操作环境:wind…

    2025年3月7日
    200
  • javascript怎么替换所有字符串

    javascript替换所有字符串的方法:1、通过“function(FindText, RepText){…}”方法替换所有字符串;2、通过“function(reallyDo, replaceWith){…}”替…

    2025年3月7日
    200
  • Javascript如何复制对象

    Javascript复制对象的方法:1、把原来对象的属性遍历一遍,赋给一个新的对象;2、将对象变为字符串,然后再变为json对象;3、concat一个空数组;4、通过扩展运算符实现对象的深拷贝;5、通过ES6扩展运算符实现数组的深拷贝。 本…

    2025年3月7日
    200
  • js数组怎么删除某一项

    js数组删除某一项的方法:1、使用splice()函数删除,语法格式“array.splice(删除元素的开始下标,1)”;2、使用delete关键字,语法格式“delete array[数组元素下标]”。 本教程操作环境:windows7…

    2025年3月7日
    200
  • javascript中定义方法的关键字是什么

    javascript中定义方法的关键字是function;function关键字的使用语法如“function functionName(parameters) {执行的代码}”。 本文操作环境:windows7系统、javascript1…

    2025年3月7日
    200
  • 怎么在JavaScript中加注释

    在JavaScript中加注释的方法:1、通过“//”符号进行单行注释,任何位于“//”与行末之间的文本都会被JavaScript忽略;2、通过以“/*”开头,以“*/”结尾来实现多行注释。 本文操作环境:windows7系统、javasc…

    2025年3月7日
    200
  • javascript怎么弹出对话框

    javascript弹出对话框的实现方法:1、通过alert()方法设置对话框;2、通过confirm()方法设置对话框;3、通过prompt()方法设置提示框。 本文操作环境:windows7系统、javascript1.8.5版、Del…

    2025年3月7日 编程技术
    200
  • JavaScript字符串转换为日期的方法

    JavaScript字符串转换为日期的方法:首先新建一个html文件;然后在js标签内,将时间字符串存放在str变量中;接着使用“replace()”方法将“-”替换为“/”;最后使用“new Date()”将字符串转换为日期格式即可。 本…

    2025年3月7日 编程技术
    200

发表回复

登录后才能评论