En Android 8.0, los usuarios podían alternar entre los modos de rotación automática y vertical con una tarjeta de Configuración rápida o la configuración de pantalla. En Android 9, actualizamos el modo de rotación vertical para eliminar las rotaciones no deseadas fijando la rotación de pantalla actual, incluso si cambia la posición del dispositivo. Los usuarios pueden activar la rotación manualmente cuando sea necesario presionando un nuevo botón en la barra de navegación. Cambiamos el nombre del modo vertical a bloqueo de rotación, y se activa cuando la función Girar automáticamente está desactivada. No hay cambios en el modo Girar automáticamente.
Cuando el dispositivo está en modo de bloqueo de rotación, los usuarios pueden bloquear la pantalla en cualquier rotación compatible con la actividad visible superior (según las restricciones actuales del sistema). Si la actividad superior se puede renderizar en varias rotaciones en el modo de rotación automática, las mismas opciones deberían estar disponibles en el modo de rotación bloqueada, con algunas excepciones según la configuración de screenOrientation
de la actividad.
El modo de bloqueo de rotación funciona mostrando un botón en la barra de navegación cuando cambian los cambios de rotación del dispositivo. Para lograrlo, el sensor de orientación del dispositivo debe permanecer activo incluso cuando la opción de giro automático está desactivada. Si presionas este botón, se establece de manera efectiva la preferencia de rotación del usuario (Settings.System.USER_ROTATION
). WindowManager usa esta preferencia, junto con otros detalles sobre la actividad superior y el estado del sistema, para cambiar la rotación del sistema. WindowManager sigue usando la preferencia de rotación del usuario cuando decide en qué rotación renderizar el sistema cuando se cambia a otra actividad.

La preferencia de rotación del usuario debe mantenerse cuando se cambia de una actividad a otra. Sin embargo, como la mayoría de los usuarios de teléfonos solo quieren usar el modo horizontal por un período breve y temporal, agregamos el sesgo de orientación natural. La preferencia de rotación del usuario se restablece a la orientación natural del dispositivo cada vez que la rotación del sistema cambia a la orientación natural del dispositivo. En la mayoría de los teléfonos, la orientación natural del dispositivo es vertical (0°). El restablecimiento de la preferencia de rotación del usuario suele ocurrir cuando se usa una app solo en modo vertical, se bloquea el teléfono o se regresa al espacio de trabajo del selector.
Las interacciones de rotación para los usuarios no han cambiado mucho en la última década. Es posible que los usuarios encuentren difícil descubrir esta función debido a su historial anterior con la rotación y el posicionamiento de los botones en la barra de navegación. Por este motivo, agregamos un modo de introducción al botón de rotación que lo destaca cuando aparece. El comportamiento del modo de introducción solo se produce durante las primeras interacciones con los botones, después de las cuales se inhabilita el modo de introducción.
Fuente
Se agregó compatibilidad con las sugerencias de rotación a Android 9. La mayoría de los cambios se encuentran en los siguientes archivos.
services/.../server/policy/PhoneWindowManager.java
:- Hook que consume el resultado de
WindowOrientationListener
(MyOrientationListener
, responsable de supervisar los sensores para determinar si se giró el dispositivo) - Mantiene el
WindowOrientationListener
activo incluso cuando el giro automático está inhabilitado (consultaneedSensorRunningLp()
). - Calcula la rotación del sistema según la preferencia de rotación del usuario, la configuración superior de
screenOrientation
de la actividad y el estado del sistema (consultarotationForOrientationLw()
). - Determina si la actividad superior puede rotar a una rotación determinada (consulta
isRotationChoicePossible()
).
- Hook que consume el resultado de
SystemUI/.../statusbar/phone/NavigationBarFragment
:- Determina si se debe mostrar el botón de la barra de navegación en las devoluciones de llamada de sugerencias de rotación de
PhoneWindowManager
(consultaonRotationProposal()
). - Controla cuándo ocultar el botón de la barra de navegación para rotar (consulta las llamadas a
setRotateSuggestionButtonState(false)
). - Controla los tiempos de espera de los botones, incluido el caso especial cuando la barra de navegación está oculta (por lo general, en pantalla completa).
- Restablece la preferencia del usuario cuando se vuelve a la orientación natural del dispositivo (
mRotationWatcher
). - Elige el estilo adecuado para la animación del botón de la barra de navegación, que se aplica en
NavigationBarView
(consultaonRotationProposal()
). - Agrega lógica del modo de introducción, incluida la animación especializada (consulta las referencias a
Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED
). - Implementa la marca de rotación disable2 (consulta
disable()
).
- Determina si se debe mostrar el botón de la barra de navegación en las devoluciones de llamada de sugerencias de rotación de
SystemUI/.../statusbar/phone/NavigationBarView.java
:- Animación del ícono del botón de diseño para que coincida con la rotación pendiente (consulta
updateRotateSuggestionButtonStyle()
) - Controla los cambios de visibilidad de los botones (consulta
setRotateButtonVisibility()
), incluida la lógica para ocultar el botón de rotación si ciertos servicios de accesibilidad están activos (se tiene en cuenta la clasificación de la pila de botones de la barra de navegación más a la derecha).
- Animación del ícono del botón de diseño para que coincida con la rotación pendiente (consulta
SystemUI/res/layout/menu_ime.xml
:- Incluye un nuevo
KeyButtonView
para el botón de rotación, que se apila sobre el menú y el selector de IME/teclado, pero debajo del botón de accesibilidad.
- Incluye un nuevo
SystemUI/res/drawable/ic_sysbar_rotate_button.xml
:AnimatedVectorDrawable
complejo que se usa para animar el botón de la barra de navegación que rota- El diseño (en
SystemUI/res/values/styles.xml
) se usa para establecer los ángulos de inicio y finalización de la rotación, de modo que se pueda usar el mismo elemento de diseño para animar varias rotaciones de inicio y finalización. - El tono de los íconos se establece a través de
TintedKeyButtonDrawable
.
Implementación
Android 9 incluye todos los cambios necesarios para que las sugerencias de rotación funcionen en dispositivos que usan teclas de navegación de software (atrás, inicio, etc.).
Los fabricantes de dispositivos que crean dispositivos con teclas de navegación de hardware que desean implementar esta función deberán diseñar e implementar su propio indicador visual de la IU del sistema o inhabilitar la función. Se recomienda que cualquier superficie que se presente sea fácil de usar cuando el dispositivo se sostenga a 90º o 180º de la rotación del sistema actual y se pueda acceder a ella rápidamente. Por estos motivos, no se recomienda el uso de notificaciones (como se hace para el selector de IME o teclado).
Los requisitos de hardware para usar esta función son los mismos que los requisitos para usar la función de giro automático.
Para garantizar la coherencia de la implementación, es necesario que la preferencia de rotación del usuario (Settings.System.USER_ROTATION
) se restablezca a la rotación natural del dispositivo cuando el sistema cambie a la rotación natural del dispositivo por cualquier motivo cuando la rotación automática esté desactivada. La implementación proporcionada hace esto (consulta NavigationBarFragment.mRotationWatcher
).
Hay una nueva marca en StatusBarManager.disable2
para evitar temporalmente que aparezcan sugerencias de rotación. Consulta
StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS
. Esta marca se debe respetar en todas las implementaciones, ya que la usan las apps del sistema críticas, incluido el Asistente de configuración. La implementación proporcionada admite esto (consulta NavigationBarFragment.disable()
).
Te recomendamos que habilites la función y sigas la implementación de AOSP, si es posible. Nuestro objetivo es mantener la experiencia de rotación similar entre los dispositivos, lo que refleja la uniformidad en la experiencia de la mayoría de los teléfonos actuales entre la rotación automática y el bloqueo vertical.
Personalización
Como las sugerencias de rotación solo aparecen en el modo de rotación bloqueada (rotación automática desactivada), es posible elegir si la función está activada de forma predeterminada para las instalaciones nuevas. Para ello, desactiva la rotación automática de forma predeterminada. Consulta def_accelerometer_rotation
en SettingsProvider/res/values/defaults.xml
para realizar cambios predeterminados.
Los usuarios pueden cambiar fácilmente si la opción de giro automático está activa o no (independientemente de la configuración predeterminada) a través de la tarjeta de giro en Configuración rápida o Configuración de pantalla.
Validación
Para las pruebas, se puede desactivar y activar la función alterando un valor de Settings.Secure
de control de acceso. Para ello, ejecuta el siguiente comando desde una instancia de adb con privilegios:
adb shell settings put secure show_rotation_suggestions <x>
Establece x en 0
para desactivar y 1
para activar.
Para las pruebas, se puede restablecer el modo de introducción alterando el valor asociado de Settings.Secure
. Para ello, ejecuta el siguiente comando desde una instancia de adb con privilegios:
adb shell settings put secure num_rotation_suggestions_accepted 0