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相关推荐

  1. 【js】三种JS截取字符串方法

    JS提供三个截取字符串的方法,分别是:slice(),substring()和substr() 使用一个参数 var stmp = "rcinn.cn";stmp.slice(3) ...

  2. python转js解释器_python 代码转换 js

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 推荐使用腾讯云 api 配套的7种常见的编程语言 sdk,已经封装了签名和请求过 ...

  3. 3、Spark 和 D3.js 分析航班大数据

    实验资源 1998.csv airports.csv 实验环境 VMware Workstation Ubuntu 16.04 spark-2.4.5 scala-2.12.10 实验内容 " ...

  4. python爬虫之网易云歌曲下载(需要js分析) -- 2020.06.20更新

    背景 目的 >>> 通过python + kivy打包一个简易的网易云会员歌曲下载软件; 初试 >>> 用you-get库里面的网易云接口来实现下载; 失败 > ...

  5. [JS 分析] 汽_车_之_家 JS 生成 CSS 伪元素 hs_kw44_configUS::before

    0.参考 https://developer.mozilla.org/zh-CN/docs/Web/CSS/Pseudo-elements https://developer.mozilla.org/ ...

  6. webpack常用的三种JS压缩插件

    这里 讲解 三种JS 打包插件: (1)UglifyJS 支持: babel present2015.webpack3 缺点: 它使用的是单线程压缩代码,也就是说多个js文件需要被压缩,它需要一个个文 ...

  7. [JS 分析] 天_眼_查 字体文件

    0. 参考 js分析 猫_眼_电_影 字体文件 @font-face 1. 分析 1.1 定位目标元素 1.2 查看网页源代码 1.3 requests 请求提取得到大量错误信息 对比猫_眼_电_影抓 ...

  8. javascript-入门篇-使用js的三种方式

    练习题: 弹出窗口,提示语句"hello js" <script>alert("hello js"); </script> javasc ...

  9. php js对话框,JavaScript_js弹出框、对话框、提示框、弹窗实现方法总结(推荐),一、JS的三种最常见的对话框- phpStudy...

    js弹出框.对话框.提示框.弹窗实现方法总结(推荐) 一.JS的三种最常见的对话框 //====================== JS最常用三种弹出对话框 ==================== ...

最新文章

  1. 查询分页的几种Sql写法
  2. 重温C# clr 笔记总结
  3. Python 编码规范 TODO注释
  4. 修改ONET.XML自定义SPS站点
  5. GraphAPI 1.0中新增加的Teams API
  6. 数据结构练习 00-自测3. 数组元素循环右移问题 (20)
  7. 搜索 —— 启发式搜索 —— A* 算法
  8. java实现qq自动添加好友
  9. vuex mysql_Vue插件---Vuex(仓库,数据库)
  10. python 密度聚类 使用_使用python+sklearn实现硬币图像上的结构化Ward层次聚类演示...
  11. 基于channel的goroutine
  12. 分布式系统关注点(3)——过去这几十年,分布式系统的「数据一致性」精华都在这了!...
  13. C# 调用mschart控件
  14. BCM94360Z4刷蓝牙固件魔改, Mac真正免驱无线网卡,实现原装网卡一样完美黑苹果,啊哈哈
  15. HikariCP数据库连接池详解
  16. 环境与设备监控计算机套定额,第三章建筑设备监控系统安装工程定额.doc
  17. ZoomIt 屏幕放大 缩小 屏幕画笔 演示 手写笔迹 倒计时 秒变白板 pointofix
  18. 机器学习Sklearn Day1
  19. Typora 如何自动生成标题序号
  20. 圣光机大学计算机专业,25位师生顺利完成圣光机大学实习项目

热门文章

  1. 《论文笔记》Multi-UAV Collaborative Monocular SLAM
  2. 同步异步 阻塞 非阻塞 异步调用 线程队列 协程
  3. 引入mui后,radio单选框不可点击问题解决
  4. cookies与session
  5. 作为面试官的一些经历,希望能给找工作的朋友一些参考
  6. 开源一站式移动应用生成平台Jingub系列(0):背景资料介绍
  7. repeater的嵌套(转+总结)[http://www.cnblogs.com/esshs/archive/2005/04/07/132825.html]
  8. JS 取得当前时间日期
  9. 详解自然语言处理5大语义分析技术及14类应用(建议收藏)
  10. 《新一代人工智能发展白皮书(2017年)》重磅发布(100页完整版PPT)