Alcuni dispositivi Wear OS hanno un pulsante laterale rotante fisico. Quando l'utente ruota il pulsante, fa 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 mediante UI basate sulle visualizzazioni. Per ulteriori informazioni sulla gestione dell'input rotatorio con Compose per Wear OS, consulta la pagina Input rotatorio in Compose.
Molti container scorrevoli, come
ScrollView
,
ListView
,
HorizontalScrollView
e WearableRecyclerView
,
supportano l'input rotatorio se hanno lo stato attivo senza richiedere alcun codice specifico
per Wear OS.
Avere lo stato attivo è un prerequisito importante, perché su Android 9 (livello API 28) e versioni successive, le visualizzazioni non vengono implicitamente focalizzate.
Concentrati sulle best practice
Per rispondere agli eventi di input rotatorio, un container scorrevole deve avere lo stato attivo.
Gli eventi di input rotatorio non appaiono nel grafico della gerarchia delle visualizzazioni. Se non è presente alcuna visualizzazione attiva o se la visualizzazione con stato attivo restituisce false
da
View.onGenericMotionEvent()
,
l'evento viene inviato a
Activity.onGenericMotionEvent()
.
Di seguito sono riportate le best practice per rispondere agli eventi di input rotatorio:
- Tieni presente che, per impostazione predefinita, l'avvio di un'attività o anche il tocco
su una visualizzazione non ne fanno lo stato attivo, anche se
è attivabile. Per impostare lo stato attivo sulla visualizzazione, la vista deve utilizzare il
tag
<requestFocus />
o chiamare manualmenteView.requestFocus()
. - Contrassegna le visualizzazioni scorrevoli personalizzate come attivabili sia utilizzando
android:focusable="true"
siaandroid:focusableInTouchMode="true"
. - Se la visualizzazione scorrevole viene collegata dopo il giorno
Activity.onCreate()
, ad esempio, in attesa del completamento di una richiesta di rete prima di creare la UI, chiamarequestFocus()
dopo averla collegata. - Se inizialmente la visualizzazione scorrevole è
INVISIBLE
oGONE
, chiamarequestFocus()
quando la imposti suVISIBLE
. - Se l'attività contiene più visualizzazioni scorrevoli, scegline una per impostare lo stato attivo utilizzando il tag
<requestFocus />
. Lo scorrimento nidificato non è supportato con il pulsante laterale rotante. - Se la tua UI contiene un'altra vista attiva quando l'utente
interagisce con essa, ad esempio
un
InputText
, offri all'utente un modo per ripristinare lo stato attivo sulla visualizzazione scorrevole se perde lo stato attivo 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 con l'input rotatorio o se vuoi utilizzare l'input rotatorio per qualcosa di diverso dallo scorrimento, ad esempio per aumentare e diminuire lo zoom o per attivare le manopole, puoi gestire gli eventi di scorrimento autonomamente. Ricorda di fare in modo che la visualizzazione sia più focalizzata, altrimenti gli eventi non si presenteranno.
Il seguente snippet di codice mostra come utilizzare MotionEvent
,
InputDeviceCompat
e ViewConfigurationCompat
per aggiungere 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 il test utilizzando un emulatore
Utilizza l'emulatore Android per simulare lo scorrimento dell'input rotatorio su un dispositivo Wear. Avvia l'app Wear dall'emulatore per eseguire il progetto oppure trascina un file APK nell'emulatore per installarlo.
Per testare l'input rotatorio nell'emulatore:
- Dal gestore SDK, utilizza la scheda Strumenti SDK per scaricare Android Emulator 26.0.3 o versioni successive.
- In Android Studio, seleziona Strumenti > Android > Gestione AVD. Crea un nuovo dispositivo Wear con API 25 o versioni successive.
- 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 sulla scheda Input rotatorio nella nuova finestra per aprire l'interfaccia di input rotatorio e prova a scorrere l'input rotatorio.
Il seguente video mostra l'input rotatorio nell'emulatore: