En Android 8.0, los usuarios podían alternar entre los modos de rotación automática y vertical usando un mosaico de Configuración rápida o la configuración de Pantalla. En Android 9, actualizamos el modo de rotación vertical para eliminar rotaciones involuntarias al fijar la rotación actual de la pantalla 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 retrato a bloqueo de rotación y se activa cuando la rotación automática está desactivada. No hay cambios en el modo de rotación automática.
Cuando el dispositivo está en modo de bloqueo de rotación, los usuarios pueden bloquear su pantalla para cualquier rotación admitida por la Actividad superior visible (dadas las restricciones actuales del sistema). Si la Actividad superior se puede representar en múltiples 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 basadas en la configuración screenOrientation
de la Actividad.
El modo de bloqueo de rotación funciona mostrando un botón en la barra de navegación sobre los cambios de rotación del dispositivo. Para lograr esto, el sensor de orientación del dispositivo debe permanecer activo incluso cuando la rotación automática esté desactivada. Al tocar este botón se establece efectivamente 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 continúa usando la preferencia de rotación del usuario al decidir en qué rotación representar el sistema al pasar a otra Actividad.
![Este gif muestra un teléfono en orientación horizontal con la pantalla en orientación vertical. Aparece un icono que le pregunta al usuario si desea cambiar la orientación de su pantalla a horizontal.](https://source.android.com/static/docs/core/display/images/rotate-btn-quickstep.gif?authuser=0&hl=es)
La preferencia de rotación de usuarios debe mantenerse al moverse entre actividades. Sin embargo, debido a que la mayoría de los usuarios de teléfonos solo quieren estar en posición horizontal por un período corto y temporal, agregamos un 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. Para 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 ocurre a menudo cuando se usa una aplicación solo vertical, se bloquea el teléfono o se regresa al espacio de trabajo del iniciador.
Las interacciones de rotación para los usuarios no han cambiado mucho en la última década. Es posible que a los usuarios les resulte difícil descubrir esta función debido a su historial anterior con la rotación y la posición de los botones en la barra de navegación. Por esta razón, agregamos un modo de introducción al botón de rotación que lo resalta cuando aparece. El comportamiento del modo de introducción solo ocurre durante las primeras interacciones de los botones, después de las cuales el modo de introducción se desactiva.
Fuente
Se agregó compatibilidad con sugerencias de rotación a Android 9. La mayoría de los cambios se encuentran en los siguientes archivos.
-
services/.../server/policy/PhoneWindowManager.java
:- Ganchos que consumen la salida de
WindowOrientationListener
(MyOrientationListener
, responsable de monitorear los sensores para determinar si el dispositivo ha sido girado) - Mantiene activo
WindowOrientationListener
incluso cuando la rotación automática está desactivada (consulteneedSensorRunningLp()
). - Calcula la rotación del sistema dada la preferencia de rotación del usuario, pantalla de actividad superior, configuración
screenOrientation
y estado del sistema (verrotationForOrientationLw()
). - Determine si la Actividad superior puede rotar a una rotación determinada (consulte
isRotationChoicePossible()
).
- Ganchos que consumen la salida de
-
SystemUI/.../statusbar/phone/NavigationBarFragment
:- Determina si el botón de la barra de navegación debe mostrarse en las devoluciones de llamadas de sugerencias de rotación de
PhoneWindowManager
(consulteonRotationProposal()
). - Controla cuándo ocultar el botón de rotación de la barra de navegación (consulte las llamadas a
setRotateSuggestionButtonState(false)
) - Maneja los tiempos de espera de los botones, incluido el caso especial cuando la barra de navegación está oculta (comúnmente en pantalla completa)
- Restablece las preferencias del usuario al regresar a la orientación natural del dispositivo (
mRotationWatcher
) - Elige el estilo apropiado para la animación del botón de la barra de navegación, aplicado en
NavigationBarView
(veronRotationProposal()
). - Agrega lógica de modo de introducción, incluida animación especializada (consulte las referencias a
Settings.Secure.NUM_ROTATION_SUGGESTIONS_ACCEPTED
). - Implementa el indicador de rotación desactivar2 (ver
disable()
)
- Determina si el botón de la barra de navegación debe mostrarse en las devoluciones de llamadas de sugerencias de rotación de
-
SystemUI/.../statusbar/phone/NavigationBarView.java
:- Animación del icono del botón de estilos para que coincida con la rotación pendiente (consulte
updateRotateSuggestionButtonStyle()
). - Maneja los cambios de visibilidad del botón (consulte
setRotateButtonVisibility()
), incluida la lógica para ocultar el botón de rotación si ciertos servicios de accesibilidad están activos (teniendo en cuenta la clasificación de la pila de botones de la barra de navegación más a la derecha)
- Animación del icono del botón de estilos para que coincida con la rotación pendiente (consulte
-
SystemUI/res/layout/menu_ime.xml
:- Incluye un nuevo
KeyButtonView
para el botón de rotación, apilado encima del menú y el selector de IME/teclado, pero debajo del botón Accesibilidad.
- Incluye un nuevo
-
SystemUI/res/drawable/ic_sysbar_rotate_button.xml
:-
AnimatedVectorDrawable
complejo utilizado para animar el botón de rotación de la barra de navegación - El estilo (en
SystemUI/res/values/styles.xml
) se usa para establecer los ángulos de inicio y fin de rotación, de modo que el mismo elemento de diseño se pueda usar para animar varias rotaciones iniciales y finales. - El tinte de iconos se configura 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 utilizan 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 deseen implementar esta función deberán diseñar e implementar su propia interfaz de usuario del sistema o desactivar la función. Se recomienda que cualquier superficie introducida sea fácil de usar cuando el dispositivo se sostiene a 90º o 180º con respecto a la rotación actual del sistema y es de rápido acceso. Por estos motivos, no se recomienda el uso de notificaciones (como se hace con el IME/selector de teclado).
Los requisitos de hardware para utilizar esta función son los mismos que los requisitos para utilizar la rotación automática.
Es necesario para la coherencia de la implementación que la preferencia de rotación del usuario ( Settings.System.USER_ROTATION
) se restablezca a la rotación natural del dispositivo cuando el sistema cambia a la rotación natural del dispositivo por cualquier motivo cuando la rotación automática está desactivada. La implementación proporcionada hace esto (consulte NavigationBarFragment.mRotationWatcher
).
Hay una nueva bandera en StatusBarManager.disable2
para evitar temporalmente que aparezcan sugerencias de rotación. Consulte StatusBarManager.DISABLE2_ROTATE_SUGGESTIONS
. Esta marca debe respetarse en todas las implementaciones, ya que la utilizan aplicaciones críticas del sistema, incluido el Asistente de configuración. La implementación proporcionada admite esto (consulte NavigationBarFragment.disable()
).
Recomendamos encarecidamente habilitar la función y seguir la implementación de AOSP, si es posible. Nuestro objetivo es mantener la experiencia de rotación similar entre dispositivos, reflejando la uniformidad en la experiencia en 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 aparecen solo 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 nuevas instalaciones eligiendo desactivar la rotación automática de forma predeterminada. Consulte def_accelerometer_rotation
en SettingsProvider/res/values/defaults.xml
para realizar cambios predeterminados.
Los usuarios pueden cambiar fácilmente si la rotación automática está activa o no (independientemente del valor predeterminado) a través del mosaico de rotación en Configuración rápida o Configuración de pantalla.
Validación
Para realizar pruebas, la función se puede activar y desactivar modificando un valor Settings.Secure
. Esto se logra más fácilmente ejecutando el siguiente comando desde una instancia privilegiada de adb:
adb shell settings put secure show_rotation_suggestions <x>
Establezca x en 0
para desactivar y 1
para activar.
Para realizar pruebas, el modo de introducción se puede restablecer modificando el valor Settings.Secure
asociado. Esto se logra más fácilmente ejecutando el siguiente comando desde una instancia privilegiada de adb:
adb shell settings put secure num_rotation_suggestions_accepted 0