Как я могу обнаружить жест встряхивания в PhoneGap 0.8? - PullRequest
2 голосов
/ 06 января 2010

Я использую PhoneGap 0.8, и я хотел бы обнаружить базовый жест встряхивания. Я нашел два соответствующих фрагмента:

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

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

Никто из них не работает на меня. К сожалению, документация кажется немного устаревшей, а справка по API для PhoneGap - это просто набор тестов. Я знаю, что это можно сделать, но у меня просто нет хорошей отправной точки.

Если кто-то может предоставить короткий фрагмент кода обнаружения встряхивания для PhoneGap, который, как они знают, работает для них, я был бы очень признателен. Спасибо за ваше время!

1 Ответ

3 голосов
/ 07 января 2010

Ваша первая ссылка использует PhoneGap.Gesture, которого, насколько я вижу, не существует (по крайней мере, для iphone) в 0.8. Это довольно недавний пост, хотя, возможно, он был добавлен недавно? Я не использовал более позднюю ревизию, чем 0.8

Я добавил поддержку жестов встряхивания к приложению телефонной щели, «расширив» телефонную щель следующим образом. Но сначала предупреждение:

Apple считает PhoneGap 0.8 приемлемым для отправки в магазин приложений. Поскольку это, по сути, расширение (хотя и очень простое) для PhoneGap 0.8, может быть риск отклонения. Приложение, для которого я разработал это приложение, еще не прошло процесс утверждения, поэтому я не могу давать дальнейшие рекомендации по этому вопросу.

Также имейте в виду, что это работает только на OS 3.0+ из-за использования нового UIEventSubtypeMotionShake API

Кроме того, это зависит от iPhone. Если вам нужны кроссплатформенные возможности PhoneGap, этот ответ может быть не для вас, если вы не знакомы с реализацией модификации нативной стороны на других платформах (Android и т. Д.). В этом случае, возможно, лучше подождать официального релиза телефонного промежутка, который поддерживает это на iphone.

Добавьте следующий код в 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);
}
...