Как определить жест встряхивания в PhoneGap 0.8?

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

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

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

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

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


person GloryFish    schedule 06.01.2010    source источник


Ответы (1)


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

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

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

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

Кроме того, это специфично для iPhone. Если вам нужны кросс-платформенные возможности PhoneGap, этот ответ может быть не для вас, если вам не удобно реализовывать модификацию нативной стороны на других платформах (Android и т. д.). В этом случае может быть лучше просто дождаться официального выпуска phonegap, который поддерживает это на 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);
}
person cidered    schedule 07.01.2010
comment
Спасибо за этот ответ. Это дает хорошее представление о расширениях PhoneGap, а также отвечает на исходный вопрос. - person GloryFish; 12.01.2010
comment
@ Эш, проект был заброшен, поэтому я так и не узнал. Однако по счастливому стечению обстоятельств в настоящее время я работаю над другим проектом с интеграцией PhoneGap, и более новые сборки PhoneGap имеют гораздо более расширяемую структуру плагинов (PGPlugin), которую вы можете использовать вместо этого ответа. См. wiki.phonegap.com /w/страница/36753496/ - person cidered; 14.03.2012