Immissione rotativa

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 manualmente View.requestFocus().
  • Contrassegna le visualizzazioni scorrevoli personalizzate come attivabili sia utilizzando android:focusable="true" sia android: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, chiama requestFocus() dopo averla collegata.
  • Se inizialmente la visualizzazione scorrevole è INVISIBLE o GONE, chiama requestFocus() quando la imposti su VISIBLE.
  • 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 chiamando requestFocus() 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:

  1. Dal gestore SDK, utilizza la scheda Strumenti SDK per scaricare Android Emulator 26.0.3 o versioni successive.
  2. In Android Studio, seleziona Strumenti > Android > Gestione AVD. Crea un nuovo dispositivo Wear con API 25 o versioni successive.
  3. Esegui l'emulatore da Android Studio.
  4. 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: