2010-01-06 65 views
2

我使用PhoneGap 0.8,我想检测一个基本的摇动手势。我发现两个相关的片段:如何检测PhoneGap 0.8中的摇动手势?

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

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

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

如果任何人都可以为PhoneGap提供短片段的震动检测代码,他们知道他们适合他们,我会非常感激。谢谢你的时间!

回答

3

你的第一个链接是使用PhoneGap.Gesture,据我所知在0.8中不存在(至少对iphone而言)。尽管最近可能增加了这个帖子,但这是相当近期的一篇文章。我没有使用任何以后的修订版本0.8以上

我已经通过'扩展'phonegap如下所示为phonegap应用程序添加了摇动手势支持。但首先警告:

苹果已将PhoneGap 0.8视为可接受提交给应用程序商店。由于这基本上是PhoneGap 0.8的一个扩展(尽管非常简单),可能会有被拒绝的风险。我为此开发的应用程序尚未完成审批流程,因此我无法就此进行任何进一步的建议。

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

。此外,这是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内容,只是链接后<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); 
} 
+0

感谢您的回答。这为PhoneGap扩展提供了一些很好的见解,并回答了原始问题。 – GloryFish 2010-01-12 01:07:54

+0

该应用程序最终是否通过了Apple的验收程序? – Ash 2012-03-13 15:00:27

+1

@Ash,这个项目被抛弃了,所以我从来没有找到答案。然而,由于巧合,我目前正在研究PhoneGap集成的另一个项目,PhoneGap的更新版本有一个更加可扩展的插件框架(PGPlugin),您可以使用它来代替此答案。请参阅http://wiki.phonegap.com/w/page/36753496/How%20to%20Create%20a%20PhoneGap%20Plugin%20for%20iOS – cidered 2012-03-14 13:56:12