Interakcja z przyspieszeniomierzem

Flash Player 10.1 i nowsze wersje, Adobe AIR 2 i nowsze wersje

Klasa Accelerometer wywołuje zdarzenia w odpowiedzi na aktywność wykrywaną przez czujnik ruchu urządzenia. Dane te odzwierciedlają położenie urządzenia lub jego ruch wzdłuż osi trójwymiarowej. Gdy urządzenie porusza się, czujnik wykrywa jego ruch i zwraca współrzędne związane z przyspieszeniami, jakim jest poddawane urządzenie. Klasa Accelerometer udostępnia metody umożliwiające sprawdzenie, czy przyspieszeniomierz jest obsługiwany, a także ustawienie częstotliwości, z jaką wywoływane są zdarzenia przekazujące dane o przyspieszeniu.

Osie przyspieszeniomierza są znormalizowane tak, aby wskazywały orientację wyświetlacza, a nie urządzenia. Gdy urządzenie zmienia orientację ekranu, osie przyspieszeniomierza odzwierciedlają takie zmiany. Oś y zawsze jest bliska osi pionowej, gdy użytkownik trzyma telefon w normalnej pozycji umożliwiającej czytanie — niezależnie od tego, jak telefon jest obrócony. Jeśli jest wyłączona automatyczna orientacja, na przykład gdy zawartość SWF w przeglądarce jest wyświetlana w trybie pełnoekranowym, osie przyspieszeniomierza nie reagują na obracanie urządzenia.

Sprawdzanie możliwości obsługi przyspieszeniomierza

Aby sprawdzić, czy środowisko wykonawcze umożliwia korzystanie z tej funkcji, należy użyć właściwości Accelerometer.isSupported .

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

Klasa Accelerometer oraz jej elementy są dostępne dla wersji środowiska wykonawczego wymienionych dla każdej pozycji API. Jednak bieżące środowisko określa dostępność tej funkcji w środowisku wykonawczym. Na przykład można skompilować kod za pomocą właściwości klasy Accelerometer dla programu Flash Player 10.1, ale w celu wykonania testu dostępności funkcji Accelerometer w urządzeniu użytkownika należy użyć właściwości Accelerometer.isSupported . Jeśli w czasie wykonywania właściwość Accelerometer.isSupported ma wartość true , przyspieszeniomierz jest obsługiwany.

Wykrywanie zmian przyspieszeniomierza

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.