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 manualmenteView.requestFocus()
. - Contrassegna le visualizzazioni scorrevoli personalizzate come attivabili utilizzando entrambi
android:focusable="true"
eandroid: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 utenterequestFocus()
dopo averlo attaccato. - Se la visualizzazione scorrevole inizialmente è
INVISIBLE
oGONE
, chiamarequestFocus()
quando lo imposti suVISIBLE
. - 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 chiamandorequestFocus()
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.
Il seguente snippet di codice mostra come utilizzare MotionEvent
,
InputDeviceCompat
,
e ViewConfigurationCompat
per aggiungere lo scorrimento personalizzato alla visualizzazione:
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; } });
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.
- In Android Studio, seleziona Strumenti >. Android > Gestione AVD. Crea un nuovo dispositivo Wear con API 25. in alto.
- Esegui l'emulatore da Android Studio.
- 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: