动开发框架剖析(二) Hammer专业的手势控制

浏览器底层并没有给元素提供类似,单击,双击,滑动,拖动这些直接可以用的控制接口,一切的手势动作都只能通过模拟出来。移动端浏览器唯一给我们提供的就只是mousedown -> mousemove -> mouseup三种最基本的事件接口。那么我们只能通过这些简单的接口模拟出复杂的手势出来。

常规的做法流程:

1.给元素上绑定三个事件,mousedown ,mousemove,mouseup

2.在交互的时候,用户只触发mousedown,mouseup没有触发mousemove,就可以单算是一次点击的动作, 这里可以是 单击,双击与长按,具体可以通过间隔的时间判断

3.如果mousemove触发了,自然就是滑动与拖动了

当然手势还要涉及到多点操作缩放与旋转的处理,就之后在讨论。


先抛开流程,我们要知道设计一个手势库需要考虑的问题,至少有2点:

1.运行的平台

2.用户的手势

那么我们可以总结市面上的终端设备有那么三种:

1 手机/pad移动端

2 pc类

3 还有种带触摸屏的电脑一类

用户的手势行为大体分:

单击tap , 双击doubletap,平移pan,滑动swipe,长按press,缩放pinch,旋转rotate


从设计的角度来讲,有着不同的兼容与选择问题,却又有着一些相同的共性与处理我们要如何去组织结构?

当然依旧是OOP设计了,抽出父类,实现继承,引入策略模式

我们看看Hammer在结构上是如何实现这类设计的

常规来说手势的处理,要分为初始化与执行期。初始化的时候构建所有相关的参与与方法

hammer源码里面分几大块:

1. Hammer类,一个简单的工厂方法,用来创建一个管理和初始化默认的识别器。Hammer.defaults配置一些基本的选项

包括针对每种识别器的配置与元素CSS属性的设置

2. Manager类,整个库的管理类。内部初始化了input输入对象,所有手势对象,元素css设置对象touchAction

3. InputHandler类,事件回调的具体加工类,用来生成包装后的事件对象与派发事件到每一个识别器

4. TouchAction类,设置元素的touchAction属性

5. Input类,事件处理类。用来处理绑定与销毁,事件句柄的回调。每一个输入类都需要继承

6. Recognizer类,所有识别器需要继承的基类

以上就是整个库的类块了,当然5与6都是属于基类继承的,在代码运行的时候就自动构建完毕了


关于继承inherit方法

hammer用的是传统的类似继承

function inherit(child, base, properties) {var baseP = base.prototype,childP;childP = child.prototype = Object.create(baseP);childP.constructor = child;childP._super = baseP;if (properties) {extend(childP, properties);}
}

只继承了原型的方法,因为原型都是共享的,如果放置属性可以被任何一个继承的子类所有修改,所以属性的继承需要用call方法

继承的子类有一个私有属性 _super指向父类,同时还能额外的扩展方法

inherit(MouseInput, Input, {handler: function MEhandler(ev){}
}

子类MouseInput继承父类Input类的所有原型方法,并扩展了handler方法


输入设备初始化继承:就是通过什么设备触发动作(PC,手机,ipad等等)

输入设备hammer分为

MouseInput,PointerEventInput,SingleTouchInput,TouchInput,TouchMouseInput

我们看看最简单的桌面PC的鼠标输入处理MouseInput,其余的结构基本类似。

function MouseInput() {this.evEl = MOUSE_ELEMENT_EVENTS;this.evWin = MOUSE_WINDOW_EVENTS;//用来禁止TouchMouse事件this.allow = true; // used by Input.TouchMouse to disable mouse events//鼠标按下的状态this.pressed = false; // mousedown stateInput.apply(this, arguments);
}inherit(MouseInput, Input, {handler: function MEhandler(ev){..//
    }
}

MouseInput初始化了几个必要的判断属性,然后就只handler方法, 此外还集成了Input输入类

比如我们调用

new MouseInput(callback)的时候,通过Input.apply(this, arguments)去初始化了基类input类,然后基类内部的init绑定了事件,并且把事件的回调,

this.domHandler指向了外部的callback回调,其实也就是handler方法了

addEventListeners(this.element, this.evEl, this.domHandler);

另一个基类就是Recognizer

因为我们把用户的行为分为单击tap , 双击doubletap,平移pan,滑动swipe,长按press,缩放pinch,旋转rotate,那么类似相同点我们也必须抽象成一个基类

Recognizer比如复杂,留在执行期的时候讲解。


Hammer 使用:

var mc = new Hammer(el);

那么内部的构建

function Hammer(element, options) {options = options || {};//配置手势识别器参数options.recognizers = ifUndefined(options.recognizers, Hammer.defaults.preset);return new Manager(element, options);
}

可见最终是Manager构建的对象实例了

Manager内部,通过createInputInstance创建一个输入环境的实例对象,创建一个输入环境的实例对象

this.input = createInputInstance(this);

createInputInstance的作用主要是用来选择当然的平台,不同的平台会调用不同的手势输入处理,这里就有策略选择了的处理了

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;}
}

如果是桌面PC端,我们就会走MouseInput

return new MouseInput(manager, inputHandler);

这样把具体的通过Input类绑定的回调放到MouseInput的handler处理了,最终的回调会进入总处理inputHandler类

inputHandler类就会遍历所有的手势识别器把输入的input传入

manager.recognize(input);

每一个识别器各自处理其行为了,当然这里面倒是如何触发,手势识别器如何判断是那种手势,就放一章了。

hammer.js教程2相关推荐

  1. hammer.js教程1

    移动开发框架剖析(一) Hammer专业的手势控制 一直在写jQuery的源码教程,都没时间研究别的框架了.Hammer是我项目御用的一个手势库,早期1.x版本的swipe事件的响应不灵敏的问题而改过 ...

  2. 使用hammer.js实现移动端手指滑动切换轮播图教程

    今天面试前端开发时,要求在移动端实现手指滑动切换轮播图 这里我用到 bootsrap 的轮播图组件 + hammer.js 库 文章参考: Hammer.js - 李林峰的园子 - 博客园 (cnbl ...

  3. Hammer.js - 旋转 拖拽 移动 缩放

    感觉移动端原生支持的 touch.tap.swipe 几个事件好像还不够用,某些时候还会用到诸如缩放.长按等其他功能. 学习了一个手势库 Hammer.js,它是一个轻量级的触屏设备手势库,能识别出常 ...

  4. javascript 手势缩放 旋转 拖动支持:hammer.js

    原文: https://cdn.rawgit.com/hammerjs/hammer.js/master/tests/manual/visual.html /*! Hammer.JS - v2.0.4 ...

  5. riot.js教程【四】Mixins、HTML内嵌表达式

    前文回顾 riot.js教程[三]访问DOM元素.使用jquery.mount输入参数.riotjs标签的生命周期: riot.js教程[二]组件撰写准则.预处理器.标签样式和装配方法: riot.j ...

  6. 移动端手势库Hammer.js学习

    感觉移动端原生支持的 touch.tap.swipe 几个事件好像还不够用,某些时候还会用到诸如缩放.长按等其他功能. 近日学习了一个手势库 Hammer.js,它是一个轻量级的触屏设备手势库,能识别 ...

  7. 移动开发框架,第【二】弹:Hammer.js 移动设备触摸手势js库

    hammer.js是一个多点触摸手势库,能够为网页加入Tap.Double Tap.Swipe.Hold.Pinch.Drag等多点触摸事件,免去自己监听底层touchstart.touchmove. ...

  8. Vue.js教程视频

    Vue.js教程视频链接 https://www.bilibili.com/video/av32611687/?p=1 https://www.bilibili.com/video/av3261168 ...

  9. hammer用法 jquery.hammer.js

    jquery.hammer.js使用时要先引入hammer.min.js 下面代码是滑动效果: $("#nav").hammer().bind('swiperight', func ...

最新文章

  1. linux shell sed中使用变量
  2. docker 挂载主机目录访问报错Permission denied 解决办法
  3. java时间戳转calender_Java获取当前时间,时间戳转换为时间格式 | 学步园
  4. labview嵌入c代码_LabVIEW与myRIO嵌入式系统开发入门
  5. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
  6. python选择排序算法图解_python基本算法之实现归并排序(Merge sort)
  7. JS 进阶知识点及常考面试题
  8. Machine Learning课程中的常见符号的含义
  9. Mac上将Lightroom目录导入Capture One的详细步骤
  10. html5修改进度条颜色,如何改变HTML5进度条
  11. 软考中级网络工程师学习技巧
  12. 3D建模除了日常工作,私下还可以赚外快哦,分分钟嗨赚
  13. [深度学习概念]·深度学习的人脸识别技术发展综述
  14. 像幅、像素数、像素尺寸关系
  15. Docker 入门,万字详解!
  16. 济南大雨,银座亲历(转载)
  17. Pro/E产品设计:电风扇扇叶的设计方法
  18. 《JAVA设计模式系列》责任链模式
  19. HTML5前端视频_React视频-张晓飞-专题视频课程
  20. 程序员应该掌握的统计学公式

热门文章

  1. P1253 [yLOI2018] 扶苏的问题 (线段树)
  2. 零知识证明之 SnarkJS 入门
  3. 监听器之jp@gc详解
  4. 【ospf-vlink虚拟连接】
  5. 数控加工零件工艺性分析
  6. 椭圆方程 matlab,五点差分法(matlab)解椭圆型偏微分方程
  7. (M)Dynamic Programming:309. Best Time to Buy and Sell Stock with Cooldown
  8. 面试问题记录 三 (JavaWeb、JavaEE)
  9. win10装sql2000卡在选择配置_Win10系统安装Sql Server 2000可能会碰到的问题【解决方法】...
  10. 汉字 字库压缩ttf