APP开发_Hammer.js 触摸事件处理库教程

1 Hammer.js 概述

Hammer.js 是一个开源的、轻量级的触屏设备 JavaScript 手势库。它可以在不需要依赖其他工具或库的情况下识别触摸和鼠标事件,允许同时监听多个手势,甚至自定义识别器,并识别滑动方向。

Hammer.js 的主要特点包括:

  • 轻量级:Hammer.js 的大小只有几 KB,非常适合用于移动端应用,不会对应用造成过大的负担。
  • 跨平台兼容:它支持各种主流浏览器和移动设备,包括 iOS、Android、Windows Phone 等,无需担心兼容问题。
  • 简单易用:Hammer.js 提供了简洁的 API 接口,开发者只需要几行代码就可以实现复杂的手势交互。
  • 可扩展性强:通过插件系统,开发者可以添加自定义手势或扩展现有手势的功能。

在实际应用中,Hammer.js 能够帮助开发者轻松地将触摸交互融入网页和应用程序中,实现更加直观、丰富的用户体验。无论是响应式设计、富媒体应用、游戏开发还是增强现实(AR)应用,Hammer.js 都能提供强大的手势识别功能,让用户更自然地与界面进行交互。

2 Hammer.js 的基本使用

2.1 引入 Hammer

(1)通过 npm 初始化项目

进入到指定的开发目录下,初始化 npm 项目(如果你的目录还不是一个 npm 项目,你需要初始化它。这将会创建一个 package.json 文件,其中包含你的项目依赖和其他元数据)。

npm init -y

(2)安装 Hammer

使用 npm 安装 Hammer 包。

npm install hammerjs

(3)在项目中引入 Hammer

  • 可以使用 require 或 import 语句来引入 svg-pan-zoom。
// 使用 CommonJS 语法(Node.js)  
const Hammer = require('hammerjs');// 或者使用 ES6 语法(例如,在模块化的前端项目中)  
import Hammer from 'hammerjs';
  • 也可以通过 <script> 标签直接引入:
<script src="node_modules/hammerjs/hammer.min.js"></script>

2.2 初始化 Hammer Manager

// 创建一个Hammer Manager实例  
const manager = new Hammer(document.getElementById('your-element-id'));

2.3 绑定基础触摸事件(如tap、swipe等)

(1)轻击(Tap)

当用户轻击元素时触发:

manager.on('tap', (ev) => {  console.log('Tap event', ev);  
});

(2)双击(Doubletap)

当用户连续轻击元素两次时触发:

manager.on('doubletap', (ev) => {  console.log('Doubletap event', ev);  
});

(3)滑动(Swipe)

当用户在元素上滑动手指时触发。你可以通过 direction 属性来判断滑动的方向(例如:LEFT、RIGHT、UP、DOWN):

manager.on('swipe', (ev) => {  console.log('Swipe event', ev);  switch (ev.direction) {  case Hammer.DIRECTION_LEFT:  console.log('Swiped left');  break;  case Hammer.DIRECTION_RIGHT:  console.log('Swiped right');  break;  // 可以添加其他方向的处理...  }  
});

(4)按压(Press)

当用户按住元素一段时间(默认超过 500 毫秒)后触发:

manager.on('press', (ev) => {  console.log('Press event', ev);  
});

(5)自定义手势配置

Hammer.js 允许你通过配置对象来自定义手势识别器的行为。例如,你可以改变滑动事件触发的阈值:

const manager = new Hammer(myElement, {  swipe_velocity: 0.4, // 设置滑动速度阈值  swipe_max_touches: 1, // 设置同时触摸的最大数量  // 可以添加其他配置...  
});

(6)移除事件监听器

如果你需要在某个时刻移除事件监听器,你可以使用 off 方法:

manager.off('tap'); // 移除 tap 事件的监听器

2.4 监听多个事件类型

在 Hammer.js 中,可以使用 on 方法来监听多个事件类型。这允许用户一次性绑定多个事件的回调函数,从而简化代码并提高效率。以下是如何使用 Hammer.js 监听多个事件类型的示例:

首先,确保已经初始化了 Hammer Manager 并绑定到了一个 DOM 元素:

const myElement = document.getElementById('my-element');  
const mc = new Hammer(myElement);

然后,使用空格分隔的方式来监听多个事件类型。在回调函数中,通过 event.type 属性来确定触发的是哪个事件:

const myElement = document.getElementById('my-element');  
const mc = new Hammer(myElement);mc.on('tap doubletap swipe press', (event) => {  switch (event.type) {  case 'tap':  console.log('Tap event triggered');  break;  case 'doubletap':  console.log('Double tap event triggered');  break;  case 'swipe':  console.log('Swipe event triggered');  // 你可以根据swipe的方向做进一步处理  switch (event.direction) {  case Hammer.DIRECTION_LEFT:  console.log('Swiped left');  break;  case Hammer.DIRECTION_RIGHT:  console.log('Swiped right');  break;  // 其他方向...  }  break;  case 'press':  console.log('Press event triggered');  break;  // 其他事件类型...  }  
});

在上面的代码中,我们为 tap、doubletap、swipe 和 press 事件都绑定了同一个回调函数。在回调函数中,我们使用 switch 语句根据 event.type 来确定具体是哪个事件被触发了,并执行相应的逻辑。

3 高级手势识别与处理

3.1 识别双指缩放(pinch)

pinch 事件会在用户用两个手指在元素上执行缩放动作时触发。以下是如何使用 Hammer.js 来监听和处理双指缩放事件的示例:

const myElement = document.getElementById('my-element');  
const mc = new Hammer(myElement);mc.on('pinch', (event) => {  const scale = event.scale; // 缩放的比例,初始值为1,放大时大于1,缩小时小于1  const isPinchingIn = scale < 1; // 判断是向内缩放还是向外缩放  console.log('Pinch event triggered');  console.log('Scale:', scale);  console.log('Pinching in:', isPinchingIn);  // 根据缩放比例执行相应的逻辑,比如调整元素的大小或位置  if (isPinchingIn) {  // 处理向内缩放的逻辑  } else {  // 处理向外缩放的逻辑  }  
});

注意:Hammer.js 的早期版本不包含 pinch 识别器,在不能升级版本的情况下,可以使用 rotate 和 scale 事件组合来实现类似的功能。rotate事件用于处理旋转,而scale事件用于处理缩放。通过监听这两个事件,可以检测和处理双指操作时的旋转和缩放动作。

3.2 识别旋转(rotate)

用户用两个或多个手指在元素上执行旋转动作时,旋转(rotate)事件会被触发。以下是如何使用 Hammer.js 来监听和处理旋转事件的示例:

const myElement = document.getElementById('my-element');  
const mc = new Hammer(myElement);mc.on('rotate', (event) => {  const angle = event.angle; // 旋转的角度(以度为单位)  const isClockwise = angle > 0; // 判断是顺时针旋转还是逆时针旋转  console.log('Rotate event triggered');  console.log('Angle:', angle);  console.log('Clockwise:', isClockwise);  // 根据旋转角度执行相应的逻辑,比如调整元素的旋转状态  // 例如,如果你使用的是CSS transforms,你可以这样更新元素的旋转:  myElement.style.transform = `rotate(${angle}deg)`;  
});

注意,angle 属性表示的是相对于上一次旋转事件的累积角度变化。如果想要获取绝对的旋转角度,则需要在代码中维护一个状态变量来跟踪总的旋转角度。

此外,Hammer.js 还提供了 rotatestart、rotatemove 和 rotateend 事件,分别对应旋转开始、旋转过程中和旋转结束的时刻。这些事件对于实现更复杂的旋转逻辑(比如动画效果或逐步更新UI)非常有用。

mc.on('rotatestart', (event) => {  // 处理旋转开始的逻辑  
});  mc.on('rotatemove', (event) => {  // 在旋转过程中实时处理逻辑  
});  mc.on('rotateend', (event) => {  // 处理旋转结束的逻辑  
});

4 使用防抖(debounce)与节流(throttle)

4.1 防抖(Debounce)

防抖技术用于确保一个函数在一定时间内只执行一次,即使这个函数被连续触发多次。它特别适用于那些需要等待一段时间后再执行的操作,比如用户停止输入后再进行搜索或验证。

如下是使用 lodash 库的_.debounce 函数来创建一个防抖后的处理函数:

import _ from 'lodash';  const myElement = document.getElementById('my-element');  
const mc = new Hammer(myElement);  const debouncedHandler = _.debounce((event) => {  // 执行你的事件处理逻辑  console.log('Debounced event triggered:', event.type);  
}, 250); // 设置防抖时间为250毫秒  mc.on('tap', debouncedHandler);

在这个例子中,即使 tap 事件被连续触发多次,debouncedHandler 函数也只会在最后一次触发后的 250 毫秒内执行一次。

4.2 节流(Throttle)

节流技术用于确保一个函数在一段时间内只执行一定次数,即使这个函数被连续触发多次。它特别适用于那些需要定期执行的操作,比如定期更新 UI 或发送请求。

如下是使用 lodash 库的_.throttle 函数来创建一个节流后的处理函数:

import _ from 'lodash';  const myElement = document.getElementById('my-element');  
const mc = new Hammer(myElement);  const throttledHandler = _.throttle((event) => {  // 执行你的事件处理逻辑  console.log('Throttled event triggered:', event.type);  
}, 100); // 设置节流时间为100毫秒  mc.on('swipe', throttledHandler);

在这个例子中,无论 swipe 事件被触发多少次,throttledHandler 函数都只会每 100 毫秒执行一次。

4.3 注意事项

  • 防抖和节流都是优化高频事件处理的有效手段,但它们的适用场景略有不同。防抖更适合那些需要等待一段时间后再执行的操作,而节流更适合那些需要定期执行的操作。
  • 在使用防抖和节流时,要注意设置合适的执行频率(即防抖时间和节流时间)。过长的执行频率可能导致响应延迟,而过短的执行频率则可能无法起到优化效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/814584.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

架构设计-权限系统之通用的权限系统设计方案

一个系统&#xff0c;如果没有安全控制&#xff0c;是十分危险的&#xff0c;一般安全控制包括身份认证和权限管理。用户访问时&#xff0c;首先需要查看此用户是否是合法用户&#xff0c;然后检查此用户可以对那些资源进行何种操作&#xff0c;最终做到安全访问。身份认证的方…

AIGC专栏10——EasyAnimate 一个新的类SORA文生视频模型 轻松文生视频

AIGC专栏10——EasyAnimate 一个新的类SORA文生视频模型 &#x1f4fa;轻松文生视频 学习前言源码下载地址技术原理储备&#xff08;DIT/Lora/Motion Module&#xff09;什么是Diffusion Transformer (DiT)LoraMotion Module EasyAnimate简介EasyAnimate原理界面展示快速启动云…

LeetCode 每日一题 2024/4/8-2024/4/14

记录了初步解题思路 以及本地实现代码&#xff1b;并不一定为最优 也希望大家能一起探讨 一起进步 目录 4/8 2009. 使数组连续的最少操作数4/9 2529. 正整数和负整数的最大计数4/10 1702. 修改后的最大二进制字符串4/11 1766. 互质树4/12 2923. 找到冠军 I4/13 2924. 找到冠军 …

一个极简鲁棒的C语言的动态数据类型扩展,取代诸如C++/Rust那些愚蠢的东西

项目地址&#xff1a;https://github.com/shajunxing/banana-cvar 我用过很多高级语言&#xff0c;喜欢简单的东西&#xff0c;讨厌C&#xff0c;一直在想C语言能不能用最简洁的手段扩充动态语言特性&#xff0c;并且支持垃圾回收呢&#xff1f;偶然迸发出灵感&#xff0c;网上…

vue3中使用antv-S2表格(基础功能版)

先看展示效果&#xff1a; 可以调整行宽、列宽、自定义字段图标、表头图标、添加排序、显示总计、小计等 首先确保搭建一个vue3项目环境&#xff0c;从0开始的小伙伴着重看第一点&#xff1a; 一、搭建vue3项目环境 首先创建一个vue3vitets项目&#xff0c;可以查看下面相关…

Mojo语言初次入手

Mojo的出现被认为是编程语言领域的一大进步&#xff0c;有观点认为它可能是几十年来最大的编程进步???!!! 让我来试试&#xff0c;看看是怎么回事。 安装Mojo 打开命令行界面。执行以下命令来安装Mojo SDK&#xff1a; curl -s https://get.modular.com | sh - 3.接下来&…

大厂Java笔试题之百钱买百鸡问题

题目&#xff1a;公元五世纪&#xff0c;我国古代数学家张丘建在《算经》一书中提出了"百鸡问题"&#xff1a;鸡翁一值钱五&#xff0c;鸡母一值钱三&#xff0c;鸡雏三值钱一。 百钱买百鸡&#xff0c;问鸡翁、鸡母、鸡雏各几何&#xff1f; 现要求你打印出所有花一…

uniapp——长按识别二维码

说明 转变思路&#xff0c;长按图片&#xff0c;进入预览图片&#xff0c;这时候再长按就可以了。 <view class"codeMain"><view class"codeWhite" longpress"handleLongPress(i.image(qrcode))"><image :src"i.image(qrc…

解决前端笔记本电脑屏幕显示缩放比例125%、150%对页面大小的影响问题--数据可视化大屏

近期在工作中遇到一个问题&#xff0c;记录一下&#xff0c;在项目上线之后&#xff0c;遇到一个问题&#xff0c;即缩放到90%时&#xff0c;页面字体比默认的100%字体大&#xff0c;一开始毫无头绪&#xff0c;经过一番的Google...Google...Google....&#xff0c;终于找到了解…

游戏服务器DDOS克星-抗D盾(游戏盾)

随着网络游戏市场的不断扩大和发展&#xff0c;游戏服务器遭受DDOS攻击的频率也在逐年增加。DDOS攻击的主要目的是使游戏服务器瘫痪&#xff0c;使得游戏无法正常进行&#xff0c;导致游戏运营商巨额损失。鉴于此&#xff0c;针对游戏服务器的防DDOS攻击技术德迅云安全自主研发…

冲刺2024年思维100春季线上比赛:做做历年思维100真题(附答案)

今天是2024年4月14日&#xff0c;距离2024年春季思维100活动第一阶段的线上比赛4月20日还有6天。那么2024年思维100活动的考试重点是什么呢&#xff1f;主办方未公布&#xff0c;我们可以从历年的思维100真题中来分析和推测&#xff0c;把历年真题和背后的知识点吃透了&#xf…

6.0 MapReduce 使用

6.0 MapReduce 使用 分类 编程 在学习了之前的 MapReduce 概念之后&#xff0c;我们应该已经知道什么是 Map 和 Reduce&#xff0c;并了解了他们的工作方式。 本章将学习如何使用 MapReduce。 Word Count Word Count 就是"词语统计"&#xff0c;这是 MapReduce 工…

深度剖析Java中的String类

目录 引言 String类的特性 String类的部分实现代码&#xff1a; 不可变性&#xff1a; 补充&#xff1a; 常量池&#xff1a; 不可变性的好处 创建String对象 创建String对象的常用的三种方法如下&#xff1a; 使用常量串构造&#xff08;最常用&#xff09;&#xf…

抖音滑块验证码加密的盐的位置

最近更新后之前很容易找到盐的位置的方法变了&#xff0c;抖音特意把盐隐藏起来了 {"reply": "RJC","models": "yAd8rl","in_modal": "DTn0nD2","in_slide": "ou7H0Ngda","move": …

Hystrix应用:如何在Spring Boot中使用Hystrix?

Hystrix应用&#xff1a;如何在Spring Boot中使用Hystrix&#xff1f; 引言 在微服务架构的发展过程中&#xff0c;面对复杂的服务依赖和不可预见的系统故障&#xff0c;如何提升系统的容错能力成为了一个非常急迫且重要的能力。 由 Netflix&#xff08;网飞&#xff09;公司…

基于java+springboot+vue实现的网上购物系统(文末源码+Lw+ppt)23-42

摘 要 随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决生活上的问题&#xff0c;网上购物系统展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;为…

Ubuntu-22.04安装VMware虚拟机并安装Windows10

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、VMware是什么&#xff1f;二、安装VMware1.注册VMware账号2.下载虚拟机3.编译vmmon&vmnet4.加载module5.安装bundle 三、安装Windows101.基础配置2.进阶…

【leetcode面试经典150题】50. 插入区间(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

【算法】分治-快排

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 前言1. 75. 颜色分类1.1 分析1.2 代码 2. 912. 排序数组2.1 分析2.2 代码 3. 215. 数组中的第K个最大元素3.1 分析3.2 代码 4. LCR 159. 库存管理 III4.1 分析4.2 代码 前言 分治就是分而治之 1. 75. 颜色分类 1.1 分析…

滚雪球学Java(73):Java中的引用类型: 弱引用、软引用与强引用详解

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…