Entrada rotativa

Organiza tus páginas con colecciones Guarda y categoriza el contenido según tus preferencias.

Algunos dispositivos Wear OS contienen un botón lateral giratorio físico. Cuando el usuario gira el botón, la vista actual de la app debería desplazarse hacia arriba o hacia abajo. Este tipo de entrada se denomina entrada rotativa.

Muchos contenedores desplazables, como ScrollView, ListView, HorizontalScrollView y WearableRecyclerView, admiten entradas rotativas sin necesidad de código específico de Wear OS, si estos contenedores tienen enfoque. Tener el enfoque es un requisito previo importante porque, en Android 9 (nivel de API 28) y versiones posteriores, las vistas no reciben el enfoque de manera implícita.

Prácticas recomendadas sobre enfoque

Para responder a los eventos de entrada rotativos, un contenedor desplazable debe estar enfocado. Las siguientes son prácticas recomendadas para responder a eventos de entrada rotativos:

  • De forma predeterminada, el hecho de iniciar una actividad o incluso presionar una vista no lo enfoca (aunque sea enfocable). Para que se enfoque la vista, esta debe usar la etiqueta <requestFocus /> o llamar a View.requestFocus() de forma manual.
  • Marca las vistas desplazables personalizadas como enfocables con android:focusable="true" y android:focusableInTouchMode="true".
  • Los eventos de entrada rotativa se envían solo 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(), el evento se envía a Activity.onGenericMotionEvent().
  • Si se adjunta la vista desplazable después de Activity.onCreate() (por ejemplo, esperando a que finalice una solicitud de red antes de compilar la IU), llama a requestFocus() después de adjuntarla.
  • Si, en un principio, la vista desplazable es INVISIBLE o GONE, llama a requestFocus() cuando la establezcas en VISIBLE.
  • Si tu actividad contiene varias vistas desplazables, elige una para enfocarte mediante la etiqueta <requestFocus />. No se admite el desplazamiento anidado con el botón lateral giratorio.
  • Si la IU contiene otra vista que enfoca cuando el usuario interactúa con ella (por ejemplo, InputText), proporciónale alguna forma de restablecer el enfoque en la vista desplazable si pierde el enfoque. Por lo general, esto se hace escuchando presiones en la vista desplazable y llamando a requestFocus() en respuesta.

Comportamiento de rotación personalizado

Si tu vista desplazable no admite el desplazamiento de entrada rotativa de forma nativa, o si deseas usar la entrada rotativa para otro fin que no sea el desplazamiento (por ejemplo, acercar/alejar o girar diales), puedes controlar los eventos de desplazamiento por tu cuenta. Recuerda que debes asegurarte de que la vista se enfoque. De lo contrario, no se procesarán los eventos.

En el siguiente fragmento de código, se muestra cómo usar MotionEvent, InputDeviceCompat y ViewConfigurationCompat para agregar desplazamiento personalizado a tu vista:

Kotlin

myView.setOnGenericMotionListener { v, ev ->
  if (ev.action == MotionEvent.ACTION_SCROLL &&
      ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)
  ) {
    // Don't forget the negation here
    val delta = -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL) *
        ViewConfigurationCompat.getScaledVerticalScrollFactor(
             ViewConfiguration.get(context), context
        )
    // Swap these axes to scroll horizontally instead
    v.scrollBy(0, delta.roundToInt())
    true
  } else {
    false
  }
}

Java

myView.setOnGenericMotionListener(new View.OnGenericMotionListener() {
  @Override
  public boolean onGenericMotion(View v, MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_SCROLL &&
        ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)
    ) {
      // Don't forget the negation here
      float delta = -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL) *
          ViewConfigurationCompat.getScaledVerticalScrollFactor(
               ViewConfiguration.get(context), context
          );

      // Swap these axes to scroll horizontally instead
      v.scrollBy(0, Math.round(delta));

      return true;
    }
    return false;
  }
});

Cómo realizar pruebas con un emulador

Usa Android Emulator 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 SDK tools para obtener Android Emulator versión 26.0.3 o posterior.
  2. En Studio, selecciona Tools > Android > AVD Manager. Crea un dispositivo Wear nuevo con un nivel de API 25 o versiones posteriores.
  3. Ejecuta el emulador desde Android Studio.
  4. 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 ventana nueva, haz clic en la pestaña Rotary input para abrir la interfaz de entrada rotativa y probar el desplazamiento de entrada rotativa.

El siguiente video muestra la entrada rotativa en el emulador: