Zadbaj o dobrą organizację dzięki kolekcji
Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.
Niektóre urządzenia z Wear OS mają fizyczny obracający się przycisk boczny. Gdy użytkownik zmieni
powoduje przewijanie bieżącego widoku aplikacji w górę lub w dół. Ten typ danych wejściowych to tzw.
pokrętłem.
Uwaga: ten przewodnik dotyczy głównie obsługi pokrętła
Interfejsy oparte na widoku. Więcej informacji o obsłudze pokrętła w funkcji Compose na Wear OS:
Rotary wejściowe podczas tworzenia wiadomości.
Wiele kontenerów z możliwością przewijania, takich jak
ScrollView,
ListView,
HorizontalScrollView,
i WearableRecyclerView,
obsługują pokrętło, jeśli są ustawione ostrość bez konieczności noszenia.
Kod związany z systemem operacyjnym.
Skupienie jest ważnym wymogiem wstępnym, ponieważ na Androidzie 9 (poziom interfejsu API)
28) i wyższych, wyświetlenia nie są skupione automatycznie.
Koncentracja na sprawdzonych metodach
Aby zareagować na zdarzenia pokrętła, kontener z możliwością przewijania musi być zaznaczony.
Zdarzenia wprowadzania obrotowego wprowadzania danych nie wyświetlają widoku jako bąbelków
w hierarchii. Jeśli nie ma zaznaczonego widoku lub jeśli ten widok zwraca false z
View.onGenericMotionEvent(),
to zdarzenie jest wysyłane na adres
Activity.onGenericMotionEvent()
Poniżej znajdziesz sprawdzone metody reagowania na zdarzenia związane z obrotami wprowadzania danych:
Pamiętaj, że domyślnie uruchomienie działania czy nawet kliknięcie ikony
nie zapewnia fokusu, nawet jeśli
które można zaznaczyć. Aby zawęzić widok, musi on korzystać z funkcji
<requestFocus />
lub ręcznie wywołaj View.requestFocus().
Oznacz niestandardowe widoki z możliwością przewijania jako możliwe do zaznaczenia za pomocą elementów android:focusable="true"
i android:focusableInTouchMode="true".
Jeśli widok przewijany jest dołączony po Activity.onCreate() – przez
Na przykład oczekiwanie na zakończenie żądania sieciowego przed utworzeniem interfejsu
requestFocus() po załączeniu.
Jeśli widok przewijany to początkowo INVISIBLE
lub GONE,
Wywołuj funkcję requestFocus() po ustawieniu na
VISIBLE
Jeśli aktywność obejmuje wiele widoków, które można przewijać, wybierz jeden z nich za pomocą
<requestFocus />
. Zagnieżdżone przewijanie nie jest obsługiwane w przypadku obracającego się przycisku bocznego.
Jeśli interfejs użytkownika zawiera inny widok, na którym koncentruje się użytkownik,
wchodzić z nią w interakcję, np.
InputText, zapewnij użytkownikowi możliwość przywrócenia fokusu do widoku przewijania
jeśli straci ostrość, nasłuchuje kliknięć przewijania w widoku przewijanym i wywoła,
requestFocus() w odpowiedzi.
Niestandardowe obracanie
Jeśli widok przesuwany nie obsługuje natywnie pokrętnego przewijania danych wejściowych lub chcesz
używać pokrętła w czymś innym niż przewijanie – na przykład
powiększać i pomniejszać lub obracać pokrętła – możesz obsługiwać zdarzenia przewijania,
siebie. Pamiętaj, aby film przyciągał uwagę. W przeciwnym razie
wydarzenia nie będą się pojawiać.
myView.setOnGenericMotionListener{v,ev->
if(ev.action==MotionEvent.ACTION_SCROLL&&
ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)){// Don't forget the negation herevaldelta=-ev.getAxisValue(MotionEventCompat.AXIS_SCROLL)*ViewConfigurationCompat.getScaledVerticalScrollFactor(ViewConfiguration.get(context),context)// Swap these axes to scroll horizontally insteadv.scrollBy(0,delta.roundToInt())true}else{false}}
Java
myView.setOnGenericMotionListener(newView.OnGenericMotionListener(){@OverridepublicbooleanonGenericMotion(Viewv,MotionEventev){if(ev.getAction()==MotionEvent.ACTION_SCROLL&&
ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)){// Don't forget the negation herefloatdelta=-ev.getAxisValue(MotionEventCompat.AXIS_SCROLL)*ViewConfigurationCompat.getScaledVerticalScrollFactor(ViewConfiguration.get(context),context);// Swap these axes to scroll horizontally insteadv.scrollBy(0,Math.round(delta));returntrue;}returnfalse;}});
Testowanie za pomocą emulatora
Użyj emulatora Androida, aby symulować pokrętło.
przewijanie treści na urządzeniu Wear. Aby uruchomić aplikację Wear, uruchom emulator
swojego projektu lub przeciągnij
Aby zainstalować emulator, umieść w nim plik APK.
Aby przetestować pokrętło na emulatorze:
W Menedżerze pakietów SDK otwórz kartę Narzędzia SDK, aby
pobierz emulator Androida w wersji 26.0.3 lub nowszej.
W Android Studio wybierz Narzędzia >.
Android > AVD Manager.
Utwórz nowe urządzenie Wear za pomocą interfejsu API 25 lub
wyższe.
Kliknij rozszerzone menu z 3 kropkami u dołu paska narzędzi emulatora. Kliknij
Otwórz kartę rotarialnych wprowadzania danych w nowym oknie, aby otworzyć pokrętło i pokrętło.
przewijanie danych wejściowych.
Ten film przedstawia pokrętło w emulatorze:
Treść strony i umieszczone na niej fragmenty kodu podlegają licencjom opisanym w Licencji na treści. Java i OpenJDK są znakami towarowymi lub zastrzeżonymi znakami towarowymi należącymi do firmy Oracle lub jej podmiotów stowarzyszonych.
Ostatnia aktualizacja: 2025-07-26 UTC.
[[["Łatwo zrozumieć","easyToUnderstand","thumb-up"],["Rozwiązało to mój problem","solvedMyProblem","thumb-up"],["Inne","otherUp","thumb-up"]],[["Brak potrzebnych mi informacji","missingTheInformationINeed","thumb-down"],["Zbyt skomplikowane / zbyt wiele czynności do wykonania","tooComplicatedTooManySteps","thumb-down"],["Nieaktualne treści","outOfDate","thumb-down"],["Problem z tłumaczeniem","translationIssue","thumb-down"],["Problem z przykładami/kodem","samplesCodeIssue","thumb-down"],["Inne","otherDown","thumb-down"]],["Ostatnia aktualizacja: 2025-07-26 UTC."],[],[],null,["# Rotary input\n\nSome Wear OS devices contain a physical *rotating side button* . When the user turns the\nbutton, it scrolls your app's current view up or down. This type of input is called\n*rotary input*.\n\n**Note:** This guide refers primarily to handling rotary input using\nView-based UIs. For more information on handling rotary input using Compose for Wear OS, see\n[Rotary input on Compose](/training/wearables/compose/rotary-input).\n\nMany scrollable containers, like\n[ScrollView](/reference/android/widget/ScrollView),\n[ListView](/reference/android/widget/ListView),\n[HorizontalScrollView](/reference/android/widget/HorizontalScrollView),\nand [WearableRecyclerView](/reference/androidx/wear/widget/WearableRecyclerView),\nsupport rotary input if they have focus without requiring any Wear\nOS-specific code.\nHaving focus is an important prerequisite, because on Android 9 (API level\n28) and higher, views don't implicitly receive focus.\n\nFocus best practices\n--------------------\n\n\nTo respond to rotary input events, a scrollable container must have focus.\nRotary input events don't bubble up the view\nhierarchy. If there is no focused view, or if the focused view returns `false` from\n[View.onGenericMotionEvent()](/reference/android/view/View#onGenericMotionEvent(android.view.MotionEvent)),\nthen the event is sent to\n[Activity.onGenericMotionEvent()](/reference/android/app/Activity#onGenericMotionEvent(android.view.MotionEvent)).\n\n\nThe following are best practices around responding to rotary input events:\n\n- Bear in mind that, by default, launching an activity or even tapping on a view does not give it focus, even if it is focusable. To give your view focus, the view must use the [<requestFocus /\u003e](/guide/topics/resources/layout-resource) tag or manually call [View.requestFocus()](/reference/android/view/View#requestFocus()).\n- Mark custom scrollable views as focusable using both `android:focusable=\"true\"` and `android:focusableInTouchMode=\"true\"`.\n- If your scrollable view is attached after [Activity.onCreate()](/reference/android/app/Activity#onCreate(android.os.Bundle))---for example, waiting for a network request to finish before building your UI, call `requestFocus()` after attaching it.\n- If your scrollable view is initially [INVISIBLE](/reference/android/view/View#INVISIBLE) or [GONE](/reference/android/view/View#GONE), call `requestFocus()` when you set it to [VISIBLE](/reference/android/view/View#VISIBLE).\n- If your activity contains multiple scrollable views, choose one to focus using the [<requestFocus /\u003e](/guide/topics/resources/layout-resource) tag. Nested scrolling is not supported with the rotating side button.\n- If your UI contains some other view that takes focus when the user interacts with it---for example, an `InputText`, give the user a way to restore focus to the scrollable view if it loses focus by listening for taps on the scrollable view and calling `requestFocus()` in response.\n\nCustom rotating behavior\n------------------------\n\nIf your scrollable view doesn't natively support rotary input scrolling, or if you want to\nuse your rotary input for something other than scrolling---such as to\nzoom in and out or to turn dials---you can handle the scroll events\nyourself. Remember to make sure your view gains focus, otherwise\nthe events will not come through.\n\nThe following code snippet shows how to use [MotionEvent](/reference/android/view/MotionEvent),\n[InputDeviceCompat](/reference/kotlin/androidx/core/view/InputDeviceCompat),\nand [ViewConfigurationCompat](/reference/androidx/core/view/ViewConfigurationCompat)\nto add custom scrolling to your view: \n\n### Kotlin\n\n```kotlin\nmyView.setOnGenericMotionListener { v, ev -\u003e\n if (ev.action == MotionEvent.ACTION_SCROLL &&\n ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)\n ) {\n // Don't forget the negation here\n val delta = -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL) *\n ViewConfigurationCompat.getScaledVerticalScrollFactor(\n ViewConfiguration.get(context), context\n )\n // Swap these axes to scroll horizontally instead\n v.scrollBy(0, delta.roundToInt())\n true\n } else {\n false\n }\n}\n```\n\n### Java\n\n```java\nmyView.setOnGenericMotionListener(new View.OnGenericMotionListener() {\n @Override\n public boolean onGenericMotion(View v, MotionEvent ev) {\n if (ev.getAction() == MotionEvent.ACTION_SCROLL &&\n ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)\n ) {\n // Don't forget the negation here\n float delta = -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL) *\n ViewConfigurationCompat.getScaledVerticalScrollFactor(\n ViewConfiguration.get(context), context\n );\n\n // Swap these axes to scroll horizontally instead\n v.scrollBy(0, Math.round(delta));\n\n return true;\n }\n return false;\n }\n});\n```\n\nTest using an emulator\n----------------------\n\nUse the [Android Emulator](/studio/run/emulator#about) to simulate rotary input\nscrolling on a Wear device. Launch your Wear app on the emulator to run\nyour project or drag an\nAPK file onto the emulator to install it.\n\nTo test the rotary input on the emulator:\n\n1. From the [SDK manager](/tools/help/sdk-manager), use the **SDK tools** tab to get Android Emulator 26.0.3 or higher.\n2. In Android Studio, select **Tools \\\u003e\n Android \\\u003e AVD Manager** . [Create a new Wear device](/studio/run/managing-avds#createavd) with API 25 or higher.\n3. [Run the emulator from Android Studio](/studio/run/emulator#runningapp).\n4. Click the three-dot overflow menu at the bottom of the emulator toolbar. Click the **Rotary input** tab in the new window to open the rotary input interface and try rotary input scrolling.\n\nThe following video shows rotary input in the emulator:"]]