Używanie gestów nadgarstka na Wear
Zadbaj o dobrą organizację dzięki kolekcji
Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.
Gesty nadgarstka umożliwiają szybkie korzystanie z aplikacji jedną ręką
gdy korzystanie z ekranu dotykowego jest niewygodne.
Na przykład użytkownik może przewinąć stronę
przez powiadomienia jedną ręką, trzymając kubek wody
inne. Inne zastosowania gestów nadgarstka to:
- W aplikacji do biegania: przechodzenie przez pionowe ekrany, na których widać
zrobione kroki, czas, jaki upłynął, i bieżące tempo
- W aplikacji podróżniczej przewijanie informacji o locie i bramce.
- W aplikacji z wiadomościami przewijanie artykułów
Aby sprawdzić gesty nadgarstka na zegarku
na urządzeniu, upewnij się, że gesty są
Włączony, wybierając Ustawienia > Funkcje zaawansowane > Gesty > Gesty nadgarstka
Włączony. Następnie podaj
Samouczek gestów na zegarku – wybierz Uruchom samouczek.
Uwaga: potrząśnięcie nadgarstkiem jest gestem cofania lub cofania w całym systemie.
i nie można go dostosowywać przez aplikacje.
Gesty nadgarstka można używać na kilka sposobów, zgodnie z opisem w tym przewodniku:
Każdy gest nadgarstka jest mapowany na stałą int
z
KeyEvent
klasy jak w poniższej tabeli:
Gest
|
Kluczowe zdarzenie
|
Opis
|
Szybki obrót nadgarstka od siebie
|
KEYCODE_NAVIGATE_NEXT
|
Ten kod klucza należy przekazać do następnego elementu.
|
Szybki obrót nadgarstka do siebie
|
KEYCODE_NAVIGATE_PREVIOUS
|
Ten kod klucza przechodzi do poprzedniego elementu.
|
Użyj układu zakrzywionego, by obsługiwać gesty nadgarstka
Klasa
WearableRecyclerView
udostępnia zakrzywioną
układ dla list i automatycznie obsługuje
gesty nadgarstka. Klasa ma wstępnie zdefiniowane działania dla wystąpień
i gesty nadgarstka, gdy ostrość jest widoczna. Informacje o korzystaniu z
WearableRecyclerView
znajdziesz w artykule Tworzenie list w Wear OS. Zobacz też
Sprawdzone metody w tym przewodniku.
Uwaga: klasa WearableRecyclerView
zastępuje podobne,
.
wycofane w bibliotece pomocy do noszenia.
Nawet jeśli używasz WearableRecyclerView
, możesz też użyć
stałe z KeyEvent
zajęcia. Wstępnie zdefiniowane działania można zastąpić, stosując podklasyfikację
WearableRecyclerView
i ponowne wdrożenie komponentu
onKeyDown()
oddzwonienie. Możesz całkowicie wyłączyć tę funkcję.
za pomocą funkcji setEnableGestureNavigation(false)
.
Więcej informacji:
Obsługa działań klawiatury.
Bezpośrednie używanie kluczowych zdarzeń
Kluczowych zdarzeń możesz używać poza obiektem
WearableRecyclerView
, aby wyzwalać nowe działania w odpowiedzi na gest
zdarzeń. Co ważne, te zdarzenia gestów są rozpoznawane, gdy urządzenie jest włożone
i są wyświetlane w taki sam sposób jak wszystkie kluczowe zdarzenia.
Klasa powiązana z interakcją użytkownika, np. View
lub
Activity
, która stosuje
KeyEvent.Callback
może nasłuchiwać kluczowych zdarzeń związanych z
gesty nadgarstka tak samo, jak w przypadku każdego innego kluczowego zdarzenia. Struktura Androida
wywołuje metodę View
lub Activity
, która ma
skupienie się na kluczowych zdarzeniach. W przypadku gestów onKeyDown()
wywołanie zwrotne metody jest wywoływane po wystąpieniu gestów.
Na przykład aplikacja może zastąpić wstępnie zdefiniowane działania w polu View
lub Activity
, która implementuje KeyEvent.Callback
w ten sposób:
Kotlin
class GesturesActivity : Activity() {
/* KeyEvent.Callback */
override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
return when (keyCode) {
KeyEvent.KEYCODE_NAVIGATE_NEXT ->
// Do something that advances a user View to the next item in an ordered list.
moveToNextItem()
KeyEvent.KEYCODE_NAVIGATE_PREVIOUS ->
// Do something that advances a user View to the previous item in an ordered list.
moveToPreviousItem()
else -> {
// If you did not handle it, let it be handled by the next possible element as determined
// by the Activity.
super.onKeyDown(keyCode, event)
}
}
}
/** Shows the next item in the custom list. */
private fun moveToNextItem(): Boolean {
...
// Return true if handled successfully, otherwise return false.
return false
}
/** Shows the previous item in the custom list. */
private fun moveToPreviousItem(): Boolean {
...
// Return true if handled successfully, otherwise return false.
return false
}
}
Java
public final class GesturesActivity extends Activity {
@Override /* KeyEvent.Callback */
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_NAVIGATE_NEXT:
// Do something that advances a user View to the next item in an ordered list.
return moveToNextItem();
case KeyEvent.KEYCODE_NAVIGATE_PREVIOUS:
// Do something that advances a user View to the previous item in an ordered list.
return moveToPreviousItem();
}
// If you did not handle it, let it be handled by the next possible element as determined by the Activity.
return super.onKeyDown(keyCode, event);
}
/** Shows the next item in the custom list. */
private boolean moveToNextItem() {
boolean handled = false;
...
// Return true if handled successfully, otherwise return false.
return handled;
}
/** Shows the previous item in the custom list. */
private boolean moveToPreviousItem() {
boolean handled = false;
...
// Return true if handled successfully, otherwise return false.
return handled;
}
}
Sprawdzone metody
- Zapoznaj się z dokumentem
KeyEvent
i
KeyEvent.Callback
, aby dostarczać kluczowe zdarzenia do
View
i Activity
.
- Zachowaj konsekwencję w kierunku działania: „przesuń nadgarstek od siebie”. w przypadku
następny i „obrót nadgarstka do siebie” do poprzedniego elementu.
- Ustaw dotyk równolegle do gestu.
- Prześlij opinię wizualną.
- Nie używaj kodu dostępu do funkcji, która będzie
w przeciwieństwie do reszty systemu. Na przykład nie używaj nazwy
KEYCODE_NAVIGATE_NEXT
, aby anulować działanie lub przejść do
na osi lewa i prawej z ruchami.
- Nie przechwytuj kluczowych zdarzeń w przypadku elementów, które nie są częścią
interfejsu użytkownika, np. widokach znajdujących się poza ekranem lub częściowo
i konkretnie. Tak samo jak w przypadku każdego kluczowego zdarzenia.
- Nie interpretuj powtarzających się gestów gestów we własnych własnych gestach.
Może to kolidować z „potrząsaniem nadgarstka” gest.
Aby widok mógł odbierać kluczowe zdarzenia związane z gestami, musi mieć
skupienie; zobacz
View.setFocusable()
.
Gesty są traktowane jako kluczowe zdarzenia,
powoduje przejście z „trybu dotykowego”. które mogą wywołać nieoczekiwane
rzeczy. Użytkownicy mogą przełączać się między trybem dotykowym,
gestów, może być potrzebna metoda
View::setFocusableInTouchmode()
. W niektórych
konieczne może być również użycie
setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS)
tak
że gdy zaznaczenie zmieni się po przejściu na lub z trybu dotykowego,
który przyciąga uwagę.
- Używaj tych identyfikatorów:
requestFocus()
i
clearFocus()
ostrożnie:
- Podczas wywoływania usługi
requestFocus()
upewnij się, że jest on odpowiedni dla
i ustaw ostrość. Jeśli widok znajduje się poza ekranem lub jest zasłonięty przez inny widok,
mogą wystąpić niespodzianki, gdy gesty wywołują wywołanie zwrotne.
- Metoda
clearFocus()
inicjuje wyszukiwanie skupienia w celu znalezienia kolejnego
odpowiedni widok. W zależności od hierarchii widoków to wyszukiwanie może
i wymagają nieskomplikowanych obliczeń. Może to też spowodować przypisanie fokusu
w oglądaniu,
którym nie chcesz się skupić.
Kluczowe zdarzenia są wyświetlane jako pierwsze w widoku z zaznaczeniem
w hierarchii. Jeśli aktywny widok nie obsługuje zdarzenia, czyli zwraca
false
– zdarzenie nie jest wyświetlane w widoku nadrzędnym, nawet
czy jest skupiony i ma
KeyListener
. Zdarzenie jest natomiast przekazywane do bieżącego działania
i utrzymując hierarchię widoków.
Dlatego konieczne może być
rejestruje wszystkie zdarzenia na wyższym poziomie, a następnie przekazuje odpowiednie kody.
Możesz też podklasować aktywność i zastąpić
Metoda
dispatchKeyEvent(KeyEvent event)
do przechwytywania kluczy
w razie potrzeby lub obsługi, gdy nie są obsługiwane
niższych warstw.
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,["# Use wrist gestures on Wear\n\nWrist gestures can enable quick, one-handed interactions with your app\nwhen a touch screen is inconvenient.\n\n\nFor example, a user can scroll\nthrough notifications with one hand while holding a cup of water with the\nother. Other use cases for wrist gestures include the following:\n\n- In a jogging app, navigating through vertical screens that show the steps taken, time elapsed, and current pace\n- In a travel app, scrolling through flight and gate information\n- In a news app, scrolling through articles\n\n\nTo review the [wrist gestures](https://support.google.com/androidwear/answer/6312406) on a watch\ndevice, confirm that gestures are\nturned on by selecting **Settings \\\u003e Advanced features \\\u003e Gestures \\\u003e Wrist Gestures\nOn** . Then complete the\nGestures tutorial on the watch by selecting **Launch Tutorial**.\n\n\n**Note:** Shaking the wrist is the system-wide back or undo gesture\nand is not available for apps to customize.\n\n\nWrist gestures can be used in the following ways, as described in this guide:\n\n- With a [curved layout](#using_wrv), which has predefined gesture actions\n- By using [key events directly](#using_key_events) to define new user actions\n\n\nEach wrist gesture is mapped to an `int` constant from the\n[KeyEvent](/reference/android/view/KeyEvent)\nclass, as shown in the following table:\n\n| Gesture | KeyEvent | Description |\n|-----------------|-------------------------------------------------------------------------------------------|------------------------------------------|\n| Flick wrist out | [`KEYCODE_NAVIGATE_NEXT`](/reference/android/view/KeyEvent#KEYCODE_NAVIGATE_NEXT) | This key code goes to the next item. |\n| Flick wrist in | [`KEYCODE_NAVIGATE_PREVIOUS`](/reference/android/view/KeyEvent#KEYCODE_NAVIGATE_PREVIOUS) | This key code goes to the previous item. |\n\nUse a curved layout to support wrist gestures\n---------------------------------------------\n\n\nThe [WearableRecyclerView](/reference/androidx/wear/widget/WearableRecyclerView) class provides a curved\nlayout for lists and automatically supports\nwrist gestures. The class has predefined actions for occurrences of\nwrist gestures when the view has focus. For information about using\nthe `WearableRecyclerView` class, see [Create lists on Wear OS](/training/wearables/ui/lists). Also, see the\n[Best practices](#best_practices) section of this guide.\n\n\n**Note:** The `WearableRecyclerView` class replaces a similar,\n[deprecated](/training/wearables/ui/wear-ui-library#deprecations) class in the Wearable Support Library.\n\n\nEven if you use a `WearableRecyclerView`, you might want to use\nconstants from the [KeyEvent](/reference/android/view/KeyEvent)\nclass. The predefined actions can be overridden by subclassing the\n`WearableRecyclerView` and re-implementing the\n`onKeyDown()` callback. The behavior can be disabled entirely\nby using [`setEnableGestureNavigation(false)`](/reference/android/support/wearable/view/WearableListView#setEnableGestureNavigation(boolean)).\nFor more information, see\n[Handle keyboard actions](/training/keyboard-input/commands).\n\nUse key events directly\n-----------------------\n\n\nYou can use key events outside of a [WearableRecyclerView](/reference/androidx/wear/widget/WearableRecyclerView) to trigger new actions in response to gesture\nevents. Importantly, these gesture events are recognized when a device is in\nactive mode, and they are delivered in the same way as all key events.\n\n\nA class that relates to user interaction, such as a `View` or an\n`Activity`, and that implements\n[KeyEvent.Callback](/reference/android/view/KeyEvent.Callback) can listen to key events that relate to\nwrist gestures just as it can listed to any other key event. The Android framework\ncalls the `View` or `Activity` that has\nfocus with the key events. For gestures, the `onKeyDown()`\nmethod callback is called when gestures occur.\n\n\nAs an example, an app can override predefined actions in a `View`\nor `Activity` that implements `KeyEvent.Callback` as follows: \n\n### Kotlin\n\n```kotlin\nclass GesturesActivity : Activity() {\n\n /* KeyEvent.Callback */\n override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {\n return when (keyCode) {\n KeyEvent.KEYCODE_NAVIGATE_NEXT -\u003e\n // Do something that advances a user View to the next item in an ordered list.\n moveToNextItem()\n KeyEvent.KEYCODE_NAVIGATE_PREVIOUS -\u003e\n // Do something that advances a user View to the previous item in an ordered list.\n moveToPreviousItem()\n else -\u003e {\n // If you did not handle it, let it be handled by the next possible element as determined\n // by the Activity.\n super.onKeyDown(keyCode, event)\n }\n }\n }\n\n /** Shows the next item in the custom list. */\n private fun moveToNextItem(): Boolean {\n ...\n // Return true if handled successfully, otherwise return false.\n return false\n }\n\n /** Shows the previous item in the custom list. */\n private fun moveToPreviousItem(): Boolean {\n ...\n // Return true if handled successfully, otherwise return false.\n return false\n }\n}\n```\n\n### Java\n\n```java\npublic final class GesturesActivity extends Activity {\n\n @Override /* KeyEvent.Callback */\n public boolean onKeyDown(int keyCode, KeyEvent event) {\n switch (keyCode) {\n case KeyEvent.KEYCODE_NAVIGATE_NEXT:\n // Do something that advances a user View to the next item in an ordered list.\n return moveToNextItem();\n case KeyEvent.KEYCODE_NAVIGATE_PREVIOUS:\n // Do something that advances a user View to the previous item in an ordered list.\n return moveToPreviousItem();\n }\n // If you did not handle it, let it be handled by the next possible element as determined by the Activity.\n return super.onKeyDown(keyCode, event);\n }\n\n /** Shows the next item in the custom list. */\n private boolean moveToNextItem() {\n boolean handled = false;\n ...\n // Return true if handled successfully, otherwise return false.\n return handled;\n }\n\n /** Shows the previous item in the custom list. */\n private boolean moveToPreviousItem() {\n boolean handled = false;\n ...\n // Return true if handled successfully, otherwise return false.\n return handled;\n }\n}\n```\n\nBest practices\n--------------\n\n- Review the [KeyEvent](/reference/android/view/KeyEvent) and [KeyEvent.Callback](/reference/android/view/KeyEvent.Callback) pages for the delivery of key events to your `View` and `Activity`.\n- Keep a consistent directional affordance: use \"flick wrist out\" for next and \"flick wrist in\" for previous.\n- Have a touch parallel for a gesture.\n- Provide visual feedback.\n- Don't use a keycode to implement functionality that would be counterintuitive to the rest of the system. For example, don't use `KEYCODE_NAVIGATE_NEXT` to cancel an action or to navigate the left-right axis with flicks.\n- Don't intercept the key events on elements that are not part of the user interface, such as views that are offscreen or partially covered. This is the same as for any key event.\n- Don't reinterpret repeated flick gestures into your own novel gesture. This might conflict with the system's \"shaking the wrist\" gesture.\n- For a view to receive gesture key events, it must have [focus](/reference/android/view/View#attr_android:focusable); see [`\n View.setFocusable()`](/reference/android/view/View#setFocusable(boolean)).\n\n Because gestures are treated as key events,\n they trigger a transition out of \"touch mode\" that might do unexpected\n things. Since users may alternate between using touch and\n gestures, the [`\n View::setFocusableInTouchmode()`](/reference/android/view/View#setFocusableInTouchMode(boolean)) method could be necessary. In some\n cases, it also could be necessary to use\n `setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS)` so\n that when focus changes after a change to or from touch mode, your\n intended view gets the focus.\n- Use [requestFocus()](/reference/android/view/View#requestFocus()) and [clearFocus()](/reference/android/view/View#clearFocus()) carefully:\n - When calling `requestFocus()`, make sure it's appropriate for the view to have focus. If the view is offscreen or is covered by another view, surprises can occur when gestures trigger callbacks.\n - The `clearFocus()` method initiates a focus search to find another suitable view. Depending on the view hierarchy, this search might require nontrivial computation. It can also end up assigning focus to a view you don't expect to receive focus.\n- Key events are delivered first to the view with focus in the view\n hierarchy. If the focused view does not handle the event---in other words, it returns\n `false`---the event is not delivered to the parent view, even\n if it can receive focus and has a [`\n KeyListener`](/reference/android/text/method/KeyListener). Rather, the event is delivered to the current activity\n holding the view hierarchy with focus.\n\n Therefore, it might be necessary to\n catch all events at the higher level, then pass relevant codes down.\n Alternatively, you might subclass the activity and override the\n [dispatchKeyEvent(KeyEvent event)](/reference/android/app/Activity#dispatchKeyEvent(android.view.KeyEvent)) method to intercept keys\n when necessary or handle them when they are not handled at\n lower layers."]]