Drehknopf

Einige Wear OS-Geräte haben eine physische gedrehte Seitentaste. Wenn der Nutzer die Schaltfläche dreht, scrollt er in der aktuellen Ansicht der App nach oben oder unten. Diese Art der Eingabe wird als Dreheingabe bezeichnet.

Hinweis: Dieser Leitfaden bezieht sich hauptsächlich auf die Dreheingabe mithilfe von ansichtsbasierten UIs. Weitere Informationen zum Umgang mit Drehtasten mit Compose für Wear OS finden Sie unter Dreheingabe in Compose.

Viele scrollbare Container wie ScrollView, ListView, HorizontalScrollView und WearableRecyclerView unterstützen die Dreheingabe, wenn sie im Fokus sind, ohne dass Wear OS-spezifischer Code erforderlich ist. Konzentration ist eine wichtige Voraussetzung, da unter Android 9 (API-Level 28) und höher Aufrufe nicht automatisch im Fokus stehen.

Best Practices fokussieren

Damit auf Drehbewegungen reagiert werden kann, muss ein scrollbarer Container im Fokus sein. Rotierende Eingabeereignisse erzeugen keine Bubbles in der Ansichtshierarchie. Wenn keine fokussierte Ansicht vorhanden ist oder die fokussierte Ansicht false von View.onGenericMotionEvent() zurückgibt, wird das Ereignis an Activity.onGenericMotionEvent() gesendet.

Im Folgenden finden Sie Best Practices für die Reaktion auf Dreheingabeereignisse:

  • Wenn eine Aktivität gestartet oder sogar auf eine Ansicht getippt wird, wird diese standardmäßig nicht fokussiert, selbst wenn sie fokussierbar ist. Um den Fokus der Ansicht zu legen, muss die Ansicht das Tag <requestFocus /> verwenden oder View.requestFocus() manuell aufrufen.
  • Markieren Sie benutzerdefinierte scrollbare Ansichten mit android:focusable="true" und android:focusableInTouchMode="true" als fokussierbar.
  • Wenn die scrollbare Ansicht nach Activity.onCreate() angehängt wird, z. B. wenn Sie auf den Abschluss einer Netzwerkanfrage warten möchten, bevor Sie die UI erstellen, rufen Sie nach dem Anhängen requestFocus() auf.
  • Wenn die scrollbare Ansicht anfangs INVISIBLE oder GONE ist, rufen Sie requestFocus() auf, wenn Sie VISIBLE festlegen.
  • Wenn Ihre Aktivität mehrere scrollbare Ansichten enthält, wählen Sie mit dem Tag <requestFocus /> eine aus, die hervorgehoben werden soll. Das verschachtelte Scrollen wird bei der rotierenden Seitenschaltfläche nicht unterstützt.
  • Wenn Ihre UI eine andere Ansicht enthält, die hervorgehoben wird, wenn der Nutzer damit interagiert, z. B. ein InputText, bieten Sie dem Nutzer die Möglichkeit, den Fokus auf die scrollbare Ansicht wiederherzustellen, wenn diese den Fokus verliert. Dazu wird auf das Tippen auf die scrollbare Ansicht gewartet und als Reaktion darauf requestFocus() aufgerufen.

Benutzerdefiniertes Rotationsverhalten

Wenn Ihre scrollbare Ansicht das Scrollen mit Drehknopf nicht unterstützt oder Sie den Drehknopf für etwas anderes als das Scrollen verwenden möchten, z. B. zum Heran- und Herauszoomen oder zum Drehen von Drehreglern, können Sie die Scroll-Ereignisse selbst verarbeiten. Vergessen Sie nicht, den Fokus auf Ihre Ansicht zu lenken, da die Ereignisse sonst nicht durchgeführt werden können.

Das folgende Code-Snippet zeigt, wie Sie mit MotionEvent, InputDeviceCompat und ViewConfigurationCompat benutzerdefiniertes Scrollen zu Ihrer Ansicht hinzufügen können:

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;
  }
});

Mit einem Emulator testen

Mit dem Android-Emulator können Sie auf einem Wear-Gerät das Scrollen durch Dreheingabe simulieren. Starte deine Wear-App auf dem Emulator, um dein Projekt auszuführen, oder ziehe eine APK-Datei in den Emulator, um sie zu installieren.

So testen Sie den Drehknopf im Emulator:

  1. Verwenden Sie im SDK-Manager den Tab SDK-Tools, um Android Emulator 26.0.3 oder höher herunterzuladen.
  2. Wählen Sie in Android Studio Tools > Android > AVD Manager aus. Erstellen Sie ein neues Wear-Gerät mit API 25 oder höher.
  3. Führen Sie den Emulator über Android Studio aus.
  4. Klicken Sie unten in der Symbolleiste des Emulators auf das Dreipunkt-Menü. Klicken Sie im neuen Fenster auf den Tab Dreheingabe, um die Oberfläche für den Drehknopf zu öffnen und zu scrollen.

Das folgende Video zeigt den Drehknopf im Emulator: