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 oderView.requestFocus()
manuell aufrufen. - Markieren Sie benutzerdefinierte scrollbare Ansichten mit
android:focusable="true"
undandroid: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ängenrequestFocus()
auf. - Wenn die scrollbare Ansicht anfangs
INVISIBLE
oderGONE
ist, rufen SierequestFocus()
auf, wenn SieVISIBLE
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 daraufrequestFocus()
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:
- Verwenden Sie im SDK-Manager den Tab SDK-Tools, um Android Emulator 26.0.3 oder höher herunterzuladen.
- Wählen Sie in Android Studio Tools > Android > AVD Manager aus. Erstellen Sie ein neues Wear-Gerät mit API 25 oder höher.
- Führen Sie den Emulator über Android Studio aus.
- 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: