Podczas tworzenia nowej produkcji natknąłem się na pewien problem związany z osiami akcelerometru w urządzeniach z Androidem. Różnica wynika z tego że większość tabletów (szczególnie 10 calowych) posiada domyślny widok poziomy (landscape), a nie taki jak we wszystkich telefonach i niektórych 7 calowych tabletach czyli pionowy (portrait). Z racji tego że używam portu silnika z iOS (Cocos2D) musiałem sam zadbać o detekcję.
Pierwszym pomysłem było wyliczenie w kodzie przekątnej ekranu i ustawienie zmiennych położenia w metodzie cocosa : void ccAccelerometerChanged(float accelX, float accelY, float accelZ) tak aby dopasowały się do urządzenia. Ten pomysł niestety nie zadziała, mimo że wyliczymy przekątną, to jeżeli będzie miała 7 cali i uruchomimy aplikację np. na Nexusie 7, to z racji tego że ma on tryb poziomy jako domyślny, osie się zamienią co będzie skutkowało poważnym błędem. Najlepszym sposobem było by pobranie aktualnej orientacji urządzenia (layout/portrai) i sprawdzenie aktualnej rotacji w stopniach.
Powyższa metoda sprawdza oryginalną orientację ekranu. Pobieramy aktualną pozycję ekranu (cfg.orientation) oraz rotację i porównujemy. Warto zauważyć że pomiędzy widokiem telefonu i tabletu jest 90 st. różnicy, a więc jeżeli wykryjemy tryb landscape oraz 90 st. rotacji to jesteśmy pewni że nasza aplikacja została uruchomiona na telefonie. Jeżeli urządzenie raportuje o trybie landscape i 0 rotacji to mamy pewność że jest to tablet z domyślnym widokiem poziomym.
Taką metodą możemy jednokrotnie sprawdzić podczas pierwszego uruchomienia aplikacji z jakim urządzeniem mamy doczynienia ;] Sam kod nie jest mojego autorstwa, znalazłem go po kilkudziesięciu minutach intensywnych poszukiwań na stackoverflow.com. Metoda została przetestowana na Nexusie 7 i HTC Desire Z, niestety nie mam dostępu do fizycznego urządzenia z natywnym trybem poziomym ale emulator potwierdził poprawność działania.
Brak komentarzy:
Prześlij komentarz