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

一直在写jQuery的源码教程,都没时间研究别的框架了。Hammer是我项目御用的一个手势库,早期1.x版本的swipe事件的响应不灵敏的问题而改过源码,2.x就已经更正过来,而且源码的结构也整个翻新了一遍,不管从逻辑还是组织结构上,我个人都觉得有必要深入,所以就当作一个系列教程一起学习吧。

本章主要讲解下使用,因为官方的API都是英文的,中文资料也相对较少,源码的分析后续再更新。

通过网方的教程还是有很多地方不是很明白的,可能需要后期看源码才能弄懂了。

Hammer.js是一个专门用于控制、定制手势的JavaScript库。它可以识别出常见的触摸、拖动、长按、缩放等等,对于希望在网页上对手势有所处理的朋友们,应该很有帮助。

官方也表明了2.0版本是完全重写,包括手势识别器、和改进支持最近的移动浏览器利用touch-action css属性。同时还支持多种设备,所以多用户成为可能。功能上更加强大了

使用上很简单,引入源码并且创建一个实例。


Hammer

var hammertime = new Hammer(myElement, myOptions);
hammertime.on(‘pan‘, function(ev) {
    console.log(ev);
});

默认设置下自动添加了,tap、doubletap、press,pan与swipe的横向滑动,多点触摸pinch与rotate手势。

pinch和rotate识别器在默认情况下都是禁用的,因为他们会有元素阻塞,但是我们可以手动开启:

hammertime.get(‘pinch‘).set({ enable: true });
hammertime.get(‘rotate‘).set({ enable: true });

当然,我们还可以为pan与swipe 开启纵向滑动

hammertime.get(‘pan‘).set({ direction: Hammer.DIRECTION_ALL });
hammertime.get(‘swipe‘).set({ direction: Hammer.DIRECTION_VERTICAL

我们能通过meta的标记,禁用doubletap /触控放大。但是新的浏览器支持touch-action属性所以可以不需要这个

<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1">


1.基本的实现

绑定一个简单的swipe事件,通过回调得到事件的响应

var mc = new Hammer(el);

mc.on(‘swipe‘,function(evt){
    console.log(evt)
})

2.改变事件处理的方向

但是默认情况下Hammer是屏蔽了上下滑动的响应的,所以我们如果只指竖向响应,就需要再配置中设置

mc.get(‘pan‘).set({
    direction: Hammer.DIRECTION_VERTICAL
});

mc.on(‘swipe‘,function(evt){
    console.log(evt)
})

我们还可以同时响应横向与竖向,除此之外,还可以单独为某个指定的识别器配置

var mc = new Hammer(el);

mc.get(‘swipe‘).set({
    direction: Hammer.DIRECTION_ALL
});

mc.on(‘swipe pan‘,function(evt){
    console.log(evt)
})

通过get方法我们可以得到指定对应的识别器,我们这里只给swipe启动了上下左右滑动的响应,那么pan事件则没开启,这种指定特定事件的处理相当的灵活

当然以上都是比较简单常见的事件处理,如果在一个元素上绑定多个不同的事件处理,那可以引入Hammer.Manager控制了

3.Hammer.Manager

我们可以通过这个Manager设置自己的识别器的实例。可以设置更多的被识别的手势。

一个复杂的多事件处理的Example https://cdn.rawgit.com/hammerjs/hammer.js/master/tests/manual/visual.html

var mc = new Hammer.Manager(myElement, myOptions);

mc.add( new Hammer.Pan({ direction: Hammer.DIRECTION_ALL, threshold: 0 }) );
mc.add( new Hammer.Tap({ event: ‘quadrupletap‘, taps: 4 }) );

mc.on("pan", handlePan);
mc.on("quadrupletap", handleTaps);

上面的示例创建一个实例包含一个pan和一个quadrupletap手势

当然如果我们同时给一个元素上 绑定多个事件用new Hammer(el);直接通过on方法也是可以实现的

但是实际上的测试效果,识别度与灵活度比Hammer.Manager低很多。

因为Manager控制里面,引入了recognizeWith与requireFailure用来关联2个相近的事件,从而提高可用性

var pinch = new Hammer.Pinch();
var rotate = new Hammer.Rotation();
pinch.recognizeWith(rotate);

当然具体内部如何实现,要等以后源码分解才知道了。官方给的说明确实太少了

最后官方还提到提供一个神秘hammer.input事件,在每一次有用户交互的时候都会被触发,可以得到非常有用的数据

hammertime.on("hammer.input", function(ev) {
   console.log(ev.pointers);
});

除此之外,还有很多参数的

比如事件对象,Directions方向,输入动作Input Events,识别器状态等等

提供的方法Utils

类似addEventListener的事件绑定与销毁

Hammer.on(window, "load resize scroll", function(ev) {
    console.log(ev.type);
});

遍历

Hammer.each([10,20,30,40], function(item, index, src) { });
合并
var options = {
    b: false
};

var defaults = {
    a: true,
    b: true,
    c: [1,2,3]
};
Hammer.merge(options, defaults);

// options.a == true
// options.b == false
// options.c == [1,2,3]
extend,inherit,bindFn等等

hammerjs确实很强大,做了市面上大多数的设备的适配,我可以看到源码中关于适配的代码就接近一半,整个源码的结构其实也是比较规整的

大多数人能用1,2步的处理就已经完全足够了,但是这都不是重点,重点是我们要的不是使用,而且能够“造轮子”弄懂原理!

时间: 2024-07-29 22:50:00

移动开发框架剖析(一) Hammer专业的手势控制的相关文章

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

浏览器底层并没有给元素提供类似,单击,双击,滑动,拖动这些直接可以用的控制接口,一切的手势动作都只能通过模拟出来.移动端浏览器唯一给我们提供的就只是mousedown -> mousemove -> mouseup三种最基本的事件接口.那么我们只能通过这些简单的接口模拟出复杂的手势出来. 常规的做法流程: 1.给元素上绑定三个事件,mousedown ,mousemove,mouseup 2.在交互的时候,用户只触发mousedown,mouseup没有触发mousemove,就可以单算是一次

利用手势控制动画的进度

最近在研究一个项目,利用手势控制动画的进度,发现简单的还可以,如果遇到了复杂的情况就比较麻烦了,ios7新出了一个特性,可以利用NavigationController的自定义转场动画,提供进度来控制. //这个方法控制转场动画的进度 - (id <UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController               

Unity3D中使用Leap Motion进行手势控制

Leap Motion作为一款手势识别设备,相比于Kniect,优点在于精确度. 在我的毕业设计<场景漫游器>的开发中,Leap Motion的手势控制作为重要的一个环节.以此,谈谈开发中使用Leap Motion进行手势识别的实现方式以及需要注意的地方. 一.对Leap Motion的能力进行评估 在设定手势之前,我们必须知道Leap Motion能做到哪种程度,以免在设定方案之后发现很难实现.这个评估依靠实际对设备的使用体验,主要从三个方面: 1.Leap Motion提供的可视化的手势识

错误总结之播放器(vitamio)音量实体键与触摸手势控制,音量调节冲突

这个可是独家心得:经过几天的网上资料查询未果,在群里遇到一同行.然后让他帮我看了看,最终解决了该冲突.此时,谨以此来感谢那位同僚的热情帮助: 说说这个问题吧: 目前我在做一款影视方面的项目,在该项目中肯定是要用到视频播放这一块,视频播放是引用了vitamio类库,播放页面使用的是SurfaceView控件.然后在视频播放的期间,有这些要求:手势滑动调节音量.当我费劲千辛万苦搞定之后,没有想到却遇到了按音量实体键的时候播放页面退出的冲突问题.那么怎么解决该问题呢?很简单,几行代码的事情. 返回键监

前端手势控制图片插件书写一

1.前端图片处理需求场景   前端图片处理应用在很多方面,在做业务过程中我也遇到了以下问题用到前端图片处理插件. 头像上传 背景图片上传 信用卡的Diy卡面上传 H5贴纸及合成 2.手势控制的数学知识 如果想要做图片旋转放大和拖动操作,一定会涉及到移动端的手势识别和手势操作. 在移动端控制图片操作中涉及到以下几个手势:单指拖动,单指缩放,单指旋转,双指缩放,双指旋转这五种手势 . 下面来介绍下如果使用向量来识别手势. 下图是单指在图片上旋转缩放时的示意图.只需要算出bs向量和bs'向量的夹角和他

用DrawerLayout(Support Library 4提供)开发侧边栏,有没有什么方法关闭手势控制?

============问题描述============ 用android.support.v4.widget.DrawerLayout开发了一个抽屉效果的侧边栏,有没有什么方法可以关闭它的手势操作(就是从左往右划),找遍了它提供的方法,还是没找到. ============解决方案1============ mDrawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);

使用Vitamio打造自己的Android万能播放器(2)—— 手势控制亮度、音量、缩放

前言 本章继续完善播放相关播放器的核心功能,为后续扩展打好基础. 声明 欢迎转载,但请保留文章原始出处:) 博客园:http://www.cnblogs.com 农民伯伯: http://over140.cnblogs.com 系列 1.使用Vitamio打造自己的Android万能播放器(1)——准备 正文 一.实现目标 1.1 亮度控制 模仿VPlayer界面: 1.2 声音控制 模仿VPlayer界面: 1.3 画面缩放 根据下面API提供画面的拉伸.剪切.100%.全屏 二.Vitami

【转载】Unity3D研究院之IOS触摸屏手势控制镜头旋转与缩放

前几篇文章介绍了很多Unity3D引擎自身的一些问题, 今天我们在回到IOS设备上讨论一些触摸屏幕手势,本章的目标是通过触摸iPhone屏幕手势 实现模型左右的旋转,与模型的缩放. 大家想一想模型的旋转,实际上是镜头的旋转.模型的缩放实际上是镜头Z轴方向的坐标.那么实现本章的内容只需要控制镜头的位置方可实现. 我们创建一个简单的游戏平面, 然后平面中放一个箱子做为旋转缩放的参照物.如下图所示,选中摄像机,给摄像机添加一个脚本名称为Move. 脚本中有一个参数 Target,它的作用是设置摄像头旋

手势控制四轮智能车移动

视频请看这里 1. 输入设备 这里使用的是Andriod手机,根据加速计的来推测手势:停止,前进,后退,左右转向 2. 手机与智能车通讯 智能车上的树莓派运行一个tornado web service, 当检测到一个动作后通过http访问url即可.该web service可以驱动轮子转动