5

BeschreibungAndroid Bildschirmorientierung unterscheidet zwischen Geräten

I eine Aktivität haben, die die Kamera Vorschau auf einer Oberfläche Ansicht zeigt. Ich möchte nicht, dass es bei Orientierungsänderungen neu gestartet wird (da es ständig nach QR-Codes sucht), so dass die Ausrichtung im Hochformat gesperrt ist.

Das Problem, das ich habe, ist, dass ich Anweisungen auf dem Bildschirm für den Benutzer am unteren Rand des Bildschirms anzeigen muss. Wenn der Bildschirm in einer Ausrichtung gesperrt ist, werde ich nicht über die neue Ausrichtung informiert, da die Aktivität nicht neu gezeichnet wird. So wurden die Anweisungen an der gleichen Stelle gerendert, unabhängig davon, ob das Telefon im Hochformat, im umgekehrten Hochformat, in der Landschaft oder in der verehrten Landschaft war.

Um dieses Problem zu beheben, habe ich mich an den Sensor-Manager angeschlossen, um die Ausrichtung in Echtzeit einzulesen. (Siehe Code unten) Nachdem ich es eingelesen habe, trainiere ich selbst die Ausrichtung und verschiebe meine Anweisungen wie erforderlich, da jedes Update an mich gesendet wird. Das hat bis jetzt für mich bisher funktioniert. Beim Testen auf Asus Transformer Prime und Xoom Tablets. Das Tablet gibt die Ausrichtung für "Hochformat" als "90" zurück, anstelle von "0" wie bei den anderen beiden Telefonen. Wie Sie im folgenden Code sehen können, überprüfe ich nach Tablets (große Bildschirme) und minus die zusätzlichen 90 Grad.

Problem

Das Problem ist das neue Nexus 7 Tablet nicht über diese zusätzliche Vorspannung haben. Im Hochformat gibt es "0" zurück, aber ich erkenne es als ein Tablet, also minus 90 Grad, also ist das Ergebnis 270 und es stellt meine Anweisungen so dar, als ob das Tablet im Querformat wäre. Ich gehe davon aus, dass der Xoom/Transformer für die Verwendung in der Landschaft und der Nexus im Hochformat konzipiert wurde, aber wenn ich nicht über alle betroffenen Geräte Bescheid weiß, hilft das nicht.

Frage

Gibt es eine zuverlässige Möglichkeit, die Orientierung über alle Geräte und gibt die Ergebnisse in „Echtzeit“, wie in dem folgenden Code, aber unter in accoutn der Standardausrichtung des Geräts zu erfassen (dh Telefone + Nexus 7 sind Porträt, aber die meisten Tablets sind Landscape)?

aktuellen Code

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 
     } 
    }; 

Antwort

5

es Feste

den Code ersetzt

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

Mit folgendem

  //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

[diesem Entwickler Artikel] (http://android-developers.blogspot.com/2010/09/one-screen-turn-deserves-another.html) enthält einige gute Informationen zu diesem Thema. – FoamyGuy

+0

Danke FoamyGuy. Ich habe nie den Blog gelesen, nur den Entwicklerleitfaden – JonWillis

Verwandte Themen