iphone - 如何在 PhoneGap 0.8 中检测摇动手势?

标签 iphone accelerometer cordova gesture-recognition shake

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

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

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

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

如果有人可以为 PhoneGap 提供一小段他们知道对他们有用的震动检测代码,我将非常感激。感谢您的宝贵时间!

最佳答案

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

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

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

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

此外,这是 iPhone 特有的。如果您想要 PhoneGap 的跨平台功能,这个答案可能不适合您,除非您愿意在其他平台(android 等)上实现 native 端修改。在这种情况下,最好等待在 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 内容中 <head> 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);
}

关于iphone - 如何在 PhoneGap 0.8 中检测摇动手势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2010956/

相关文章:

iphone - 使用 VirtualBox 在 Windows 7 机器上编译 iPhone 应用程序(通过 PhoneGap 或 Titanium)?

iphone - AudioQueueNewInput 降低 AVAudioPlayer 的播放音量

iphone - map 困惑中的多个注释

ios - 自动更新应用程序

android - 在惯性导航系统中确定航向

ios - Core Motion 加速度计显示奇怪的数据

windows-phone-7 - Windows Phone 7 上的 GPS 速度有多可靠

ios - flex mobile 4.5 或 phone gap 中 ios 的音量控制

ios - 为什么 iOS 7 会修改我在 iPad 上的 textField 的边框?

cordova - Meteor Cordova 如何阻止自动更新?