«Потряси меня» — Windows Phone 7

Posted on Февраль 23, 2011

5


Несмотря на название поста, я сегодня расскажу вам о серьезных вещах. Сейчас мы поговорим о том, как работать с акселерометром, и что есть в помощь разработчику.

На текущий момент есть сего несколько приложений, которые очень популярны и при этом используют акселерометр для ввода каких-то данных от пользователя. Как правило, акселерометр используется играх, таких как симуляторы самолетиков и гоночки, так же я встречал и магический шар, который надо трясти для получения ответов. Так же есть большое количество идей, ну например казино, игровые автоматы или рулетка, где вам необходимо будет тянуть или вращать… Вроде все просто и понятно: зафиксировал движение и добавил логику при определенном движении.

В Windows Phone есть очень хорошая поддержка акселерометра и API достаточно прост для использования. Есть даже готовые примеры от Microsoft с использованием акселерометра. Вот ссылка на C# и VB. Но это все хорошо, только для получения необработанных данных. и если вы захотите что-то типа распознавания каких-то особых «трясений» (представляю себе танец с бубном =D), вам придется все это сделать с нуля вручную.

Что же, если это вам необходимо, то сегодня ваш день!  Сегодня мы узнаем, как использовать Windows Phone Shake Gesture Library, которая использует акселерометр для определения «встряхивания» в трехмерном пространстве (т.е. по осям  – X, Y, и Z).

Давайте определим «встряхивание». Для начала, назовем это Shake, и shake — это продолжительно движение в трехмерном пространстве, при котором направление движения меняется несколько раз (представьте себе, как бармен мешает коктейль). Итак, представьте, что трясете телефон по вертикальной оси, для этого вы двигаете телефон вверх — вниз несколько раз, непрерывно. Для того, что бы определить жест, мы смотрим на следующее:

  • Так как движение продолжительное, мы встряхиваем телефон движением вверх-вниз непрерывно, потому у нас нет периодов, когда телефон перестает двигаться.
  • Движение вверх-вниз достаточно выразительное, потому оно является достаточно мощным, что бы мы могли зафиксировать встряхивание.
  • Присутствует несколько смен направления движения.

Для примера, посмотрим на изображение ниже (это визуализация полученных данных с акселерометра). Зеленая линия (ось Z) представляет собой непрерывное потряхивание, где мы видим четкую смену направления движения с четырьмя различными пиками(два с положительным значением ~1, и два с отрицательным ~(-1)). ShakeGestureLibrary распознает это как правильный жест и вызывает соответствующее событие.

Следует обратить внимание на то, что ShakeGestureLibrary работает в режиме реального времени. Вы увидите событие как только библиотека распознает жест. Алгоритм, который используется в ней не требует больших затрат CPU и памяти (по заявлению разработчиков), потому все и работает в настоящем времени.

Теперь короткое объяснение, как использовать библиотеку. Есть ссылка на AppHub, где вы сможете скачать рецепт(библиотеку), пример кода и документацию.

Использование Shake Library в вашем приложении

Когда вы скачаете библиотеку, вы найдете там ShakeGestures.dll. Теперь выполните 5 простых шагов и все готово:

1) Добавьте ссылку на ShakeGestures.dll.

2) Добавьте using ShakeGestures; в начале файла, в котором вы хотели бы использовать распознавание жестов.

3) Подпишитесь на событие:

// register shake event
ShakeGesturesHelper.Instance.ShakeGesture += new EventHandler(Instance_ShakeGesture);

// optional, set parameters
ShakeGesturesHelper.Instance.MinimumRequiredMovesForShake = 4;

4) Реализуйте метод из шага 3:


private void Instance_ShakeGesture(object sender, ShakeGestureEventArgs e)
{
    _lastUpdateTime.Dispatcher.BeginInvoke(() =>{
        _lastUpdateTime.Text = DateTime.Now.ToString();
        CurrentShakeType = e.ShakeType;
    });
}

Аргумент ShakeGestureEventArgs содержит свойство ShakeType, которое идентифицирует направление встряхивания.property that identifies the direction of the shake gesture.

5) И, активируйте ShakeGesturesHelper, который цепляется к акселерометру телефона, и начинает «слушать» события нашего сенсора.

// start shake detection
ShakeGesturesHelper.Instance.Active = true;

Заметка: Вы можете продолжать работать напрямую с акселерометром. Класс ShakeGesturesHelper не блокирует события, только прослушивает их.

Заметка: Событие ShakeGesture приезжает из другого потока, так что если вы хотите обновить интерфейс из этого события, вам следует использовать Dispatcher.BeginInvoke().

Несколько важных параметров

во время разработки библиотеки, разработчики обнаружили (неожиданно блин Оо) что жест встряхивания очень различный каждый раз. И зависит от множества параметров. Потому многие из этих параметров включены в библиотеку. Все есть в документации, а сейчас несколько из них:

ShakeMagnitudeWithoutGravitationThreshold – Любой вектор с величиной больше заданной, считается правильным для определения стряхивания.

Заметка:  В библиотеке не используется system timer для измерения времени. Вместо этого, разработчики надеются на тот факт, что сенсор Windows Phone генерирует 50 событий в секунду, потому между ними приблизительно 20 миллисекунд.

MinimumRequiredMovesForShake —  Определяет количество смен направления движения, для определения жеста.

Реклама