5

Descripciónorientación de la pantalla Android difiere entre los dispositivos

tengo una actividad que muestra la vista previa de la cámara en una vista de la superficie. No quiero que se reinicie en los cambios de orientación (ya que está constantemente escaneando códigos QR), por lo que la orientación se bloquea en vertical.

El problema que tengo es que tengo que mostrar las instrucciones en la pantalla para el usuario en la parte inferior de la pantalla. Dado que la pantalla está bloqueada en una orientación, no me notifican la nueva orientación ya que la actividad no se vuelve a dibujar. Por lo tanto, las instrucciones se representaron en el mismo lugar independientemente del teléfono que se haya mostrado en retrato, retrato invertido, paisaje o paisaje reverenciado.

Para resolver este problema, me conecté al administrador del sensor para leer la orientación en tiempo real. (Vea el código a continuación) Después de leerlo, yo mismo resuelvo la orientación y muevo mis instrucciones según sea necesario a medida que se me envía cada actualización. Esto ha funcionado para mí hasta hace poco. Al probarlo en tabletas Asus Transformer Prime y Xoom. La tableta está volviendo la orientación como "90" para retrato, en lugar de "0" como mis otros 2 teléfonos. Como puede ver en el siguiente código, busco tabletas (pantallas grandes) y menos 90 grados extra.

Problema

El problema es la nueva tableta Nexus 7 no tiene este sesgo adicional. En el retrato, devuelve "0", pero lo detecto como una tableta, por lo que 90 grados menos, el resultado es 270 y coloca mis instrucciones como si la tableta estuviera en modo horizontal. Supongo que el razonamiento detrás de esto es que el Xoom/Transformer fue diseñado para ser utilizado en el paisaje, y el Nexus en el retrato, pero a menos que sepa sobre todos los dispositivos afectados, esto no ayuda.

Pregunta

¿Hay una manera fiable para detectar la orientación en todos los dispositivos y devolver los resultados en "tiempo real", como en el código de abajo, pero teniendo en accoutn la orientación predeterminada del dispositivo (es decir, Los teléfonos + Nexus 7 son retratos, pero la mayoría de las tabletas son de paisaje)?

Código actual

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

Respuesta

5

arreglaron

ha sustituido el código

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

Con el siguiente

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

[Este artículo desarrollador] (http://android-developers.blogspot.com/2010/09/one-screen-turn-deserves-another.html) contiene también buena información sobre el tema. – FoamyGuy

+0

Gracias FoamyGuy. Nunca he leído el blog, solo la guía del desarrollador – JonWillis

Cuestiones relacionadas