Entrada rotativa en Wear

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 a requestFocus 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:

  1. Desde SDK Manager, usa la pestaña herramientas del SDK para obtener Android Emulator versión 26.0.3 o posterior.
  2. 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.

  3. Ejecuta el emulador desde Android Studio.
  4. 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" y android: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 a View.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 desde View.onGenericMotionEvent, entonces (y solo entonces) el evento se envía a Activity.onGenericMotionEvent.