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, se desplaza hacia arriba o hacia abajo por la vista actual de tu app. Este tipo de entrada se denomina entrada rotativa.
Nota: Esta guía se refiere principalmente al control de entradas rotativas a través de IUs basadas en View. Si deseas obtener más información sobre el control de entradas rotativas con Compose para Wear OS, consulta Entrada rotativa en Compose.
Muchos contenedores desplazables, como ScrollView, ListView, HorizontalScrollView y WearableRecyclerView, admiten entradas rotativas si tienen enfoque sin requerir ningún código específico de Wear OS.
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.
Los eventos de entrada rotativa 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().
Las siguientes son prácticas recomendadas para responder a eventos de entrada rotativos:
Ten en cuenta que, de forma predeterminada, 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".
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 alguna otra vista que enfoca cuando el usuario interactúa con ella, por ejemplo, un InputText, ofrécele al usuario una manera de restablecer el enfoque en la vista desplazable si pierde el foco 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.
myView.setOnGenericMotionListener{v,ev->
if(ev.action==MotionEvent.ACTION_SCROLL&&
ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)){// Don't forget the negation herevaldelta=-ev.getAxisValue(MotionEventCompat.AXIS_SCROLL)*ViewConfigurationCompat.getScaledVerticalScrollFactor(ViewConfiguration.get(context),context)// Swap these axes to scroll horizontally insteadv.scrollBy(0,delta.roundToInt())true}else{false}}
Java
myView.setOnGenericMotionListener(newView.OnGenericMotionListener(){@OverridepublicbooleanonGenericMotion(Viewv,MotionEventev){if(ev.getAction()==MotionEvent.ACTION_SCROLL&&
ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)){// Don't forget the negation herefloatdelta=-ev.getAxisValue(MotionEventCompat.AXIS_SCROLL)*ViewConfigurationCompat.getScaledVerticalScrollFactor(ViewConfiguration.get(context),context);// Swap these axes to scroll horizontally insteadv.scrollBy(0,Math.round(delta));returntrue;}returnfalse;}});
Cómo realizar pruebas con un emulador
Usa Android Emulator para simular el desplazamiento de entrada rotativa en un dispositivo para Wear. Inicia tu app para 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.
En Android Studio, selecciona Tools > Android > Administrador de AVD.
Crea un dispositivo para Wear nuevo con un nivel de API 25 o uno superior.
Haz clic en el menú ampliado de tres puntos ubicado 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:
El contenido y las muestras de código que aparecen en esta página están sujetas a las licencias que se describen en la Licencia de Contenido. Java y OpenJDK son marcas registradas de Oracle o sus afiliados.
Última actualización: 2025-07-26 (UTC)
[[["Fácil de comprender","easyToUnderstand","thumb-up"],["Resolvió mi problema","solvedMyProblem","thumb-up"],["Otro","otherUp","thumb-up"]],[["Falta la información que necesito","missingTheInformationINeed","thumb-down"],["Muy complicado o demasiados pasos","tooComplicatedTooManySteps","thumb-down"],["Desactualizado","outOfDate","thumb-down"],["Problema de traducción","translationIssue","thumb-down"],["Problema con las muestras o los códigos","samplesCodeIssue","thumb-down"],["Otro","otherDown","thumb-down"]],["Última actualización: 2025-07-26 (UTC)"],[],[],null,["# Rotary input\n\nSome Wear OS devices contain a physical *rotating side button* . When the user turns the\nbutton, it scrolls your app's current view up or down. This type of input is called\n*rotary input*.\n\n**Note:** This guide refers primarily to handling rotary input using\nView-based UIs. For more information on handling rotary input using Compose for Wear OS, see\n[Rotary input on Compose](/training/wearables/compose/rotary-input).\n\nMany scrollable containers, like\n[ScrollView](/reference/android/widget/ScrollView),\n[ListView](/reference/android/widget/ListView),\n[HorizontalScrollView](/reference/android/widget/HorizontalScrollView),\nand [WearableRecyclerView](/reference/androidx/wear/widget/WearableRecyclerView),\nsupport rotary input if they have focus without requiring any Wear\nOS-specific code.\nHaving focus is an important prerequisite, because on Android 9 (API level\n28) and higher, views don't implicitly receive focus.\n\nFocus best practices\n--------------------\n\n\nTo respond to rotary input events, a scrollable container must have focus.\nRotary input events don't bubble up the view\nhierarchy. If there is no focused view, or if the focused view returns `false` from\n[View.onGenericMotionEvent()](/reference/android/view/View#onGenericMotionEvent(android.view.MotionEvent)),\nthen the event is sent to\n[Activity.onGenericMotionEvent()](/reference/android/app/Activity#onGenericMotionEvent(android.view.MotionEvent)).\n\n\nThe following are best practices around responding to rotary input events:\n\n- Bear in mind that, by default, launching an activity or even tapping on a view does not give it focus, even if it is focusable. To give your view focus, the view must use the [<requestFocus /\u003e](/guide/topics/resources/layout-resource) tag or manually call [View.requestFocus()](/reference/android/view/View#requestFocus()).\n- Mark custom scrollable views as focusable using both `android:focusable=\"true\"` and `android:focusableInTouchMode=\"true\"`.\n- If your scrollable view is attached after [Activity.onCreate()](/reference/android/app/Activity#onCreate(android.os.Bundle))---for example, waiting for a network request to finish before building your UI, call `requestFocus()` after attaching it.\n- If your scrollable view is initially [INVISIBLE](/reference/android/view/View#INVISIBLE) or [GONE](/reference/android/view/View#GONE), call `requestFocus()` when you set it to [VISIBLE](/reference/android/view/View#VISIBLE).\n- If your activity contains multiple scrollable views, choose one to focus using the [<requestFocus /\u003e](/guide/topics/resources/layout-resource) tag. Nested scrolling is not supported with the rotating side button.\n- If your UI contains some other view that takes focus when the user interacts with it---for example, an `InputText`, give the user a way to restore focus to the scrollable view if it loses focus by listening for taps on the scrollable view and calling `requestFocus()` in response.\n\nCustom rotating behavior\n------------------------\n\nIf your scrollable view doesn't natively support rotary input scrolling, or if you want to\nuse your rotary input for something other than scrolling---such as to\nzoom in and out or to turn dials---you can handle the scroll events\nyourself. Remember to make sure your view gains focus, otherwise\nthe events will not come through.\n\nThe following code snippet shows how to use [MotionEvent](/reference/android/view/MotionEvent),\n[InputDeviceCompat](/reference/kotlin/androidx/core/view/InputDeviceCompat),\nand [ViewConfigurationCompat](/reference/androidx/core/view/ViewConfigurationCompat)\nto add custom scrolling to your view: \n\n### Kotlin\n\n```kotlin\nmyView.setOnGenericMotionListener { v, ev -\u003e\n if (ev.action == MotionEvent.ACTION_SCROLL &&\n ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)\n ) {\n // Don't forget the negation here\n val delta = -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL) *\n ViewConfigurationCompat.getScaledVerticalScrollFactor(\n ViewConfiguration.get(context), context\n )\n // Swap these axes to scroll horizontally instead\n v.scrollBy(0, delta.roundToInt())\n true\n } else {\n false\n }\n}\n```\n\n### Java\n\n```java\nmyView.setOnGenericMotionListener(new View.OnGenericMotionListener() {\n @Override\n public boolean onGenericMotion(View v, MotionEvent ev) {\n if (ev.getAction() == MotionEvent.ACTION_SCROLL &&\n ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)\n ) {\n // Don't forget the negation here\n float delta = -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL) *\n ViewConfigurationCompat.getScaledVerticalScrollFactor(\n ViewConfiguration.get(context), context\n );\n\n // Swap these axes to scroll horizontally instead\n v.scrollBy(0, Math.round(delta));\n\n return true;\n }\n return false;\n }\n});\n```\n\nTest using an emulator\n----------------------\n\nUse the [Android Emulator](/studio/run/emulator#about) to simulate rotary input\nscrolling on a Wear device. Launch your Wear app on the emulator to run\nyour project or drag an\nAPK file onto the emulator to install it.\n\nTo test the rotary input on the emulator:\n\n1. From the [SDK manager](/tools/help/sdk-manager), use the **SDK tools** tab to get Android Emulator 26.0.3 or higher.\n2. In Android Studio, select **Tools \\\u003e\n Android \\\u003e AVD Manager** . [Create a new Wear device](/studio/run/managing-avds#createavd) with API 25 or higher.\n3. [Run the emulator from Android Studio](/studio/run/emulator#runningapp).\n4. Click the three-dot overflow menu at the bottom of the emulator toolbar. Click the **Rotary input** tab in the new window to open the rotary input interface and try rotary input scrolling.\n\nThe following video shows rotary input in the emulator:"]]