poniedziałek, 17 lutego 2014

Czujnik orientacji (poziomica + kompas )


Kod źródłowy do tej lekcji znajduje się tutaj. Rozpakuj go i zaimportuj. W katalogu z kodem źródłowym znajdą się podkatalogi oznaczone numerami. Są to po prostu kolejne wersje kodu, tworzonego w ramach przykładów. Możesz analizować kolejne kroki tworzenia aplikacji, lub od razu zabrać się za kod z katalogu o najwyższym numerku.




Android umożliwia korzystanie z wbudowanego w urządzenie czujnika orientacji. Dzięki temu czujnikowi jesteśmy w stanie określić pozycję telefonu – tj. pochylenie góra-dół i lewa-prawa. Można dzięki temu zaprogramować np. elektroniczną poziomicę. Ten sam czujnik orientacji pozwala też na określenie azymutu na który zwrócony jest telefon. W tym przykładzie wykorzystamy wszystkie te możliwości.
Zaczynamy od przyklejenia na ekranie czterech elementów klasy TextView:



Do przyklejonych elementów musimy podpiąć referencje aby z nich korzystać, tutaj niczego zaskakującego nie ma. Pojawia się za to implementacja interfejsu SensorEventListener. O co tu chodzi? Nasz czujnik będzie co chwila podawał nowe odczyty, aby wyświetlać te zmiany musimy zaimplementować ten interfejs. W związku z tym, będziemy musieli przesłonić metody onSensorChanged i onAccuracyChanged. O tym za momencik.




Zanim zaczniemy korzystać z naszego czujnika, musimy zarejestrować wybraną klasę (musi ona implementować interfejs SensorEventListener) jako odbiornik dla czujnika. Ja to zrobiłem w metodzie onCreate mojej aktywności, ponieważ ta jest uruchamiana w momencie startu programu. Jako odbiornik zarejestrowałem aktywność, ponieważ to w niej chcę reagować na zmiany odczytów (a zadbałem o to by ta aktywność implementowała interfejs SensorEventListener).



W związku z implementacją interfejsu SensorEventListener muszę zaimplementować też metody onAccuracyChanged i onSensorChanged. Pierwsza jest wywoływana kiedy dokładność czujnika ulega zmianie (tutaj raczej nam się to nie przyda), druga jest wywoływana automatycznie kiedy odczyty z czujników ulegną zmianie (ta już nas interesuje). Do tej metody przekazywane są odczyty z czujnika. Pod indeksem 0 (event.values[0]) znajdziemy azymut na jaki zwrócona jest góra telefonu, pod indeksem 1 (event.values[1]) wychylenie w płaszczyźnie góra-dół, pod indeksem 2 (event.values[2]) wychylenie lewa-prawa. Wartości wszystkich trzech wypisuję na pierwszym komponencie.



Korzystając z tych odczytów wyświetlam na pozostałych komponentach stosowne komentarze. Mają one sprawić, że odczyty będą bardziej czytelne. Nie jest to niezbędny element, czysta estetyka. Całą metodę onSensorChanged widać na poniższej ilustracji.




Efekt działania (Samsung ACE3):




Do programu warto byłoby dodać jeszcze obsługę sytuacji gdyby urządzenie nie posiadało czujnika, nie każdy telefon jest w niego wyposażony.

2 komentarze:

  1. poziomicia działa a kompas nie. pokazuje cały czas południowy wschód

    OdpowiedzUsuń