移动开发框架剖析(一) 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步的处理就已经完全足够了,但是这都不是重点,重点是我们要的不是使用,而且能够“造轮子”弄懂原理!


本文转自艾伦 Aaron博客园博客,原文链接:http://www.cnblogs.com/aaronjs/p/4024819.html,如需转载请自行联系原作者

相关文章
|
17天前
|
开发框架 前端开发 Android开发
移动应用开发的未来:跨平台框架与原生系统的融合
【4月更文挑战第9天】随着移动设备成为日常生活的核心,移动应用的重要性日益凸显。本文探讨了移动应用开发的新趋势,特别是跨平台开发框架的兴起以及它们与传统移动操作系统之间的融合。分析了Flutter、React Native等流行的跨平台工具,并考察了它们如何优化性能、提高开发效率及对市场的影响。同时,文章也着眼于移动操作系统的最新进展,包括Android和iOS在兼容性、安全性和用户体验方面的创新。最后,展望了未来移动应用开发可能的方向,包括人工智能的集成、物联网的交互性以及5G网络带来的变革。
33 0
|
1月前
|
开发框架 人工智能 前端开发
移动应用开发的未来:跨平台框架与原生系统的融合
随着移动设备成为日常生活的延伸,移动应用的开发正面临着前所未有的挑战和机遇。本文将探讨当前移动应用开发的热点话题——跨平台开发框架与原生操作系统之间的互动,分析其对开发者、用户以及整个生态系统所带来的深远影响。我们将从技术演进的角度出发,讨论跨平台工具如React Native和Flutter等如何优化性能、提供更接近原生的体验,同时考察它们在解决不同移动操作系统特有问题时的有效性。此外,文中还将预测未来移动应用开发的趋势,包括人工智能、云计算及物联网技术的集成,为读者提供一个全面而深入的移动应用开发未来展望。
26 6
|
1月前
|
移动开发 前端开发 Android开发
mPaaS 常见问题之移动开发平台 mpaas的H5 前端 Kylin 框架引入vant后包特别大如何解决
mPaaS(移动平台即服务,Mobile Platform as a Service)是阿里巴巴集团提供的一套移动开发解决方案,它包含了一系列移动开发、测试、监控和运营的工具和服务。以下是mPaaS常见问题的汇总,旨在帮助开发者和企业用户解决在使用mPaaS产品过程中遇到的各种挑战
39 0
|
26天前
|
开发框架 前端开发 JavaScript
常见的移动应用开发框架有哪些?
跨平台移动开发框架概览:React Native用JavaScript构建UI;Google的Flutter打造原生体验;Ionic结合Angular与Cordova;Xamarin用C#开发iOS和Android;Apple的SwiftUI专注iOS和macOS界面;Android Jetpack提供官方工具集;Kotlin Multiplatform实现多平台共享;NativeScript用JavaScript做原生应用;Cocos2d-x则用于2D游戏开发。选择框架需考虑项目需求、平台、技术栈和团队经验。
36 3
|
1天前
|
开发框架 前端开发 搜索推荐
移动应用开发的未来:跨平台框架与原生系统的融合
【4月更文挑战第25天】随着移动设备成为日常生活的核心,移动应用开发正经历着前所未有的变革。本文探讨了移动应用开发的最新趋势,特别是跨平台开发框架的兴起以及它们如何与原生移动操作系统相结合,以提供更高效、更灵活且具有高性能的应用程序。我们将深入剖析Flutter、React Native等框架的技术细节,并讨论它们如何优化用户体验和简化开发流程。同时,将着眼于未来,预测这些技术如何塑造移动应用开发的景观。
|
1天前
|
机器学习/深度学习 开发框架 人工智能
移动应用开发的未来:跨平台框架与原生操作系统的融合
【4月更文挑战第25天】 随着移动设备的普及,移动应用已成为日常生活和商业活动的重要组成部分。本文探讨了移动应用开发的新趋势,特别是跨平台开发框架的崛起以及它们如何与原生移动操作系统相融合,以提供更高效、更优质的用户体验。我们将分析当前市场上流行的跨平台工具,如React Native、Flutter和Xamarin,并深入讨论它们在性能优化、用户界面一致性以及与原生系统功能集成方面的优势和挑战。此外,文章还将着眼于未来的技术发展,包括人工智能、机器学习在移动应用开发中的应用前景,以及这些技术如何影响开发者构建更加智能和个性化的移动体验。
|
1天前
|
开发框架 前端开发 Android开发
移动应用开发的未来:跨平台框架与原生操作系统的融合
【4月更文挑战第25天】随着移动互联网的飞速发展,移动应用已成为日常生活的重要组成部分。本文探讨了移动应用开发的当前趋势和未来展望,特别是跨平台开发框架的兴起以及它们与原生移动操作系统之间的互动。分析了Flutter、React Native等主流跨平台工具的优势与局限,并预测了未来移动应用开发可能面临的挑战和机遇。
|
5天前
|
人工智能 开发框架 5G
移动应用开发的未来:跨平台框架与原生系统的挑战
【4月更文挑战第21天】随着移动互联网的飞速发展,移动应用已成为日常生活的一部分。本文探讨了在多变的技术环境中,移动应用开发的趋势,重点关注跨平台开发框架和原生操作系统之间的竞争与合作。分析了Flutter、React Native等跨平台工具的优势与局限,以及Android和iOS在维持生态平衡中的策略。文章还预见了AI、5G技术如何重塑移动应用开发的未来,为开发者和企业提供了宝贵的市场洞见。
|
15天前
|
机器学习/深度学习 人工智能 前端开发
移动应用开发的未来:跨平台框架与原生系统之争
【4月更文挑战第11天】 随着移动互联网的飞速发展,移动应用已成为日常生活和商业活动不可或缺的组成部分。本文探讨了移动应用开发的两大趋势——跨平台移动应用框架与原生操作系统应用——之间的竞争与协作关系。文章分析了两者在性能、用户体验、开发效率及未来技术发展上的优劣,旨在为开发者和企业提供深入见解,帮助他们在选择合适的开发策略时做出更明智的决策。
|
23天前
|
人工智能 开发框架 物联网
移动应用开发的未来:跨平台框架与原生系统的融合
【4月更文挑战第3天】 随着移动互联网的迅猛发展,移动应用已成为日常生活和工作的延伸。本文深入探讨了移动应用开发领域的最新趋势,特别是跨平台开发框架与原生操作系统之间的融合。文章分析了如何通过技术创新提高开发效率,同时保证应用性能与用户体验。我们还将展望移动应用开发的未来,包括人工智能、物联网等技术如何影响移动应用的演进。

热门文章

最新文章