Immissione rotativa

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.

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:

  1. In Gestione SDK, utilizza la scheda Strumenti SDK per ottenere Android Emulator 26.0.3 o superiore.
  2. In Android Studio, seleziona Strumenti >. Android > Gestione AVD. Crea un nuovo dispositivo Wear con API 25. in alto.
  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 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: