Los dispositivos de TV requieren un dispositivo de hardware secundario para interactuar con las apps, como un control remoto básico, un control remoto con puntero o un control de juegos. Para brindar una experiencia del usuario coherente, tu app debe admitir la entrada de pad direccional, controlar los controles que se desconectan y admitir la entrada de varios tipos de controles, incluidos los controles remotos con puntero.
Controles mínimos para pad direccional
El control predeterminado para un dispositivo de TV es el pad direccional. En general, tu app debe poder operarse desde un control remoto que solo tenga los botones de arriba, abajo, izquierda, derecha, seleccionar, Atrás y Página principal. Si tu app es un juego que suele requerir un control de juegos con controles adicionales, intenta admitir el juego solo con estos controles de pad direccional. De lo contrario, adviértele al usuario que se requiere un control y permítele salir del juego de forma correcta con el pad direccional.
Para obtener más información sobre la navegación con controles de pad direccional para dispositivos de TV, consulta Navegación en TV.
Administra la desconexión de controles
Los controles para TV suelen ser dispositivos Bluetooth, que pueden intentar ahorrar energía entrando periódicamente en el modo de suspensión y desconectándose del dispositivo de TV. Esto significa que una app podría interrumpirse o reiniciarse si no está configurada para controlar estos eventos de reconexión. Estos eventos pueden ocurrir en cualquiera de las siguientes circunstancias:
- Mientras se reproduce un video de varios minutos, es posible que un pad direccional o un control de juegos entren en modo de suspensión, se desconecten del dispositivo de TV y se vuelvan a conectar más tarde.
- Durante el juego, es posible que un jugador nuevo se una con un control de juegos que aún no esté conectado.
- Durante el juego, un jugador puede salir y desconectar un control de juegos.
Cualquier actividad de la app para TVs que esté sujeta a eventos de desconexión y reconexión debe configurarse para controlar los eventos de reconexión en el manifiesto de la app. En la siguiente muestra de código, se indica cómo habilitar una actividad para que controle los cambios de configuración, incluida la conexión, desconexión o reconexión de un teclado o dispositivo de navegación:
<activity
android:name="com.example.android.TvActivity"
android:label="@string/app_name"
android:configChanges="keyboard|keyboardHidden|navigation"
android:theme="@style/Theme.Leanback">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>
...
</activity>
Este cambio de configuración permite que la app siga ejecutándose durante un evento de reconexión, en lugar de que el framework de Android la reinicie, lo que no es una buena experiencia del usuario.
Administra las variaciones de entrada de pad direccional
Es posible que los usuarios de dispositivos de TV tengan más de un tipo de control que usen con su TV. Por ejemplo, un usuario puede tener un control de pad direccional básico, un control remoto de puntero o un control de juegos. Los códigos de teclas que proporciona un control de juegos cuando se usa para las funciones del pad direccional pueden variar de los códigos de teclas que envía un pad direccional básico.
Controla las variaciones en la entrada del pad direccional para que el usuario no tenga que cambiar de control para usar tu app. Para obtener más información sobre cómo controlar las variaciones de entrada, consulta Cómo procesar la entrada del pad direccional.
Compatibilidad con controles remotos con puntero
Algunos dispositivos de TV admiten controles remotos con puntero, como ratones inalámbricos o controles remotos con pads direccionales sensibles al tacto (trackpads). La compatibilidad con controles remotos de puntero permite que los usuarios interactúen con tu app a través de gestos de apuntar y hacer clic, colocar el cursor sobre un elemento, deslizar y arrastrar, lo que proporciona una experiencia más fluida en el hardware compatible y, al mismo tiempo, mantiene la compatibilidad total con el pad direccional.
Declara la compatibilidad con el control remoto de puntero en el manifiesto
Para indicar que se puede navegar por tu app con entradas táctiles y de puntero, configura
el manifiesto de la app con el atributo android.software.leanback.supports_touch
<property> establecido en true dentro del elemento <application> (o dentro
de elementos <activity> individuales para configurar la compatibilidad por actividad):
<manifest ...>
<!-- Signal whether the app is adaptive or built just for TV -->
<uses-feature
android:name="android.software.leanback"
android:required="true|false" />
<!-- Ensure the app can be installed on conventional TVs -->
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false" />
<application ...>
<!-- Signal whether the app supports pointer remotes -->
<property
android:name="android.software.leanback.supports_touch"
android:value="true" />
...
</application>
</manifest>
Admiten interacciones de clic, desplazamiento del cursor y desplazamiento de la página.
Cuando admitas controles remotos de puntero, asegúrate de que los componentes de la IU respondan de forma adecuada a la entrada táctil y del cursor en las siguientes interacciones:
- Clic y selección: Todos los elementos de la IU que se pueden seleccionar y enfocar deben poder seleccionarse con el control remoto de puntero, lo que coincide con el comportamiento de la selección del pad direccional (
KEYCODE_DPAD_CENTER).- Jetpack Compose: Usa los modificadores
Modifier.clickable()opointerInput. Para obtener más detalles, consulta Presiona y mantén presionado. - Vistas: Controla los eventos de clic en las vistas. Para obtener más detalles, consulta la descripción general de los eventos de entrada.
- Jetpack Compose: Usa los modificadores
- Estados de desplazamiento visuales: Proporciona un efecto visual claro de desplazamiento para indicar cuándo el cursor se coloca sobre un elemento seleccionable.
- Jetpack Compose: Usa
Modifier.hoverable()o observa los estados de desplazamiento con unInteractionSource. Para obtener más detalles, consulta Cómo controlar las interacciones de los usuarios. - Vistas: Define los estados de desplazamiento con elementos de diseño de lista de estados con
android:state_hovered="true".
- Jetpack Compose: Usa
- Desplazamiento con deslizamiento y deslizamiento rápido: El desplazamiento horizontal y vertical que se activa con un gesto de deslizamiento o deslizamiento rápido en un botón central del pad direccional sensible al tacto debe funcionar sin problemas en todo el contenido desplazable.
- Desplazamiento por arrastre: Los usuarios deben poder arrastrar para desplazarse verticalmente (hacia arriba y abajo) o de forma horizontal (hacia la izquierda y la derecha) por los contenedores desplazables.
- Jetpack Compose: Los contenedores desplazables estándar admiten el desplazamiento con puntero y táctil de forma predeterminada. Para implementaciones personalizadas, consulta Entrada del puntero en Compose.
- Vistas: Las vistas desplazables estándar admiten el desplazamiento táctil de forma predeterminada. Para obtener información sobre el control de entradas personalizadas, consulta Entrada y control táctil.
- Desplazamiento por la reproducción de contenido multimedia: Durante la reproducción de contenido multimedia (como programas de TV y películas), los usuarios deben poder interactuar con la barra de progreso de la reproducción (barra de búsqueda) apuntando y haciendo clic para saltar a una marca de tiempo anterior o posterior, así como arrastrando (desplazándose) por la barra de progreso para buscar un momento específico.
Administra eventos de botones
Cuando el usuario hace clic en un botón de un control, tu app recibe un evento con un KeyEvent. El comportamiento previsto para el botón puede ser un evento de contenido multimedia, como reproducir, pausar o detener, o bien un evento de tipo TV, como selección o navegación. Para proporcionar una buena experiencia del usuario, asigna un comportamiento coherente a los botones del control.
Eventos de IU de TV
Asigna el comportamiento de la IU de TV a los botones que generan tipos de KeyEvent, como se muestra en la siguiente tabla:
KeyEvent |
Comportamiento |
|---|---|
KEYCODE_BUTTON_B, KEYCODE_BACK |
Atrás |
KEYCODE_BUTTON_SELECT, KEYCODE_BUTTON_A, KEYCODE_ENTER, KEYCODE_DPAD_CENTER, KEYCODE_NUMPAD_ENTER |
Selección |
KEYCODE_DPAD_UP, KEYCODE_DPAD_DOWN, KEYCODE_DPAD_LEFT, KEYCODE_DPAD_RIGHT |
Navegación |
Eventos multimedia
Cuando el usuario esté mirando contenido multimedia, asigna un comportamiento a los botones que generan tipos de KeyEvent, como se muestra en la siguiente tabla. Si tu app controla un objeto MediaSession, usa un objeto MediaControllerAdapter para llamar a uno de los métodos MediaControllerCompat.TransportControls que se muestran en la tabla. Ten en cuenta que, en este contexto, los botones de selección funcionan como botones de reproducción o pausa.
KeyEvent |
Llamada de TransportControls | Comportamiento |
|---|---|---|
BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER, KEYCODE_NUMPAD_ENTER |
play() |
Reproducir |
BUTTON_START, BUTTON_SELECT, BUTTON_A, ENTER, DPAD_CENTER y KEYCODE_NUMPAD_ENTER |
pause() |
Pausar |
BUTTON_R1 |
skipToNext() |
Siguiente |
BUTTON_L1 |
skipToPrevious() |
Anterior |
DPAD_RIGHT, BUTTON_R2, AXIS_RTRIGGER, AXIS_THROTTLE |
fastForward() |
Adelantar |
DPAD_LEFT, BUTTON_L2, AXIS_LTRIGGER, AXIS_BRAKE |
rewind() |
Retroceder |
| N/A | stop() |
Detener |
Proporciona un comportamiento adecuado para el botón Atrás
El botón Atrás nunca debe actuar como un botón de activación. Por ejemplo, no lo uses para abrir y cerrar un menú. Solo úsalo para navegar hacia atrás, al estilo de ruta de navegación, por las pantallas anteriores en las que estuvo el jugador.
Como el botón Atrás solo realiza una navegación lineal hacia atrás, puedes usarlo para salir de un menú integrado en la app que se abrió con un botón diferente y volver a la app. Si presionas el botón Atrás de forma consecutiva, siempre debes llegar a la pantalla principal de Android TV. Por ejemplo: juego > pantalla de pausa del juego > pantalla principal del juego > pantalla principal de Android TV o reproducción de programa de TV > pantalla principal de la app para TVs
Pantalla principal de Android TV.
Para obtener más información sobre el diseño de la navegación, consulta Cómo diseñar la navegación hacia atrás y hacia arriba. Para obtener información sobre la implementación, consulta Cómo proporcionar una navegación hacia atrás adecuada.
Administración de controles para juegos
Cuando compiles juegos para Android TV, diseña tu esquema de control para que funcione con controles remotos de TV estándar y controles de juegos dedicados.
Admite controles de pad direccional
Planifica tu esquema de control en torno a un pad direccional, ya que este conjunto de controles es el predeterminado para los dispositivos Android TV. El jugador debe poder usar un pad direccional para todos los aspectos del juego, no solo para controlar la experiencia de juego principal, sino también para navegar por los menús de navegación y los anuncios. Por este motivo, asegúrate de que tu juego para Android TV no haga referencia a una interfaz táctil con un lenguaje como "Presiona aquí para continuar".
La forma en que configuras la interacción del jugador con el control puede ser clave para lograr una excelente experiencia del usuario. Analiza las siguientes prácticas recomendadas:
- Comunica los requisitos de los controles por adelantado: Usa la descripción de Google Play para comunicar al jugador cualquier expectativa sobre los controles. Si un juego es más adecuado para un control de juegos con un joystick que para uno con solo un pad direccional, acláralo. Un jugador que use un control inadecuado para un juego podría tener una experiencia deficiente y calificarlo de forma negativa.
- Usa una asignación de botones coherente: La asignación intuitiva de botones es clave para una buena experiencia del usuario. Por ejemplo, respeta las costumbres aceptadas usando el botón A para aceptar y el botón B para cancelar. También puedes ofrecer flexibilidad permitiendo que el usuario reasigne los botones. Para obtener más información sobre la asignación de botones, consulta Cómo controlar las acciones del control.
- Detecta las capacidades del control y ajústalas según corresponda: Consulta al control sobre sus capacidades para optimizar la coincidencia entre el control y el juego. Por ejemplo, es posible que quieras que un jugador dirija un objeto moviendo el control en el aire, pero si el control del jugador no tiene hardware de acelerómetro y giroscopio, el movimiento no funcionará. Consulta el control y, si no se admite la detección de movimiento, cambia a un esquema de control alternativo disponible. Para obtener más información sobre cómo consultar las capacidades de los controles, consulta Cómo admitir controles en diferentes versiones de Android.
Usa los botones correctos
No todos los controles de juego tienen los botones Inicio, Búsqueda o Menú. Asegúrate de que tu IU no dependa del uso de estos botones.
Administra varios controles
Cuando varios jugadores participan en un juego, cada uno con su propio control, es importante asignar cada par de jugador y control. Para obtener información sobre cómo implementar la identificación del número de controlador, consulta getControllerNumber().
Administra la desconexión de controles
Cuando se desconecte un control en medio del juego, pausa la partida y muestra un diálogo que le indique al jugador desconectado que vuelva a conectar su control.
También ofrece sugerencias para solucionar problemas en el diálogo. Por ejemplo, dile al jugador que "verifique su conexión Bluetooth". Para obtener más información sobre cómo implementar la compatibilidad con dispositivos de entrada, consulta Cómo administrar las acciones de los controles y la Descripción general de Bluetooth.
Muestra instrucciones del control
Si tu juego proporciona instrucciones visuales de control de juegos, usa una imagen de control de juegos sin marca y que solo incluya botones compatibles con Android.
Para ver imágenes de muestra de un control compatible con Android, descarga la plantilla de control de juegos para Android TV (ZIP). Incluye un control blanco sobre un fondo negro y un control negro sobre un fondo blanco, como se muestra en la figura 1, como un archivo PNG y como un archivo de Adobe® Illustrator®.