2011-02-23 7 views
12

Lo que me gustaría hacer:¿Cómo detectar el paisaje a la izquierda (normal) frente al paisaje a la derecha (inversa) con soporte para dispositivos de paisajes naturales?

  • Detectar la orientación diseño actual del dispositivo (retrato, paisaje-Izquierda, Retrato (boca abajo), Paisaje-derecha)
  • diferenciar entre los dos posibles modos horizontal (apoyado en el lado izquierdo, apoyándose en el lado derecho)
  • dispositivos de apoyo que tienen el paisaje como su estado natural (for example, discussed here)
  • < Apoyo 2.2 (no se puede utilizar getRotation())

Solo para aclarar, quiero saber en qué orientación se encuentra actualmente el diseño. ¿Qué dirección está en la parte inferior del diseño? ¿Está en retrato? ¿Está en el paisaje? ¿El paisaje está a la izquierda o a la derecha? etc.

Lo más cercano que puedo encontrar es Activity.getResources().getConfiguration().orientation, pero solo devuelve tres valores posibles. ORIENTATION_LANDSCAPE, ORIENTATION_PORTRAIT u ORIENTATION_SQUARE. No dice qué tipo de paisaje.

Entonces, entonces pensé, bueno, si puedo obtener el valor de orientación (como 90, 180, 270, etc.) del dispositivo y compararlo con el valor de configuración anterior, podría resolverlo. Por ejemplo, si el valor de configuración era ORIENTATION_LANDSCAPE y la orientación era 270, podría decir que estaba en el modo de paisaje inverso. Sin embargo, no parece haber una manera fácil de obtener el valor de orientación. Podría implementar un OrientationEventListener, pero eso parece exagerado ya que solo necesito obtener el valor una vez en un momento específico, no constantemente.

Hay dos valores en la clase de pantalla, pero getOrientation está en desuso y getRotation solo está disponible para 2.2 y superiores.

Ahora, incluso si obtuve este valor, todavía existe el problema de los dispositivos que son naturalmente horizontales. Lo que significa que su valor 0 sería landscape en lugar de portrait. Así que también necesito una manera segura de decir cuál (paisaje -izquierda, horizontal-derecha o vertical) corresponde a 0.

Hay muchas publicaciones en SO sobre orientación y problemas similares, pero no he visto ninguna que toman todos estos problemas en consideración. ¿Alguien ha descubierto esto?

Cuando todo esté dicho y hecho, me gustaría algo como Activity.getResources(). GetConfiguration(). Orientation pero ser capaz de decir qué modo de paisaje es.

Respuesta

2

El paisaje derecho no se admite hasta 2.2. Tendrá que tener < 2.2 dispositivos elegir en las opciones o algo.

+0

¿Qué quiere decir con compatible? Tengo un dispositivo 2.1 (y el emulador) que se puede girar en cualquier modo horizontal. – cottonBallPaws

+0

@littleFluffyKitty Es una pena que esta sea la respuesta aceptada, porque realmente no responde la pregunta (y es una buena pregunta). FWIW, 'getOrientation' es equivalente a' getRotation', la desaprobación es simplemente porque se renombró en 2.2. La funcionalidad ha estado allí desde el nivel 1 de la API. –

0

La única manera en que logré superar esto (sin ir a la API 8) es registrándome en el SensorManager (Sensor.TYPE_ACCELEROMETER) y obtengo eventos enSensorChanged.

Me di cuenta de que cuando su pantalla está en modo horizontal, obtendrá valores cercanos a -9 (g) o +9 (g) en el eje latal (x). que sólo puede comprobar si positivo o negativo, pero hay que guardar el estado en el caso de que el dispositivo se vuelve a poner sobre la mesa con la cara hacia arriba

Su código (fragmento) se deberían ver más o menos así:

private float mShiftAngle = 0; 

public void onSensorChanged(SensorEvent event) { 
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) { 
     aValues = event.values; 
     int deviceRot = getResources().getConfiguration().orientation; 
     if (deviceRot == Configuration.ORIENTATION_LANDSCAPE) { 
      if (Math.abs(aValues[0])>4) 
       mShiftAngle = (aValues[0]>0 ? 90 : -90); 
     } 
     else 
      mShiftAngle = 0;  
    } 
} 

me ayudó, espero que esto te ayude.

Cuestiones relacionadas