Aby można było korzystać z czujnika przyspieszeniomierza, należy utworzyć instancję obiektu Accelerometer i przeprowadzić rejestrację dla zdarzeń
update
, które obiekt ten wywołuje. Zdarzenie
update
jest obiektem zdarzenia Accelerometer. Zdarzenie zawiera cztery właściwości i każde stanowi liczbę:
-
accelerationX
— przyspieszenie wzdłuż osi X, wyrażone jako wielokrotność g. Oś X przebiega z lewej na prawą stronę urządzenia, jeśli jest ono ustawione pionowo. (Urządzenie stoi w pozycji pionowej, jeśli jego górna krawędź jest skierowana do góry). Przyspieszenie jest dodatnie, jeśli urządzenie jest przesuwane w prawą stronę.
-
accelerationY
— przyspieszenie wzdłuż osi Y, wyrażone jako wielokrotność g. Oś Y przebiega od dołu do góry urządzenia, jeśli jest ono ustawione pionowo. (Urządzenie stoi w pozycji pionowej, jeśli szczyt urządzenia jest skierowany do góry). Przyspieszenie jest dodatnie, jeśli urządzenie przemieszcza się w górę względem tej osi.
-
accelerationZ
— przyspieszenie wzdłuż osi Z, mierzone jako wielokrotność g. Oś Z przebiega prostopadle do przedniej powierzchni urządzenia. Przyspieszenie jest dodatnie, jeśli urządzenie zostanie przesunięte tak, aby jego przód był skierowany do góry. Przyspieszenie jest ujemne, jeśli przód urządzenia jest skierowany w dół.
-
timestamp
— liczba milisekund w czasie zdarzenia; informuje, kiedy zostało zainicjowane środowisko wykonawcze.
1 g jest standardowym przyspieszeniem ziemskim, które wynosi w przybliżeniu 9,8 m/s
2.
.
Poniżej przedstawiono podstawowy sposób wyświetlania danych przyspieszeniomierza w polu tekstowym:
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()
}
Aby prawidłowo zastosować ten przykład, należy pamiętać o utworzeniu pola tekstowego
accTextField
i dodaniu go do listy wyświetlanej przed użyciem tego kodu.
Możliwe jest dostosowanie pożądanych przedziałów czasu dla zdarzeń przyspieszeniomierza poprzez wywołanie metody
setRequestedUpdateInterval()
obiektu Accelerometer. Ta metoda wymaga jednego parametru,
interval
, który jest żądanym przedziałem czasu między aktualizacjami wyrażonym w milisekundach.
var accl:Accelerometer;
accl = new Accelerometer();
accl.setRequestedUpdateInterval(1000);
Rzeczywisty odstęp czasu między uaktualnieniami danych przyspieszeniomierza może być większy lub mniejszy od tej wartości. Dowolna zmiana w odstępie między uaktualnieniami wpływa na wszystkie zarejestrowane detektory zdarzeń. Jeżeli metoda
setRequestedUpdateInterval()
nie zostanie wywołana, aplikacja odbiera aktualizacje na podstawie domyślnego przedziału czasu urządzenia.
Dane przyspieszeniomierza zawierają pewien stopień niedokładności. Aby wygładzić dane, można użyć średniej ruchomej ostatnich danych. Następujący przykład mnoży ostatnie odczyty przyspieszeniomierza oraz bieżący odczyt przez określony współczynnik, aby uzyskać wartość zaokrągloną:
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));
}
Jednak ta średnia ruchoma jest użyteczna jedynie w przypadku, gdy odstęp czasu aktualizacji przyspieszeniomierza jest mały.