Algunos dispositivos Wear OS admiten entrada rotativa, como un botón lateral giratorio (RSB). Cuando el usuario gira el botón, la vista actual de la app debería desplazarse hacia arriba o hacia abajo.
Si estás utilizando ScrollView, ListView, HorizontalScrollView o WearableRecyclerView en tu app, entonces la vista ofrece compatibilidad con la entrada rotativa de forma predeterminada. Si usas otras vistas personalizadas, o si deseas controlar manualmente los eventos de entrada rotativos, consulta Cómo agregar desplazamiento de entrada rotativa personalizado.
Consulta los siguientes recursos relacionados:
Prácticas recomendadas sobre enfoque
Para responder a los eventos de entrada rotativos, tu vista de desplazamiento debe estar enfocada. En la mayoría de los casos, esto sucede de forma automática; la vista de desplazamiento se enfoca inmediatamente después de que hayas creado una Actividad. Sin embargo, hay situaciones en las que es necesario controlar de forma manual el enfoque de la vista de tu app, como en estos casos:
- Si se adjunta la vista desplazable después de Activity.onCreate() (por ejemplo, si esperas a que finalice una solicitud de red antes de diseñar la IU), debes llamar a requestFocus después de adjuntarla.
- Si tu vista desplazable es inicialmente INVISIBLE o GONE, debes llamar a
requestFocus
cuando la configures como VISIBLE. - Si tu Actividad contiene varias vistas desplazables (por ejemplo, si estás usando un desplazamiento anidado), debes elegir una para enfocar (generalmente a través de la etiqueta <requestFocus />). Por el momento, el desplazamiento anidado no es compatible con el desplazamiento RSB.
- Si la IU contiene alguna otra vista que le quita enfoque cuando el usuario interactúa con ella (esto es raro, el ejemplo más común es un
InputText
), debes proporcionarle al usuario algún modo de restablecer la vista desplazable si pierde enfoque. Por lo general, esto se hace escuchando presiones en la vista desplazable y llamando arequestFocus
en respuesta.
Cómo agregar desplazamiento de entrada rotativa personalizado
Si la vista desplazable no admite el desplazamiento entrada rotativa, o si deseas realizar otra acción que no sea desplazarte en respuesta a eventos de entrada rotativos (acercar/alejar, girar diales, etc.), puedes usar los métodos RotaryEncoder
en la Biblioteca de compatibilidad con Wearable.
En el siguiente fragmento de código, se muestra cómo usar RotaryEncoder
para agregar desplazamiento personalizado en la vista de tu app:
Kotlin
myView.setOnGenericMotionListener(View.OnGenericMotionListener { v, ev -> if (ev.action == MotionEvent.ACTION_SCROLL && RotaryEncoder.isFromRotaryEncoder(ev)) { // Don't forget the negation here val delta = -RotaryEncoder.getRotaryAxisValue(ev) * RotaryEncoder.getScaledScrollFactor(context) // Swap these axes if you want to do horizontal scrolling instead v.scrollBy(0, Math.round(delta)) return@OnGenericMotionListener true } false })
Java
myView.setOnGenericMotionListener(new View.OnGenericMotionListener() { @Override public boolean onGenericMotion(View v, MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_SCROLL && RotaryEncoder.isFromRotaryEncoder(ev)) { // Don't forget the negation here float delta = -RotaryEncoder.getRotaryAxisValue(ev) * RotaryEncoder.getScaledScrollFactor( getContext()); // Swap these axes if you want to do horizontal scrolling instead v.scrollBy(0, Math.round(delta)); return true; } return false; } });
Cómo probar el botón de entrada rotativa en el emulador
Puedes usar el Emulador de Android para simular el desplazamiento de entrada rotativa en un dispositivo Wear. Inicia tu app de Wear en el emulador cuando ejecutes tu proyecto o arrastra un archivo APK al emulador para instalarlo.
Para probar la entrada rotativa en el emulador, haz lo siguiente:
- Desde SDK Manager, usa la pestaña herramientas del SDK para obtener Android Emulator versión 26.0.3 o posterior.
- Crea un AVD (dispositivo virtual de Android) con API 25.
En Studio, selecciona Tools>Android>AVD Manager. Crea un nuevo dispositivo Wear con API 25.
- Ejecuta el emulador desde Android Studio.
- Intenta ejecutar el desplazamiento de entrada rotativa.
Haz clic en el botón de contenido adicional (tres puntos ubicados en la parte inferior de la barra de herramientas del emulador). En la nueva ventana, haz clic en la pestaña Entrada rotativa para abrir la interfaz de entrada rotativa.
El siguiente video muestra la entrada rotativa en el emulador:
Sugerencias sobre el comportamiento del enfoque
- Desde Android 9 (nivel de API 28), las vistas ya no reciben el enfoque de forma implícita y, en su lugar, deben hacerlo de forma explícita.
- Una vista desplazable debe registrarse como enfocable mediante
android:focusable="true"
yandroid:focusableInTouchMode="true"
. - De forma predeterminada, el hecho de iniciar una actividad o incluso presionar una vista no lo enfoca (aunque sea enfocable). Para lograr este comportamiento, la vista debe usar la etiqueta
<requestFocus />
o llamar aView.requestFocus()
de forma manual. - Los eventos de entrada rotativa solo se envían a la vista enfocada. Estos eventos no aparecen en la jerarquía de vistas. Si no hay una vista enfocada, o si la vista enfocada muestra
false
desdeView.onGenericMotionEvent
, entonces (y solo entonces) el evento se envía aActivity.onGenericMotionEvent
.