Mantieni tutto organizzato con le raccolte
Salva e classifica i contenuti in base alle tue preferenze.
Alcuni dispositivi Wear OS contengono un pulsante laterale rotante fisico. Quando l'utente attiva
, consente di scorrere verso l'alto o verso il basso la visualizzazione corrente dell'app. Questo tipo di input è chiamato
input rotatorio.
Nota: questa guida si riferisce principalmente alla gestione dell'input rotatorio utilizzando
UI basate sulla visualizzazione. Per maggiori informazioni sulla gestione dell'input rotatorio tramite Compose per Wear OS, consulta
Input rotatorio su Compose.
Molti container scorrevoli, come
ScrollView,
ListView,
HorizontalScrollView,
e WearableRecyclerView,
supportano l'input rotatorio se hanno lo stato attivo e non richiedono alcun dispositivo Wear
Codice specifico del sistema operativo.
Porre attenzione è un prerequisito importante, perché su Android 9 (livello API
28) e successive, le visualizzazioni non sono implicitamente focalizzate.
Ottimizza le best practice
Per rispondere agli eventi di input rotatorio, un container scorrevole deve essere attivo.
Gli eventi di input rotatorio non mostrano il bollino della vista
nella gerarchia. Se non è presente una visualizzazione con stato attivo o se la visualizzazione con stato attivo restituisce false da
View.onGenericMotionEvent(),
l'evento viene inviato
Activity.onGenericMotionEvent().
Di seguito sono riportate le best practice relative alla risposta agli eventi di input rotatorio:
Ricorda che, per impostazione predefinita, l'avvio di un'attività o il tocco
vista non mette a fuoco, anche se
attivabile. Per impostare lo stato attivo su una vista, quest'ultima deve usare la classe
<requestFocus />
o chiamare manualmente View.requestFocus().
Contrassegna le visualizzazioni scorrevoli personalizzate come attivabili utilizzando entrambi android:focusable="true"
e android:focusableInTouchMode="true".
Se la visualizzazione scorrevole è collegata dopo il giorno Activity.onCreate(), per
ad esempio, attendere il completamento di una richiesta di rete prima di creare l'interfaccia utente
requestFocus() dopo averlo attaccato.
Se la visualizzazione scorrevole inizialmente è INVISIBLE
o GONE,
chiama requestFocus() quando lo imposti su
VISIBLE.
Se l'attività contiene più visualizzazioni scorrevoli, scegline una su cui concentrarti utilizzando il menu
<requestFocus />
del tag. Lo scorrimento nidificato non è supportato con il pulsante laterale rotante.
Se la UI contiene un'altra visualizzazione che viene attivata quando l'utente
ci interagisce, ad esempio
InputText, consente all'utente di ripristinare lo stato attivo sulla visualizzazione scorrevole
se perde la messa a fuoco ascoltando i tocchi sulla visualizzazione scorrevole e chiamando
requestFocus() in risposta.
Comportamento di rotazione personalizzato
Se la visualizzazione scorrevole non supporta in modo nativo lo scorrimento dell'input rotatorio o se vuoi
utilizzare l'input rotatorio per qualcosa di diverso dallo scorrimento, ad esempio
aumentare e diminuire lo zoom oppure per ruotare i quadranti, puoi gestire gli eventi di scorrimento
per te. Ricordati di controllare la visualizzazione, altrimenti
non arrivano gli eventi.
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;}});
Esegui un test con un emulatore
Utilizza l'emulatore Android per simulare l'input rotatorio
scorrere su un dispositivo Wear. Avvia l'app Wear sull'emulatore per eseguirla
un progetto o trascinare
APK nell'emulatore per installarlo.
Per testare l'input rotatorio sull'emulatore:
In Gestione SDK, utilizza la scheda Strumenti SDK per
ottenere Android Emulator 26.0.3 o superiore.
Fai clic sul menu extra con tre puntini nella parte inferiore della barra degli strumenti dell'emulatore. Fai clic sull'
Scheda Input rotatorio nella nuova finestra per aprire l'interfaccia di input rotatorio
lo scorrimento dell'input.
Il seguente video mostra l'input rotatorio nell'emulatore:
I campioni di contenuti e codice in questa pagina sono soggetti alle licenze descritte nella Licenza per i contenuti. Java e OpenJDK sono marchi o marchi registrati di Oracle e/o delle sue società consociate.
Ultimo aggiornamento 2025-07-26 UTC.
[[["Facile da capire","easyToUnderstand","thumb-up"],["Il problema è stato risolto","solvedMyProblem","thumb-up"],["Altra","otherUp","thumb-up"]],[["Mancano le informazioni di cui ho bisogno","missingTheInformationINeed","thumb-down"],["Troppo complicato/troppi passaggi","tooComplicatedTooManySteps","thumb-down"],["Obsoleti","outOfDate","thumb-down"],["Problema di traduzione","translationIssue","thumb-down"],["Problema relativo a esempi/codice","samplesCodeIssue","thumb-down"],["Altra","otherDown","thumb-down"]],["Ultimo aggiornamento 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:"]]