5

OpisAndroid orientacji ekranu różni się między urządzeniami

Mam aktywność, która wyświetla podgląd kamery na widok powierzchni. Nie chcę, aby był ponownie uruchamiany przy zmianach orientacji (ponieważ ciągle skanuje kody QR), więc orientacja jest zablokowana w pionie.

Problem polega na tym, że muszę wyświetlać użytkownikowi instrukcje na ekranie u dołu ekranu. Ponieważ ekran jest zablokowany w jednej orientacji, nie otrzymuję powiadomienia o nowej orientacji, ponieważ aktywność nie jest przerysowana. W ten sposób instrukcje były wyświetlane w tym samym miejscu, niezależnie od tego, czy telefon był w orientacji pionowej, portretu odwróconego, krajobrazu czy szanowanego krajobrazu.

Aby rozwiązać ten problem, podłączyłem się do menedżera czujników, aby odczytać orientację w czasie rzeczywistym. (Zobacz poniższy kod) Po przeczytaniu go, sam ustalam orientację i przesuwaj moje instrukcje zgodnie z wymaganiami, ponieważ każda aktualizacja jest do mnie wysyłana. Do tej pory zadziałało to dla mnie do niedawna. Podczas testowania na tabletach Asus Transformer Prime i Xoom. Tablet zwraca orientację jako "90" dla portretu, zamiast "0", podobnie jak pozostałe moje dwa telefony. Jak widać w poniższym kodzie, sprawdzam na tabletach (duże ekrany) i minus dodatkowe 90 stopni.

Problem

Problem jest nowy Nexus 7 tablet nie ma tej dodatkowej stronniczości. W pozycji pionowej zwraca "0", ale wykrywam to jako tablet, więc minus 90 stopni, więc wynik wynosi 270 i umieszcza moje instrukcje tak, jakby tablet był w trybie poziomym. Zakładam, że rozumowanie jest takie, że Xoom/Transformer został zaprojektowany do użytku w krajobrazie, a Nexus w pionie, ale jeśli nie znam wszystkich urządzeń, których to dotyczy, to nie pomaga.

Pytanie

Czy istnieje niezawodny sposób wykryć orientację we wszystkich urządzeniach i zwraca wyniki w „czasie rzeczywistym”, jak w poniższym kodzie, ale biorąc pod accoutn domyślnej orientacji urządzenia (tj Telefony i Nexus 7 to portret, ale większość tabletów to pejzaż)?

aktualny kod

boolean large = ((getBaseContext().getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE); 
    boolean xlarge = ((getBaseContext().getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == 4);  
    isTablet = large || xlarge; 
    myOrientationEventListener = new OrientationEventListener(getBaseContext(), SensorManager.SENSOR_DELAY_NORMAL) 
    { 

     @Override 
     public void onOrientationChanged(int orientation) 
     { 
      if (orientation == -1) 
      { 
       return; 
      } 

      if (isTablet) 
      { 
       orientation += -90; 
       if (orientation < 0) // keep the result between 0-360 
       { 
        orientation += 360; 
       } 
      } 

      // Work out the orientation 

      if (orientation >= 60 && orientation <= 140) 
      { 
       screenOrientation = ScreenOrientation.Landscape_Reversed; 
      } 
      else if (orientation >= 140 && orientation <= 220) 
      { 
       screenOrientation = ScreenOrientation.Portrait_Reversed; 
      } 
      else if (orientation >= 220 && orientation <= 300) 
      { 
       screenOrientation = ScreenOrientation.Landscape; 
      } 
      else 
      { 
       screenOrientation = ScreenOrientation.Portrait; 
      } 

      //... Do stuff with new orientation here 
     } 
    }; 

Odpowiedz

5

Fixed to

Zastąpiony kod

 if (isTablet) 
     { 
      orientation += -90; 
      if (orientation < 0) // keep the result between 0-360 
      { 
       orientation += 360; 
      } 
     } 

z następującymi

  //Check "normal" screen orientation and adjust accordingly 
      int naturalOrientation = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation(); 
      if (naturalOrientation == Surface.ROTATION_0) 
      { 
       Logging.d(TAG, "Rotation ROTATION_0"); 
      } 
      else if (naturalOrientation == Surface.ROTATION_90) 
      { 
       Logging.d(TAG, "Rotation ROTATION_90"); 
       orientation += 90; 
      } 
      else if (naturalOrientation == Surface.ROTATION_180) 
      { 
       Logging.d(TAG, "Rotation ROTATION_180"); 
       orientation += 180; 
      } 
      else if (naturalOrientation == Surface.ROTATION_270) 
      { 
       Logging.d(TAG, "Rotation ROTATION_270"); 
       orientation += 270; 
      } 

      if (orientation > 360) // Check if we have gone too far forward with rotation adjustment, keep the result between 0-360 
      { 
       orientation -= 360; 
      } 
+1

[tego autora artykułu] (http://android-developers.blogspot.com/2010/09/one-screen-turn-deserves-another.html) zawiera również dobre informacje na ten temat. – FoamyGuy

+0

Dzięki FoamyGuy. Nigdy nie czytałem bloga, tylko przewodnik dla programistów – JonWillis

Powiązane problemy