Hammer.js分析(三)——input.js
input.js是所有input文件夹中类的父类,浏览器事件绑定、初始化特定的input类、各种参数计算函数。
Input父类和其子类就是在做绑定事件,各种参数计算、整合、设置等返回自定义事件对象,交给识别器的相关对象使用。
一、Input父类

Input相当于一个抽象类,对象中总共有3个方法
1)handler(ev)
这相当于一个抽象方法,在上图中的6个子对象里,都会实现这个方法。
ev是事件对象(不是自定义的那个),例如触屏事件中就是 TouchEvent。
2)init()与destroy()
绑定事件,在各个子对象都会设置:
evEl、evTarget 或 evWin 事件类型字符串,字符串中有空格就是多个事件。
element、target 或 getWindowForElement(this.element) 就是需要绑定事件的对象。
domHandler 是在构造函数中定义的,就是执行子集重写过的 handler 方法。里面有个判断,“enable” 可以控制是否执行事件。
this.domHandler = function(ev) {
if (boolOrFn(manager.options.enable, [manager])) {
self.handler(ev);
}
};
二、input.js中的函数
1)createInputInstance(manager)
根据特性选择创建对象,可指定也可以根据浏览器特性自动绑定。在Manager的构造函数中会被调用。
var MOBILE_REGEX = /mobile|tablet|ip(ad|hone|od)|android/i;
var SUPPORT_TOUCH = ('ontouchstart' in window);
var SUPPORT_POINTER_EVENTS = prefixed(window, 'PointerEvent') !== undefined;
var SUPPORT_ONLY_TOUCH = SUPPORT_TOUCH && MOBILE_REGEX.test(navigator.userAgent); function createInputInstance(manager) {
var Type;
var inputClass = manager.options.inputClass;//自定义的函数 if (inputClass) {
Type = inputClass;
} else if (SUPPORT_POINTER_EVENTS) {
Type = PointerEventInput;
} else if (SUPPORT_ONLY_TOUCH) {
Type = TouchInput;
} else if (!SUPPORT_TOUCH) {
Type = MouseInput;
} else {
Type = TouchMouseInput;
}
return new(Type)(manager, inputHandler);//inputHandler是input.js中的一个函数
}
2)inputHandler(manager, eventType, input)
a. 在每个子类(touch.js中的TouchInput等)的构造函数中,都会执行“Input.apply(this, arguments);”,调用父类(input.js中的Input)的构造函数。
b. 在上一个函数中会将 inputHandler 传入到子类的构造函数中,这样的话父类中的 callback 就等于是 inputHandler。
c. 每个子类中的 handler 方法都会调用 callback 函数。
在每个子类中都会有类似的Map值,key是事件名,value是整数:
var TOUCH_INPUT_MAP = {
touchstart: INPUT_START,
touchmove: INPUT_MOVE,
touchend: INPUT_END,
touchcancel: INPUT_CANCEL
};
函数内容如下:
function inputHandler(manager, eventType, input) {
var pointersLen = input.pointers.length;
var changedPointersLen = input.changedPointers.length;
var isFirst = (eventType & INPUT_START && (pointersLen - changedPointersLen === 0));
var isFinal = (eventType & (INPUT_END | INPUT_CANCEL) && (pointersLen - changedPointersLen === 0));
//设置自定义事件对象的参数
input.isFirst = !!isFirst;
input.isFinal = !!isFinal;
if (isFirst) {
manager.session = {};
}
//设置 eventType,例如 'touchstart, mouseup, pointerdown'的对应整数,通过上面的Map值获取到
input.eventType = eventType;
//计算旋转、比例、角度、距离等信息
computeInputData(manager, input);
//执行隐藏的事件,这个在会在每个事件中调用,例如 'touchstart, mouseup, pointerdown'等
manager.emit('hammer.input', input);
manager.recognize(input);//执行Manager对象中的recognize方法
manager.session.prevInput = input;
}
3)computeDeltaXY(session, input)
经过计算的X与Y轴坐标,有正数和负数,以某个点为原点,画坐标轴。如下图所示:

以prevDelta的X和Y作为原点,center中的X和Y会随着移动而改变,offset就是第一次接触屏幕的点的clientX与clientY。
center是通过函数“getCenter(pointers)”获得的。
4)其他技术函数
1. getCenter(pointers):通过clientX和clientY,以及点的个数,计算所有点的中心坐标,没有负数
2. getVelocity(deltaTime, x, y):计算两个点之间的移动速度
3. getDirection(x, y):判断一个点到另外一个点的移动方向
4. getDistance(p1, p2, props):计算两个点之间的直线距离
5. getAngle(p1, p2, props):计算两个点之间的夹角
6. getRotation(start, end):计算两个点集之间的旋转度
7. getScale(start, end):计算两个点集之间的比例
三、自定义的input事件对象
在前面一篇“manager.js”的分析中,提到了自定义事件对象,里面还包括各种计算过的参数。
1)事件对象

2)移动方向常量
之所以是1,2,4,8,16是为了方便位运算。
var DIRECTION_NONE = 1;
var DIRECTION_LEFT = 2;
var DIRECTION_RIGHT = 4;
var DIRECTION_UP = 8;
var DIRECTION_DOWN = 16;
3)事件类型常量
var INPUT_START = 1;
var INPUT_MOVE = 2;
var INPUT_END = 4;
var INPUT_CANCEL = 8;
4)具体说明
|
Name |
Value |
|
angle |
移动角度 |
|
center |
多点触控的中心位置,或者单点的坐标 |
|
changedPointers |
改变了的触摸点数组,例如touchend中的事件中的事件对象TouchEvent里的changedTouches |
|
deltaTime |
交互过程的总时长(ms) |
|
deltaX |
经过计算后的X轴坐标点(参考computeDeltaXY) |
|
deltaY |
经过计算后的Y轴坐标点(参考computeDeltaXY) |
|
direction |
移动方向(参考移动方向常量) |
|
distance |
移动距离 |
|
eventType |
事件类型(参考事件类型常量) |
|
isFinal |
当前交互是否为最后一次(boolean) |
|
isFirst |
当前交互是否为首次(boolean) |
|
maxPointers |
最大触摸点数量 |
|
offsetDirection |
从起始点算起的移动方向(参考移动方向常量) |
|
overallVelocityX |
deltaX坐标点的移动速度 |
|
overallVelocityY |
deltaY坐标点的移动速度 |
|
overallVelocity |
比较overallVelocityX与overallVelocityY,选取绝对值大的那个 |
|
pointerType |
触摸点类型(touch、pen、mouse 或 kinect) |
|
pointers |
触摸点数组,例如touchend中事件对象TouchEvent里的touches属性 |
|
rotation |
多点触摸结束时的旋转数值,若为单点触摸则为0 |
|
scale |
多点触摸结束时的缩放比例,若为单点触摸则为1 |
|
srcEvent |
源事件对象(类型为TouchEvent、MouseEvent或PointerEvent) |
|
target |
接收事件的目标,上图中就是 document.getElementById('layer') |
|
timeStamp |
当前时间戳 |
|
velocityX |
(input.deltaX - last.deltaX)计算后X坐标点的移动速度 |
|
velocityY |
(input.deltaY - last.deltaY)计算后Y坐标点的移动速度 |
|
velocity |
比较velocityX与velocityY,选取绝对值大的那个 |
demo源码下载:
http://download.csdn.net/download/loneleaf1/9429375
参考资料:
http://tech.gilt.com/2014/09/23/five-things-you-need-to-know-about-hammer-js-2-0/
FIVE THINGS YOU NEED TO KNOW ABOUT HAMMER.JS 2.0
http://www.cnblogs.com/iamlilinfeng/p/4239957.html Hammer.js
http://colinued.leanote.com/post/%E7%A7%BB%E5%8A%A8%E7%AB%AF%E6%89%8B%E5%8A%BF%E5%BA%93hammerJS-2.0.4%E5%AE%98%E6%96%B9%E6%96%87%E6%A1%A3%E7%BF%BB%E8%AF%91 移动端手势库hammerJS-2.0.4
Hammer.js分析(三)——input.js的更多相关文章
- js分析 快速定位 js 代码, 还原被混淆压缩的 js 代码
-1.目录 0.参考 1.页面表现 2. 慢镜头观察:低速网络请求 3. 从头到尾调试:Fiddler 拦截 index.html 并添加 debugger; 4. 快速定位 js 代码 5. 还原被 ...
- Hammer.js分析(二)——manager.js
“Manager”是所有识别器实例的容器,它为你设置的元素安装了交互事件监听器,并设置了触摸事件特性. manager.js中的代码会涉及到input.js和recoginzer.js中的内容,这里会 ...
- angular源码分析:injector.js文件分析——angular中的依赖注入式如何实现的(续)
昨天晚上写完angular源码分析:angular中jqLite的实现--你可以丢掉jQuery了,给今天定了一个题angular源码分析:injector.js文件,以及angular的加载流程,但 ...
- 【转】关于URL编码/javascript/js url 编码/url的三个js编码函数
来源:http://www.cnblogs.com/huzi007/p/4174519.html 关于URL编码/javascript/js url 编码/url的三个js编码函数escape(),e ...
- 关于URL编码/javascript/js url 编码/url的三个js编码函数
关于URL编码/javascript/js url 编码/url的三个js编码函数escape(),encodeURI(),encodeURIComponent() 本文为您讲述关于js(javasc ...
- 前端总结·基础篇·JS(三)arguments、callee、call、apply、bind及函数封装和构造函数
前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 前端总结·基础篇·JS(一)原型.原型链.构造函数和字符串(String) 前 ...
- 初学node.js有感三
WebStorm下的node.js 一.回顾与继续 在前面,我们知道了node.js的基本框架和思路,在这些原生环境下我们对node.js的设计思想有了比较深刻的认识,并且具有了编写大型程 ...
- HTML5结合CSS的三种方法+结合JS的三种方法
HTML5+CSS: HTML中应用CSS的三种方法 一.内联 内联样式通过style属性直接套进HTML中去. 示例代码 <pstylepstyle="color:red" ...
- js分析 汽_车_之_家 js生成css伪元素 hs_kw44_configUS::before
0.参考 https://developer.mozilla.org/zh-CN/docs/Web/CSS/Pseudo-elements https://developer.mozilla.org/ ...
随机推荐
- POJ 2519
又是一个水题?? 不过还是弄是很久... 在蒟蒻的路上越走越远 , 好了讲题 新生晚会 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: ...
- mysql之触发器trigger
触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/befo ...
- TreeView 使用方法:(在View.Details模式下)
1.建立TreeView的標題 2.建立TreeView的Item 3.在TreeView的Item中的建立SubItem 如果將各部 ...
- nginx 软连接
ln -s 目标地址 源地址 ln -s ../../../web-admin/etc/nginx-location.conf web-admin.conf
- Code First开发系列之领域建模和管理实体关系
返回<8天掌握EF的Code First开发>总目录 本篇目录 理解Code First及其约定和配置 创建数据表结构 管理实体关系 三种继承模式 本章小结 自我测试 本篇的源码下载:点击 ...
- Code First开发系列实战之使用EF搭建小型博客平台
返回<8天掌握EF的Code First开发>总目录 本篇目录 理解应用需求 数据库设计 创建实体数据模型 创建实体类 创建关系和导航属性 实现DbContext类 执行数据访问 理解仓储 ...
- ASP.Net WebForm温故知新学习笔记:一、aspx与服务器控件探秘
开篇:毫无疑问,ASP.Net WebForm是微软推出的一个跨时代的Web开发模式,它将WinForm开发模式的快捷便利的优点移植到了Web开发上,我们只要学会三步:拖控件→设属性→绑事件,便可以行 ...
- 探索c#之storm的TimeCacheMap
阅读目录: 概述 算法介绍 清理线程 获取.插入.删除 总结 概述 最近在看storm,发现其中的TimeCacheMap算法设计颇为高效,就简单分享介绍下. 思考一下如果需要一个带过期淘汰的缓存容器 ...
- 当程序以Windows Services形式启动时当前路径不对
当程序以Windows Services形式启动时当前路径不对 @(操作系统)[博客|dotNet] 很多时候我们需要将我们的程序写成利用Windows服务的形式来让它能够自启动.今天遇到一个问题,当 ...
- 优化MySchool数据库设计之【巅峰对决】
优化MySchool数据库设计 之独孤九剑 船舶停靠在港湾是很安全的,但这不是造船的目的 By:北大青鸟五道口原玉明老师 1.学习方法: 01.找一本好书 初始阶段不适合,可以放到第二个阶段,看到知识 ...