¿Cómo detectar el paisaje izquierdo (normal) contra el derecho del paisaje (reverso) con la ayuda para los dispositivos naturales del paisaje?
Lo que me gustaría hacer:
- Detectar la orientación actual del dispositivo (Vertical, Horizontal-Izquierda, Vertical (al revés), Horizontal-Derecha)
- Diferenciar entre los dos modos de paisaje posibles (inclinado en el lado izquierdo, apoyado en el lado derecho)
- Soporte de dispositivos que tienen el paisaje como su estado natural ( por ejemplo , se discute aquí )
- Soporte <2.2 (no se puede usar getRotation () )
Sólo para aclarar, quiero saber en qué orientación se encuentra actualmente el diseño. ¿Qué dirección es la parte inferior del diseño? ¿Está en el retrato? ¿Está en el paisaje? ¿Es el paisaje izquierdo o derecho? Etc.
- ¿Por qué no funciona setVisibility después de animar una vista?
- Android: orientación de la vista previa de la cámara en modo vertical
- Android: Obtener rotación EXIF desde URI
- La rotación de Css no se aplica en android (phonegap)
- Girar rápidamente el teléfono 180 grados, la vista previa de la cámara gira al revés
Lo más cercano que puedo encontrar es la orientación Activity.getResources (). GetConfiguration () , pero sólo 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 que podría averiguarlo. 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 ser una manera fácil de obtener el valor de orientación. Podría implementar un OrientationEventListener , pero eso parece excesivo ya que sólo necesito obtener el valor una vez en un momento específico, no constantemente.
Hay dos valores en la clase Display pero getOrientation está obsoleto y getRotation sólo está disponible para 2.2 y superior.
Ahora, incluso si conseguí este valor, todavía hay la cuestión de los dispositivos que son naturalmente paisaje. Significando que su valor 0 sería paisaje en lugar de retrato. Así que también necesito una manera segura de decir cuál (paisaje-izquierda, paisaje-derecha o retrato) corresponde a 0.
Hay un montón de puestos de SO sobre orientación y cuestiones similares, pero no he visto ninguna que tenga en cuenta todos estos temas. ¿Alguien ha descubierto esto?
Cuando todo está dicho y hecho me gustaría algo como Activity.getResources (). GetConfiguration (). Orientación, pero ser capaz de decir que el modo de paisaje que es.
- Android: gira el lienzo alrededor del centro de la pantalla
- Android: obtiene la orientación del dispositivo desde Azimuth, roll y pitch
- Traducción después de la rotación
- Cómo girar un icono de Android en su punto central?
- Rotación de la imagen YUV420 / NV21 en android
- Android: screenOrientation = "sensorPortrait" no funciona en API +17
- Implementar un indicador de actividad giratoria similar a iOS en Android
- Cómo deshabilitar / evitar Fragment animaciones personalizadas después de la rotación de la pantalla
El paisaje correcto no fue compatible hasta el 2.2. Tendrás que tener <2.2 dispositivos elegir en las opciones o algo así.
La única manera que logré superar esto (sin ir a la API 8) es mediante el registro de SensorManager (Sensor.TYPE_ACCELEROMETER) y obtener onSensorChanged eventos.
Me di cuenta de que cuando su pantalla está en modo horizontal, obtendrá valores cercanos a -9 (g) o +9 (g) en el eje espumoso (x). Usted puede apenas comprobar para positivo o el negativo, pero usted necesita ahorrar el estado en el caso que el dispositivo se pone de nuevo en la tabla con la cara hacia arriba
Su código (snippet) debería ser parecido a eso:
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 ha ayudado, espero que esto te ayude.