情况:在Cordova跨平台移动应用上使用hammer.js 2.0.4, jQuery 2.1。我遇到了点击事件延迟的问题,所以我想我应该尝试一下hammer.js。它在我的iPad上运行得很好,但在我的Android手机(Android v4.4)上却很糟糕:反应很慢,经常完全错过点击。
我实现了我自己的小点击检测(使用mouseUp事件),它在我的Android上表现得比Hammer.js好得多(但在我的iPad上表现得很糟糕)。
所以我的问题是:在Android上是否有已知的hammer.js问题,或者已知的解决方法?我真的不喜欢根据平台有条件地使用两种不同的方法,特别是当我没有办法测试所有可能的移动平台时。
hammer.js的tap代码示例;没有什么有趣的事情发生:
$(".menuitem").each( function(i, elem) {
var mc = new Hammer.Manager(elem);
mc.add(new Hammer.Tap());
mc.on("tap", action);
});
此外,还有一个覆盖整个页面的顶层滑动识别器:
var swipelistener = new Hammer($("body")[0], {
recognizers: [[Hammer.Swipe,{ direction: Hammer.DIRECTION_RIGHT }]]
});
swipelistener.on("swipe", swipeRight );
总共将有少于24个元素响应点击事件,并且没有重叠或嵌套的元素。我认为这可能与滑动识别器与点击识别器重叠有关,但删除滑动侦听器根本没有改变点击行为。
您需要使用每个识别器的设置。
hammertime.get('swipe').set({
direction: hammer.DIRECTION_ALL, threshold: 1, velocity: 0.1
});
这对我在4.1.1的滑动工作如果有人可以为tap写一些示例代码将非常有帮助,因为我还在摆弄它。
同样,您也不需要mc.add,因为默认情况下管理器拥有所有的识别器。你只需要在手动删除(使用mc.remove)一个后使用.add。
如果你不确定任何识别器有什么设置,看看他们的网站,例如http://hammerjs.github.io/recognizer-swipe/显示我可以设置方向,阈值和速度等按照上面的代码。
正如我所看到的,你需要在没有任何特定选项的情况下检测整个屏幕上的滑动。也许cordova-android-gestures(仅适用于Android)能帮到你?这个插件"捕捉"整个设备表面的手势。因此,对于detect swipes:
//check the platform
if (device.platform=="Android") {
MegaduckGestures.swiper(function(direction){
switch (direction) {
case 'rightSwipe':
//do your staff
break;
case 'leftSwipe':
//do your staff
break;
default: break;
}
});
}
else {
//use your iPad approach
}
和处理点击菜单项:
$(".menuitem").each( function(i, elem) {
//check the platform
if (device.platform=="Android") {
MegaduckGestures.swiper(function(direction){
if (direction=='singleTap') {
//do your staff
}
});
}
else {
//use your iPad approach
}
});