【问题标题】:How can I detect a shake gesture in PhoneGap 0.8?如何在 PhoneGap 0.8 中检测摇晃手势?
【发布时间】:2010-01-06 04:28:49
【问题描述】:

我正在使用 PhoneGap 0.8,我想检测一个基本的摇动手势。我找到了两个相关的 sn-ps:

http://groups.google.com/group/phonegap/browse_thread/thread/25178468b8eb9e9f

http://phonegap.pbworks.com/Handling-Shake-Events

他们都不为我工作。不幸的是,文档似乎有点过时,PhoneGap 的 API 参考只是一堆测试。我知道可以做到,只是没有一个好的起点。

如果有人可以为他们知道适用于他们的 PhoneGap 提供简短的抖动检测代码,我将非常感激。感谢您的宝贵时间!

【问题讨论】:

    标签: iphone accelerometer cordova gesture-recognition shake


    【解决方案1】:

    您的第一个链接使用PhoneGap.Gesture,据我所知,在 0.8 中不存在(至少对于 iphone 而言)。这是一篇相当新的帖子,但可能是最近添加的?我没有使用任何高于 0.8 的版本

    我通过“扩展”phonegap 为 phonegap 应用添加了摇动手势支持,如下所示。但首先是一个警告:

    Apple 认为 PhoneGap 0.8 可以提交到应用商店。由于这本质上是对 PhoneGap 0.8 的扩展(尽管非常简单),因此可能存在被拒绝的风险。我为此开发的应用尚未通过审批流程,因此我无法就此提供任何进一步建议。

    另外请注意,由于使用了新的UIEventSubtypeMotionShake API,这仅适用于 OS 3.0+

    此外,这是特定于 iPhone 的。如果您想要 PhoneGap 的跨平台功能,那么这个答案可能不适合您,除非您愿意在其他平台(android 等)上实现本机端修改。在这种情况下,最好等待 iphone 上支持此功能的官方 phonegap 版本。

    将以下代码添加到PhoneGapViewController.m

    - (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
    {
        if (UIEventSubtypeMotionShake == motion)
        {
            [webView stringByEvaluatingJavaScriptFromString:@"navigator.myext.onShakeGesture();"];
        }
    }
    

    然后将其添加为 javascript 模块 myext.js

    /* We need PhoneGap.js to be loaded to work properly before we can initialise so wait for it here */
    (function() 
    {
        var timer = setInterval(function() 
        {
            if (typeof(PhoneGap == 'object'))
            {
                clearInterval(timer);
                myExtInit();
            }
        }, 1);
    })();
    
    function MyExt()
    {
        // initialization
        this.callbacks = {
            onShakeGesture: []
        };
    }
    
    /* Called by ObjectiveC side when a shake gesture is detected */
    MyExt.prototype.onShakeGesture = function()
    {
        for (var i = 0; i < this.callbacks.onShakeGesture.length; i++) 
        {
            var f = this.callbacks.onShakeGesture[i];
            f();
        }
    };
    
    MyExt.prototype.addShakeGestureListener = function(shakeCallback)
    {
        if (typeof(shakeCallback) == 'function')
        {
            this.callbacks.onShakeGesture.push(shakeCallback)
        }
    };
    
    function myExtInit()
    {
        // Init phonegap extension specific objects using PhoneGap.addConstructor
        PhoneGap.addConstructor(function() {
            if (typeof navigator.myext == "undefined") navigator.myext = new MyExt();
        });
    }
    

    现在将 myext.js 包含在您的 HTML 内容 &lt;head&gt; 部分中,紧跟在指向 phonegap.js 的链接之后

    <script type="text/javascript" charset="utf-8" src="myext.js"/>
    

    并从脚本中使用(示例会引起警报,但请执行您需要做的事情):

    function watchShake() {
      var cb = function(){
        navigator.notification.alert("Shake it!");
      };
        navigator.myext.addShakeGestureListener(cb);
    }
    

    【讨论】:

    • 感谢您的回答。这提供了对 PhoneGap 扩展的一些很好的了解以及回答原始问题。
    • @Ash,该项目被放弃了,所以我从来没有找到答案。然而,巧合的是,我目前正在开发另一个与 PhoneGap 集成的项目,而较新的 PhoneGap 版本有一个可扩展得多的插件框架(PGPlugin),您可以使用它来代替这个答案。见wiki.phonegap.com/w/page/36753496/…
    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    相关资源
    最近更新 更多