Cómo detecto la rotación de la pantalla

Tengo una actividad que muestra una brújula, y necesito saber la orientación de la pantalla para rotar la aguja correctamente. Necesito distinguir entre rotación de grado de 90 ° y 270 ° para manejar esto adecuadamente.

Cuando giro la pantalla (al menos en mi Nexus S) se llama a la actividad onCreate , por ejemplo, cuando giro del modo vertical al modo horizontal. Cuando giro de un modo horizontal al otro con el borde superior levantado, se llama a onCreate() dos veces (una para la orientación vertical y otra para el modo horizontal objective).

Sin embargo, cuando giro con el borde inferior hacia arriba, la pantalla gira 180 ° y onCreate no recibe ninguna llamada. ¿Hay algún evento que sea despedido en este caso?

Tiene razón en que con una rotación de 180 grados no se reiniciará ni se modificará la configuración, ya que la configuración no ha cambiado realmente. (Todavía está en paisaje o retrato, y todo lo demás es igual).

Sin embargo, si muestra una brújula, eso debe significar que la está actualizando a partir de los eventos del sensor. Por lo tanto, puede llamar a Display.getRotation () cada vez que obtenga una actualización del sensor para obtener la rotación actual de la pantalla. De hecho, lo que necesita es la rotación de los eventos del sensor de interpretación (o, de hecho, cómo se modificará su dibujo al llegar a la pantalla), no solo la orientación.

Encontré una publicación de blog relevante que vale la pena leer .

Asegúrese de leer la documentación del SDK .

También consulte la discusión sobre el uso de Display.getRotation () para reasignar correctamente las coordenadas del sensor.

La clase de ayuda OrientationEventListener hace que sea muy fácil obtener callbacks en rotación. Sugeriría que lo pruebes.

Simplemente eche un vistazo a la documentación de SensorManager , allí puede obtener los mejores ejemplos y explicaciones sobre cómo usar el acelerómetro para obtener la información más precisa. En lugar de hacer las cosas simplemente detectando la orientación del teléfono, con esa API puedes obtener la rotación exacta, tal como lo usan los juegos de carreras como Asphalt y Need For Speed.

Como dijo Monchote, para hacer que la aguja gire como se esperaba en la brújula, es mejor bloquear la IU en vertical o horizontal , y cambiar el ángulo de la aguja según el ángulo de rotación del dispositivo, que se puede obtener fácilmente desde OrientationListener .

De esta forma, independientemente de si el usuario ha abierto o no la característica de rotación automática, siempre puede recibir una notificación de cambio de ángulo de rotación. Aquí hay un buen ejemplo para su referencia.

Eche un vistazo al método OnConfigurationChanged para rastrear el cambio de orientación y reorganizar su UI según sea necesario.

Ver un código de muestra