2011-01-18 28 views
6

¿Cómo puedo detectar cuál de los 4 lados del teléfono está activo?Detecta la orientación de Android: horizontal-izquierda v. Horizontal-derecha

que puede detectar el modo de paisaje vertical /, pero ¿cómo le digo paisaje convertido-en-lado izquierdo depaisaje convertido en el lado derecho hacia?

Básicamente quiero hacer una bonita animación de transición cuando el usuario enciende el teléfono. Ya sabes, como en Safari de iPhone: una rápida rotación de 400ms desde el diseño anterior al nuevo.

Respuesta

10

Utilice un OrientationEventListener:

mOrientationEventListener = new OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL) 
{ 
@Override 
public void onOrientationChanged(int orientation) 
{ 
    mDeviceOrientation = orientation; 
} 
}; 

if(mOrientationEventListener.canDetectOrientation()) 
{ 
mOrientationEventListener.enable(); 
} 

mDeviceOrientation debe entonces ser un número entero que le dice el ángulo de su dispositivo se gira a , si realiza un redondeo inteligente, debe poder ver en cuál de las cuatro orientaciones se encuentra:

// Divide by 90 into an int to round, then multiply out to one of 5 positions, either 0,90,180,270,360. 
int orientation = 90*Math.round(mDeviceOrientation/90); 

// Convert 360 to 0 
if(orientation == 360) 
{ 
    orientation = 0; 
} 

¡Disfrútalo!

+0

Su código de redondeo es incorrecto. Desea: (90 * Math.round (mDeviceOrientation/90))% 360; Aparte de eso, es probable que desee manejar el caso donde se devuelve ORIENTATION_UNKNOWN, consulte los documentos. – pheelicks

+0

Bueno, genial, muchas gracias fry15! –

+0

Pero aparentemente un poco apagado, tal vez por eso SENSOR_DELAY_NORMAL. Renderizado por la vista se invoca antes de onOrientationChanged, por lo que en el punto donde tengo que procesar no hay información sobre el cambio de orientación todavía. –

1

Parece que usted debería ser capaz de decir de la screenOrientation, conseguido a través de getRequestedOrientation

+1

No, eso no es bueno, solo devuelve paisaje o retrato. Lo que necesito es ** qué ** paisaje es. Cuando enciendes el teléfono en su lado izquierdo o su lado derecho, Android muestra la interfaz de usuario en dos orientaciones opuestas. –

+1

Sí, supongo que los valores reverse_landscape y reverse_portrait le dirían eso. Tenga en cuenta que estos solo están disponibles en el nivel 9 de la API. ¿Qué versión del SDK está usando? ¿En qué dispositivo estás probando? Presumiblemente, solo puede obtener esta información si está ejecutando 2.3 o superior. –

+0

En realidad sí, API9 menciona esa parte 'inversa'. Es una pena que no pensaran antes. No creo que sea razonable esperar 2.3 en este momento, casi no hay dispositivos que lo ejecuten todavía. –

7

acabo de encontrar :) código XML 2.2 + puesta a ur res/values ​​(falsas) y cosa/valores-XLarge (verdaderos)

<resources> 
<bool name="isTablet">false</bool> 

private void getScreenRotationOnPhone() { 

    final Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 

    switch (display.getRotation()) { 
     case Surface.ROTATION_0: 
      System.out.println("SCREEN_ORIENTATION_PORTRAIT"); 
      break; 

     case Surface.ROTATION_90: 
      System.out.println("SCREEN_ORIENTATION_LANDSCAPE"); 
      break; 

     case Surface.ROTATION_180: 
      System.out.println("SCREEN_ORIENTATION_REVERSE_PORTRAIT"); 
      break; 

     case Surface.ROTATION_270: 
      System.out.println("SCREEN_ORIENTATION_REVERSE_LANDSCAPE"); 
      break; 
    } 
} 

private void getScreenRotationOnTablet() { 

    final Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 

    switch (display.getRotation()) { 
     case Surface.ROTATION_0: 
      System.out.println("SCREEN_ORIENTATION_LANDSCAPE"); 
      break; 

     case Surface.ROTATION_90: 
      System.out.println("SCREEN_ORIENTATION_REVERSE_PORTRAIT"); 
      break; 

     case Surface.ROTATION_180: 
      System.out.println("SCREEN_ORIENTATION_REVERSE_LANDSCAPE"); 
      break; 

     case Surface.ROTATION_270: 
      System.out.println("SCREEN_ORIENTATION_PORTRAIT"); 
      break; 
    } 
} 

private boolean isTabletDevice(){ 
    boolean tabletSize = getResources().getBoolean(R.bool.isTablet); 
    if (tabletSize) { 
     return true; 
    } else { 
     return false; 
    } 
} 
+1

Desafortunadamente, este código no funcionará en dispositivos que tienen "posición natural" configurada en horizontal (como ciertas tabletas). Si alguien tiene alguna idea de cómo encontrar la "posición natural" de un dispositivo, comparta. Es realmente una pena que no haya API para hacerlo en Android. – kaalus

+0

Eso es verdad. Edité el código a la versión para tableta también. Thx mate! Espero que vayan a lanzar API para eso. –

Cuestiones relacionadas