שימוש בתנועות על פרק כף היד ב-Wear
קל לארגן דפים בעזרת אוספים
אפשר לשמור ולסווג תוכן על סמך ההעדפות שלך.
בעזרת תנועות על פרק כף היד אפשר לבצע אינטראקציה מהירה עם האפליקציה ביד אחת
כשמסך מגע לא נוח.
לדוגמה, משתמש יכול לגלול
באמצעות הודעות ביד אחת תוך כדי אחיזה בכוס מים
אחר. תרחישים אחרים לדוגמה לתנועות של פרק כף היד כוללים:
- באפליקציית ריצה, ניווט בין מסכים אנכיים שמוצגים
הצעדים שננקטו, הזמן שחלף והקצב הנוכחי
- באפליקציית נסיעות, גוללים בין פרטי הטיסות והשערים
- גלילה בין כתבות באפליקציית חדשות
כדי לבדוק את התנועות של פרק כף היד בשעון
במכשיר, מוודאים שהתנועות
מופעלת על ידי בחירה באפשרות הגדרות > תכונות מתקדמות > תנועות > תנועות של פרק כף היד
מופעל. לאחר מכן משלימים את
מדריך לתנועות בשעון על ידי בחירה באפשרות הפעלת המדריך.
הערה: ניעור פרק כף היד הוא פעולת חזרה או ביטול של כל המערכת
והוא לא זמין לאפליקציות להתאמה אישית.
ניתן להשתמש בתנועות של פרק כף היד בדרכים הבאות, כפי שמתואר במדריך הזה:
כל תנועה של פרק כף היד ממופה הקבועה int
KeyEvent
הכיתה, כפי שמוצג בטבלה הבאה:
שימוש בפריסה מעוקלת כדי לתמוך בתנועות על פרק כף היד
המחלקה
WearableRecyclerView
יוצרת מודל מעוקל
פריסה לרשימות ותומכת אוטומטית
תנועות על פרק כף היד. יש בכיתה פעולות מוגדרות מראש לאירועים של
כשהמיקוד הוא על פרק כף היד. מידע על השימוש
הכיתה WearableRecyclerView
, אפשר לעיין במאמר יצירת רשימות ב-Wear OS. כמו כן, אפשר לעיין
הקטע שיטות מומלצות במדריך הזה.
הערה: המחלקה WearableRecyclerView
מחליפה מחלקה דומה,
הוצא משימוש בספריית התמיכה של מכשירים לבישים.
גם אם משתמשים ב-WearableRecyclerView
, כדאי להשתמש
קבועים מ-KeyEvent
בכיתה. אפשר לבטל את הפעולות המוגדרות מראש על ידי סיווג המשנה של
WearableRecyclerView
והטמעה מחדש של
התקשרות חזרה onKeyDown()
. אפשר להשבית לגמרי את ההתנהגות הזו
באמצעות setEnableGestureNavigation(false)
.
מידע נוסף זמין במאמר הבא:
ביצוע פעולות במקלדת.
שימוש באירועים מרכזיים באופן ישיר
אפשר להשתמש באירועים מרכזיים מחוץ ל-
WearableRecyclerView
כדי להפעיל פעולות חדשות בתגובה לתנועה
אירועים. חשוב לציין שאירועי התנועה האלה מזוהים כשהמכשיר נמצא
במצב פעיל, והם נשלחים בדיוק כמו כל האירועים המרכזיים.
סיווג שקשורה לאינטראקציה של משתמשים, כמו View
או
Activity
, וההטמעה מתבצעת
לשירות
KeyEvent.Callback
יש הרשאה להאזין לאירועים מרכזיים שקשורים
תנועה על פרק כף היד בדיוק כמו שהיא יכולה להופיע בכל אירוע מרכזי אחר. מסגרת Android
קוראת לפונקציה View
או Activity
שיש בה
להתמקד באירועים המרכזיים. לתנועות, onKeyDown()
הקריאה החוזרת (callback) של ה-method מופעלת כאשר תנועות מופיעות.
לדוגמה, אפליקציה יכולה לבטל פעולות שהוגדרו מראש בקובץ View
או Activity
עם KeyEvent.Callback
באופן הבא:
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;
}
}
שיטות מומלצות
- מומלץ לעיין ב
KeyEvent
ו-
KeyEvent.Callback
דפים להעברה של אירועים מרכזיים אל
View
ו-Activity
.
- הקפדה על כיוון עקבי: אפשר להשתמש ב'שחרור פרק כף היד' עבור
Next ו-"fהישג פרק כף היד פנימה" לפריט הקודם.
- כדאי להשתמש במקביל במגע כדי לבצע תנועה.
- שליחת משוב חזותי.
- אל תשתמשו בקוד מפתח כדי להטמיע פונקציונליות
בניגוד לציפיות של שאר המערכת. לדוגמה, אל תשתמשו
KEYCODE_NAVIGATE_NEXT
כדי לבטל פעולה או לעבור אל
ציר עם תנועות שמאלה-ימינה.
- לא מיירטים את האירועים המרכזיים באלמנטים שהם לא חלק
בממשק משתמש, כמו צפיות שאינן מופיעות במסך או באופן חלקי
בסרטון הזה. ההגדרה הזו זהה למקרה של כל אירוע מרכזי.
- אל תפרשו מחדש תנועות סיבוביות חוזרות ונשנות כמחווה חדשה משלכם.
מצב כזה עלול להתנגש עם "רעידת פרק כף היד" של המערכת תנועה.
כדי שתצוגה מפורטת תקבל אירועים מרכזיים מסוג תנועות, היא צריכה לכלול
Focus; להצגת
View.setFocusable()
.
מכיוון שתנועות נחשבות לאירועים מרכזיים,
הם מבצעים מעבר מ'מצב מגע' עשויה לגרום
דברים. מכיוון שהמשתמשים עשויים לעבור בין שימוש במגע
תנועות, ייתכן שיש צורך בשיטה
View::setFocusableInTouchmode()
. בחלק מהמקרים
במקרים מסוימים, צריך גם להשתמש
setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS)
כך
שכאשר המיקוד משתנה לאחר שינוי למצב מגע או ממנו,
מקבל את המיקוד.
- שימוש ב-
requestFocus()
וב
clearFocus()
בזהירות:
- בשיחה אל
requestFocus()
, צריך לוודא שהוא מתאים
כדי להתמקד. אם התצוגה לא מופיעה במסך או מופיעה בתצוגה אחרת,
יכולות להתרחש הפתעות כשתנועות מפעילות קריאה חוזרת.
- השיטה
clearFocus()
מתחילה חיפוש ממוקד כדי למצוא מודל אחר
לתצוגה המתאימה. בהתאם להיררכיית התצוגות, החיפוש
מחייבות חישוב לא טריוויאלי. הוא עשוי גם להקצות התמקדות
לתצוגה שלא מצפה לכם להתמקד בה.
האירועים המרכזיים מועברים קודם לתצוגה, כשהמיקוד הוא בתצוגה
ההיררכיה. אם התצוגה שמתמקדת לא מטפלת באירוע, כלומר, היא מחזירה
false
– האירוע לא מועבר לתצוגת ההורה, גם לא
אם הוא יכול להתמקד כשיש
KeyListener
. במקום זאת, האירוע מועבר לפעילות הנוכחית
החזקת היררכיית התצוגות תוך התמקדות.
לכן, ייתכן שיהיה צורך
לאתר את כל האירועים ברמה גבוהה יותר, ולאחר מכן להעביר את הקודים הרלוונטיים.
לחלופין, אפשר ליצור מחלקה משנית של הפעילות ולבטל את ההגדרה
שיטה אחת (
dispatchKeyEvent(KeyEvent event)
) ליירוט מפתחות
במקרה הצורך, או יטפל בהם כאשר לא מטופלים
בשכבות התחתונות.
דוגמאות התוכן והקוד שבדף הזה כפופות לרישיונות המפורטים בקטע רישיון לתוכן. Java ו-OpenJDK הם סימנים מסחריים או סימנים מסחריים רשומים של חברת Oracle ו/או של השותפים העצמאיים שלה.
עדכון אחרון: 2025-07-26 (שעון UTC).
[[["התוכן קל להבנה","easyToUnderstand","thumb-up"],["התוכן עזר לי לפתור בעיה","solvedMyProblem","thumb-up"],["סיבה אחרת","otherUp","thumb-up"]],[["חסרים לי מידע או פרטים","missingTheInformationINeed","thumb-down"],["התוכן מורכב מדי או עם יותר מדי שלבים","tooComplicatedTooManySteps","thumb-down"],["התוכן לא עדכני","outOfDate","thumb-down"],["בעיה בתרגום","translationIssue","thumb-down"],["בעיה בדוגמאות/בקוד","samplesCodeIssue","thumb-down"],["סיבה אחרת","otherDown","thumb-down"]],["עדכון אחרון: 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."]]