از حرکات مچ دست در Wear استفاده کنید
با مجموعهها، منظم بمانید
ذخیره و طبقهبندی محتوا براساس اولویتهای شما.
حرکات مچ دست می تواند تعامل سریع و یک دست با برنامه شما را در زمانی که صفحه لمسی ناخوشایند است، فعال کند.
به عنوان مثال، یک کاربر می تواند با یک دست در حالی که یک فنجان آب را با دست دیگر نگه داشته است، در میان اعلان ها حرکت کند. موارد استفاده دیگر برای حرکات مچ دست عبارتند از:
- در یک برنامه آهسته دویدن، پیمایش در صفحه های عمودی که مراحل انجام شده، زمان سپری شده و سرعت فعلی را نشان می دهد.
- در یک برنامه سفر، پیمایش در اطلاعات پرواز و دروازه
- در یک برنامه خبری، پیمایش در مقالات
برای مرور حرکات مچ دست در یک دستگاه ساعت، با انتخاب تنظیمات > ویژگیهای پیشرفته > حرکات > اشارههای مچ روشن، تأیید کنید که این حرکات فعال هستند. سپس با انتخاب راهاندازی آموزش، آموزش حرکات را در ساعت کامل کنید.
توجه: تکان دادن مچ دست حرکتی است که در سراسر سیستم به عقب یا خنثی کردن آن اشاره میکند و برای برنامهها برای سفارشیسازی در دسترس نیست.
همانطور که در این راهنما توضیح داده شده است، می توان از حرکات مچ دست به روش های زیر استفاده کرد:
همانطور که در جدول زیر نشان داده شده است، هر حرکت مچ دست به یک ثابت int
از کلاس KeyEvent
نگاشت می شود:
از یک طرح منحنی برای پشتیبانی از حرکات مچ دست استفاده کنید
کلاس WearableRecyclerView
یک طرح منحنی برای لیست ها ارائه می دهد و به طور خودکار از حرکات مچ دست پشتیبانی می کند. کلاس اقدامات از پیش تعریف شده ای برای وقوع حرکات مچ دست در زمانی که نمای فوکوس دارد، دارد. برای اطلاعات در مورد استفاده از کلاس WearableRecyclerView
، به ایجاد لیست در Wear OS مراجعه کنید. همچنین، بخش بهترین شیوه ها را در این راهنما ببینید.
توجه: کلاس WearableRecyclerView
جایگزین یک کلاس منسوخ مشابه در کتابخانه پشتیبانی Wearable می شود.
حتی اگر از WearableRecyclerView
استفاده می کنید، ممکن است بخواهید از ثابت های کلاس KeyEvent
استفاده کنید. اقدامات از پیش تعریف شده را می توان با زیر کلاس بندی WearableRecyclerView
و اجرای مجدد فراخوانی onKeyDown()
لغو کرد. این رفتار را می توان با استفاده از setEnableGestureNavigation(false)
به طور کامل غیرفعال کرد. برای اطلاعات بیشتر، به کنترل عملکردهای صفحه کلید مراجعه کنید.
از رویدادهای کلیدی به طور مستقیم استفاده کنید
میتوانید از رویدادهای کلیدی خارج از WearableRecyclerView
برای راهاندازی اقدامات جدید در پاسخ به رویدادهای اشارهای استفاده کنید. نکته مهم این است که این رویدادهای ژست وقتی دستگاهی در حالت فعال است شناسایی میشوند و به همان روشی که همه رویدادهای کلیدی ارائه میشوند ارائه میشوند.
کلاسی که به تعامل کاربر مربوط میشود، مانند View
یا Activity
، و KeyEvent.Callback
را پیادهسازی میکند، میتواند به رویدادهای کلیدی مرتبط با حرکات مچ دست گوش دهد، همانطور که میتواند به هر رویداد کلیدی دیگری فهرست شود. فریم ورک اندروید، View
یا Activity
می نامد که روی رویدادهای کلیدی تمرکز دارد. برای ژستها، متد onKeyDown()
زمانی فراخوانی میشود که ژستها رخ میدهند.
به عنوان مثال، یک برنامه می تواند اقدامات از پیش تعریف شده را در یک View
یا Activity
که KeyEvent.Callback
را به صورت زیر اجرا می کند لغو کند:
کاتلین
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
}
}
جاوا
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
خود مرور کنید. - استطاعت جهت دار را حفظ کنید: از "مچ دست به سمت بیرون" برای بعدی و "مچ تلنگر به داخل" برای قبلی استفاده کنید.
- یک موازی لمس برای ژست داشته باشید.
- ارائه بازخورد بصری
- از یک کد کلید برای اجرای عملکردی استفاده نکنید که با بقیه سیستم مخالف است. برای مثال، از
KEYCODE_NAVIGATE_NEXT
برای لغو یک عمل یا حرکت در محور چپ به راست با تلنگرها استفاده نکنید. - رویدادهای کلیدی را در عناصری که بخشی از رابط کاربری نیستند، مانند نماهایی که خارج از صفحه هستند یا تا حدی پوشش داده شده اند، رهگیری نکنید. این مانند هر رویداد کلیدی است.
- حرکات تلنگر مکرر را به ژست بدیع خود تعبیر نکنید. این ممکن است با ژست «تکان دادن مچ» سیستم در تضاد باشد.
برای اینکه یک نما رویدادهای کلیدی ژست را دریافت کند، باید فوکوس داشته باشد. View.setFocusable()
را ببینید.
از آنجایی که ژستها بهعنوان رویدادهای کلیدی تلقی میشوند، باعث خروج از حالت لمسی میشوند که ممکن است کارهای غیرمنتظرهای انجام دهد. از آنجایی که کاربران ممکن است به طور متناوب از لمس و اشاره استفاده کنند، روش View::setFocusableInTouchmode()
ممکن است ضروری باشد. در برخی موارد، ممکن است استفاده از setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS)
نیز ضروری باشد تا هنگامی که فوکوس پس از تغییر به حالت لمسی یا از حالت لمس تغییر میکند، نمای مورد نظر شما فوکوس را دریافت کند.
- از
requestFocus()
و clearFocus()
با دقت استفاده کنید:- هنگام فراخوانی
requestFocus()
، مطمئن شوید که برای نمای فوکوس مناسب است. اگر نما خارج از صفحه باشد یا با نمای دیگری پوشانده شود، هنگامی که حرکات، تماسها را فعال میکنند، ممکن است غافلگیری رخ دهد. - متد
clearFocus()
یک جستجوی فوکوس را برای یافتن نمای مناسب دیگری آغاز می کند. بسته به سلسله مراتب مشاهده، این جستجو ممکن است به محاسبات غیر ضروری نیاز داشته باشد. همچنین میتواند منجر به اختصاص فوکوس به نمایی شود که انتظار ندارید فوکوس دریافت کنید.
رویدادهای کلیدی ابتدا با تمرکز در سلسله مراتب نمای به نمای نمایش داده می شوند. اگر نمای متمرکز رویداد را مدیریت نکند - به عبارت دیگر، false
را برمی گرداند - رویداد به نمای والد تحویل داده نمی شود، حتی اگر بتواند فوکوس را دریافت کند و یک KeyListener
داشته باشد. در عوض، رویداد به فعالیت فعلی ارائه می شود که سلسله مراتب نمایش را با تمرکز نگه می دارد.
بنابراین، ممکن است لازم باشد که همه رویدادها در سطح بالاتر ثبت شوند، سپس کدهای مربوطه ارسال شوند. همچنین، میتوانید فعالیت را زیر طبقهبندی کنید و روش dispatchKeyEvent(KeyEvent event)
را لغو کنید تا در صورت لزوم کلیدها را رهگیری کنید یا زمانی که در لایههای پایینتر مدیریت نمیشوند، آنها را مدیریت کنید.
محتوا و نمونه کدها در این صفحه مشمول پروانههای توصیفشده در پروانه محتوا هستند. جاوا و OpenJDK علامتهای تجاری یا علامتهای تجاری ثبتشده Oracle و/یا وابستههای آن هستند.
تاریخ آخرین بهروزرسانی 2025-07-29 بهوقت ساعت هماهنگ جهانی.
[[["درک آسان","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-29 بهوقت ساعت هماهنگ جهانی."],[],[],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."]]