Существует огромное число мобильных приложений, использующих акселерометр в качестве основного способа получения информации от пользователя. Наиболее часто этот способ используется в симуляторах вождения или полёта. Но есть и другие приложения/игры, в которых он может использоваться. Например, шар, который при встряске телефона даёт правильный ответ на любой вопрос, или эмулятор слот-машины казино, в котором барабаны начинают вращаться после того, как вы встряхнёте телефон. Понятно, как им пользоваться – просто потрясите телефон и действие совершится.


Windows Phone обладает очень хорошей поддержкой акселерометра, а его API относительно простой. Использование API предоставит вам доступ только к основным возможностям, но если необходимо применить определённую логику и жесты, вам придётся поработать над этим самостоятельно.

К счастью, задача не такая уж и сложная, поскольку разработчиками Windows Phone создана библиотека жестов встряски (или шейк-жестов), и акселерометр устройства способен определить движение телефона в трёхмерном пространстве (по трёх осям – x, y, z).

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

  • Это движение продолжается во времени, то есть перемещение телефона происходит беспрерывно
  • Движение телефона вверх и вниз производится осмысленно, то есть с достаточной силой для того, чтобы быть распознанным в качестве жеста
  • В процессе возникают изменения движения, то есть телефон движется вверх и вниз. То же самое относится к случаям, когда телефон движется влево и вправо или вперёд и назад

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

Захваченные с акселерометра данные
Захваченные с акселерометра данные

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

Подробнее описание использования библиотеки можно прочитать здесь, а саму библиотеку, примеры и документацию качаем отсюда.

Использование ShakeGestureLibrary в приложении

Скачайте библиотеку, в ней находится файл ShakeGestures.dll. Следуйте инструкции:

  1. Добавьте ссылку на библиотеку шейк-жестов: ShakeGestures.dll
  2. Добавьте утверждение using к заголовку файла: using ShakeGestures;
  3. Зарегистрируйте в событии ShakeGesture:// register shake event
    ShakeGesturesHelper.Instance.ShakeGesture += new
    EventHandler(Instance_ShakeGesture);

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

  4. Примените обработку события ShakeGesture с шага 3:
    private void Instance_ShakeGesture(object sender, ShakeGestureEventArgs e)
    {
    _lastUpdateTime.Dispatcher.BeginInvoke(
    () =>
    {
    _lastUpdateTime.Text = DateTime.Now.ToString();
    CurrentShakeType = e.ShakeType;
    });
    }
    ShakeGestureEventArgs использует свойства ShakeType, который определяет направление шейк-жеста.
  5. И, наконец, активируйте помощник жестов встряски, который привязывается к акселерометру и начинает фиксировать входящие события сенсора.// start shake detection
    ShakeGesturesHelper.Instance.Active = true;

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

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

Несколько важных параметров конфигурации

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

Отсюда можно скачать полную документацию по всем параметрам библиотеки. Вот лишь несколько примеров:

  • ShakeMagnitudeWithoutGravitationThreshold – Любой вектор размером (силой) больше заданной величины считается валидным вектором встряски.
  • MinimumShakeVectorsNeededForShake – Определяет число векторов встряски необходимых для распознания «сегмента встряски».Примечание: Для измерения времени не используется системный таймер. Разработчики использовали тот факт, что сенсор телефона генерирует около 50 запросов в секунду, то есть интервал между запросами составляет примерно 20 мсек. Таким образом, 5 событий происходят за 100 мсек. Код библиотеки написан на основе именно этих интервалов, а не реального времени.
  • MinimumRequiredMovesForShake – Определяет число изменений, необходимое в направлении сегмента встряски для получения сигнала встряски. Этот параметр можно представить в виде числа пиковых значений (положительных и отрицательных), необходимых для вызова жеста встряски.

via windowsteamblog

Система Orphus