Применение акселерометра

Flash Player 10.1 и более поздних версий, Adobe AIR 2 и более поздних версий

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

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

Рекомендации Adobe

Flash Pro CS5.5 Mobile (Android/iOS) – Part 2: Project 2 Accelerometer and Debugging (Flash Pro CS5.5 Mobile (Android/iOS) – часть 2: проект 2. Акселерометр и отладка)

Антонио Холгуин (Antonio Holguin)

AIR and the Accelerometer (AIR и акселерометр)

Микаэль Шез (Michaël Chaize)

Air for Android: Accelerometer (AIR for Android: акселерометр)

Джонатан Кампос (Jonathan Campos)

Проверка наличия поддержки акселерометра

Используйте свойство Accelerometer.isSupported , чтобы проверить наличие поддержки этой функции в среде выполнения:

if (Accelerometer.isSupported) 
{ 
    // Set up Accelerometer event listeners and code. 
}

Класс Accelerometer и его члены доступны для версий среды выполнения, перечисленных для каждой записи API-интерфейса. Однако текущая среда во время выполнения определяет доступность этой функции. Например, можно скомпилировать код с использованием свойств класса Accelerometer для Flash Player 10.1, однако необходимо использовать свойство Accelerometer.isSupported для проверки доступности функции Accelerometer в устройстве пользователя. Если свойство Accelerometer.isSupported возвращает значение true во время выполнения, то текущая платформа поддерживает класс Accelerometer.

Обнаружение изменений акселерометра

Чтобы использовать датчик акселерометра, создайте экземпляр объекта Accelerometer и зарегистрируйте отправляемое им событие update . Событие update является объектом события Accelerometer. Событие имеет четыре свойства, каждое из которых является числом:

  • accelerationX : ускорение вдоль оси X, измеряется в Галах (Г). Ось X направлена слева направо относительно устройства, когда оно находится в вертикальном положении. (Устройство находится в вертикальном положении, когда верхняя часть устройства направлена вверх.) Ускорение имеет положительное значение, если устройство перемещается вправо.

  • accelerationY : ускорение вдоль оси Y, измеряется в Галах (Г). Ось Y направлена снизу вверх относительно устройства, когда оно находится в вертикальном положении. (Устройство находится в вертикальном положении, когда верхняя часть устройства направлена вверх.) Ускорение имеет положительное значение, если устройство перемещается вверх относительно этой оси.

  • accelerationZ : ускорение вдоль оси Z, измеряется в Галах (Г). Ось Z направлена перпендикулярно лицевой стороне устройства. Ускорение имеет положительное значение, если при перемещении устройства его лицевая сторона направлена вверх. Ускорение имеет отрицательное значение, если лицевая сторона устройства направлена в сторону земли.

  • timestamp : число миллисекунд на момент события, начиная с инициализации среды выполнения.

1 Г — это стандартное ускорение в следствие гравитации, которое приближенно равно 9,8 м/с 2 .

Здесь приводится основной пример отображения данных акселерометра в текстовом поле:

var accl:Accelerometer; 
if (Accelerometer.isSupported) 
{ 
    accl = new Accelerometer(); 
    accl.addEventListener(AccelerometerEvent.UPDATE, updateHandler); 
} 
else 
{ 
    accTextField.text = "Accelerometer feature not supported"; 
} 
function updateHandler(evt:AccelerometerEvent):void 
{ 
    accTextField.text = "acceleration X: " + evt.accelerationX.toString() + "\n" 
            + "acceleration Y: " + evt.accelerationY.toString() + "\n" 
            + "acceleration Z: " + evt.accelerationZ.toString() 
}

Чтобы воспользоваться этим примером, перед использованием кода создайте текстовое поле accTextField и добавьте его в список отображения.

Можно настроить необходимый интервал времени для событий акселерометра, вызвав метод setRequestedUpdateInterval() объекта Accelerometer. В этом методе используется один параметр interval , который представляет собой запрошенный интервал обновления в миллисекундах:

var accl:Accelerometer; 
accl = new Accelerometer(); 
accl.setRequestedUpdateInterval(1000);

Фактическое время между обновлениями акселерометра может быть больше или меньше этого значения. Любое изменение в интервале обновления затрагивает все зарегистрированные прослушиватели. При отсутствии вызова метода setRequestedUpdateInterval() приложение получает обновления на основе интервала, заданного в устройстве по умолчанию.

Данные акселерометра имеют определенную погрешность. Можно использовать скользящее среднее значение по последним данным для сглаживания данных. В следующем примере коэффициент, рассчитанный на основе последних показателей акселерометра, умножается на текущие показания для получения округленного результата:

var accl:Accelerometer; 
var rollingX:Number = 0; 
var rollingY:Number = 0; 
var rollingZ:Number = 0; 
const FACTOR:Number = 0.25; 
 
if (Accelerometer.isSupported) 
{ 
    accl = new Accelerometer(); 
    accl.setRequestedUpdateInterval(200); 
    accl.addEventListener(AccelerometerEvent.UPDATE, updateHandler); 
} 
else 
{ 
    accTextField.text = "Accelerometer feature not supported"; 
} 
function updateHandler(event:AccelerometerEvent):void 
{ 
    accelRollingAvg(event); 
    accTextField.text = rollingX + "\n" +  rollingY + "\n" + rollingZ + "\n"; 
} 
 
function accelRollingAvg(event:AccelerometerEvent):void 
{ 
    rollingX = (event.accelerationX * FACTOR) + (rollingX * (1 - FACTOR)); 
    rollingY = (event.accelerationY * FACTOR) + (rollingY * (1 - FACTOR)); 
    rollingZ = (event.accelerationZ * FACTOR) + (rollingZ * (1 - FACTOR)); 
}

Однако это скользящее среднее желательно использовать только при небольшом интервале обновления акселерометра.