有没有一款适用于三星Galaxy Tab的JavaScript手势库?

10

我一直在尝试使用JavaScript手势库。它们在iPad mini上都很好用,但是当我在我的三星Galaxy Tab(GT-P7510,Android 4.04)上尝试时,结果最多也只是偶尔成功。

我在竖屏模式下得到的最好结果。在横屏模式下,几乎什么都不起作用。

我已经尝试过以下库,其中所有库都来自于这篇文章:http://www.queness.com/post/11755/11-multi-touch-and-touch-events-javascript-libraries

  • hammer.js
  • quo.js
  • touchy
  • doubletap
  • jgestures
  • touchswipe

Touchswipe效果最好,但其他所有库都无法正常工作。

Hammer页面有一个演示,在iPad上可以正常工作,但在安卓设备上却不行:

http://eightmedia.github.com/hammer.js/

那么,有人知道我如何使Galaxy上的滑动手势正常工作吗?

我查看了之前stackoverflow问题指向的quirksmode页面,但该页面已过时且不再维护,据我所知也没有提到任何库。


你已经在使用JavaScript库了吗?目前我正在开发一个jQuery UI项目,为了添加手势功能,我使用了「jQuery UI Touch Punch」,它与iPad和Android非常兼容。http://touchpunch.furf.com/ - Cholesterol
我对新的Sencha框架 http://www.sencha.com/products/touch 感到非常惊讶。我认为它的核心仍然是Ext JS... - Preexo
我认为这个问题很可能会被关闭:请参见“为什么‘购物清单’问题不好?”(http://meta.stackexchange.com/questions/158809/why-are-shopping-list-questions-bad/158810#158810) - Cholesterol
抱歉,但我不同意。那个元讨论中提出的论点在这里并不适用。首先,我还没有收到答案! - Relaxing In Cyprus
关于Touch Punch,我不知道如何使用它来实现滑动手势。如果我有一个现有的操作,比如拖放,我想让它在平板电脑上工作,那么这将是可以的,但是我想在没有现有操作的情况下使滑动手势起作用。例如,在图像上滑动以获取下一张图像。就是这样的事情。 - Relaxing In Cyprus
3个回答

2
我对这个很幸运:

https://github.com/HotStudio/touchy

它有长按、捏合、旋转和滑动手势,代码相当容易定制。
请注意,手势的组合需要处理——例如,滑动几乎总会触发长按,因此您必须设置标志或以其他方式处理它。

另外,如果你还没有尝试过,请查看仓库中的开发分支——它有一些更新,对我很有帮助。 - NoelHunter
今晚我会进行实验,然后告诉你我的进展情况。 - Relaxing In Cyprus
太好了!终于成功了。非常感谢你指引我正确的方向。即使我改变方向,它也能正常工作。 - Relaxing In Cyprus

1
我知道这是一个老问题,但我尝试了几个库,都不满意,所以我自己开发了一个。它使用MIT许可证,并可在以下网址获取:

https://github.com/aerik/GestureListener.js

有一个测试/演示页面,位于

http://aerik.github.io/GestureListener/example.htm

我经常在我的Galaxy S4手机、几个iPad和多个Windows 8触摸设备上使用它。我们正在工作中使用它来进行生产软件。
欢迎提交Bug报告(附带示例)。

1

这是一个CodePen手势比较工具。http://jsfiddle.net/icoxfog417/uQBvP/

经过大量的工作,我们放弃了Hammer.JS,并转向使用Quo,我们发现它还不错。事情可能已经改变并且不同了。

  document.head.insertAdjacentHTML( 'beforeEnd', '<meta name="viewport" content="target-densitydpi=device-dpi,width=device-width,initial-scale=1.0" />' );

$(function(){
  //initialization 
  $(".detector").bind("click touchstart",function(e){
    $(".detector").removeClass("selected");
    $(this).addClass("selected");

    unbindLibrary();
    bindLibrary($(this).prop("id"));
  });

  //bind library to gesture pad
  bindLibrary = function(id){
    var $pad = $("#gesture-pad");
    var events = [];
    var eventStr = "";
    $("#" + id + "List li").each(function(){
      events.push($(this).text());
    })
    //make target event list from each library's gestureList
    eventStr = events.join(" ");

    switch(id){
      case "hammer":
        hammer = Hammer($pad.get(0), {
          prevent_default: true
        })
        .on(eventStr, logEvent);
        break;
      case "quojs":
        for(var i = 0;i<events.length;i++){
          $$("#gesture-pad").on(events[i], logEvent);
        }
        $$("#gesture-pad").on("touchstart",function(e){
          e.preventDefault();
        });
        break;
      case "touchSwipe":
        var options = {};
        var touchSwipeHandler = function(name){
          if(name.indexOf("pinch") < 0){
            return function(event, distance, duration, fingerCount){ 
                     var e = {}; e["type"] = name; logEvent(e);        
                   };
          }else{
            return function(e, direction, distance, d, f, pinchZoom){ 
                     var e = {}; e["type"] = name; logEvent(e);        
                   };
          }
        };

        for(var i = 0;i<events.length;i++){
            options[events[i]] = new touchSwipeHandler(events[i]); 
        }
        $pad.swipe(options);
        break;
      case "touchy" :
        var handler = function(name){
            return function(event, phase, $target, data){
                     var e = {}; e["type"] = name; logEvent(e);
                   }
        }
        for(var i = 0;i<events.length;i++){
            $pad.bind(events[i],new handler(events[i]));
        }
        break;      
    }
  }

  //unbind library from gesture pad
  unbindLibrary = function(){
    var element = $("#gesture-pad").clone();
    $("#gesture-pad").replaceWith(element);
    $(".gesturelist .selected").removeClass("selected");
  }

  //log detected gesture
  logEvent = function(e){
    $("#detected").text(e.type);
    var selected = $(".detector.selected").prop("id");
    $("#" + selected + "List li").each(function(){
        if($(this).text() == e.type){
            $(this).addClass("selected");
`enter code here`        };
    })          
    return false;
  }

  $(".detector").first().addClass("selected");
  bindLibrary($(".detector.selected").prop("id"));

})

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接