ใช้ท่าทางสัมผัสด้วยข้อมือใน Wear
จัดทุกอย่างให้เป็นระเบียบอยู่เสมอด้วยคอลเล็กชัน
บันทึกและจัดหมวดหมู่เนื้อหาตามค่ากำหนดของคุณ
ท่าทางสัมผัสด้วยข้อมือช่วยให้โต้ตอบกับแอปของคุณได้อย่างรวดเร็วโดยใช้มือเดียว
เมื่อใช้งานหน้าจอสัมผัสได้ไม่สะดวก
เช่น ผู้ใช้สามารถเลื่อน
ผ่านการแจ้งเตือนด้วยมือข้างเดียวขณะถือแก้วน้ำที่มี
อื่นๆ กรณีการใช้งานอื่นๆ สำหรับการเคลื่อนไหวข้อมือมีดังนี้
- ในแอปจ็อกกิ้ง การนำทางผ่านหน้าจอแนวตั้งที่แสดง
จำนวนก้าว เวลาที่ผ่านไป และเพซปัจจุบัน
- ในแอปท่องเที่ยว การเลื่อนดูข้อมูลเที่ยวบินและประตูทางออก
- ในแอปข่าว การเลื่อนดูบทความ
วิธีตรวจสอบท่าทางสัมผัสด้วยข้อมือบนนาฬิกา
อุปกรณ์ ให้ยืนยันว่าท่าทางสัมผัส
เปิดโดยเลือกการตั้งค่า > ฟีเจอร์ขั้นสูง > ท่าทางสัมผัส > ท่าทางสัมผัสด้วยข้อมือ
เปิด จากนั้นทำ
บทแนะนำเกี่ยวกับท่าทางสัมผัสในนาฬิกาโดยเลือกเปิดบทแนะนำ
หมายเหตุ: การเขย่าข้อมือเป็นการถอยหลังหรือท่าทางสัมผัสสำหรับเลิกทำทั้งระบบ
และไม่สามารถปรับแต่งแอปได้
ท่าทางสัมผัสด้วยข้อมือสามารถใช้ในลักษณะต่อไปนี้ได้ ดังที่อธิบายไว้ในคู่มือนี้
ท่าทางสัมผัสของข้อมือแต่ละอันจะจับคู่กับค่าคงที่ int
จาก
วันที่ KeyEvent
ดังที่แสดงในตารางต่อไปนี้
ใช้เลย์เอาต์แบบโค้งเพื่อรองรับท่าทางสัมผัสด้วยข้อมือ
คลาส
WearableRecyclerView
จะมีแผนภูมิโค้ง
เลย์เอาต์สำหรับรายการและรองรับ
ด้วยการเคลื่อนไหวข้อมือ คลาสมีการดำเนินการที่กำหนดไว้ล่วงหน้าสำหรับรายการ
ท่าทางสัมผัสด้วยข้อมือเมื่อมุมมองมีโฟกัส สำหรับข้อมูลเกี่ยวกับการใช้
ชั้นเรียน WearableRecyclerView
โปรดดูหัวข้อสร้างรายการใน Wear OS นอกจากนี้ โปรดดู
ส่วนแนวทางปฏิบัติแนะนำของคู่มือนี้
หมายเหตุ: คลาส WearableRecyclerView
จะแทนที่คลาส
เลิกใช้งานในไลบรารีการสนับสนุนของอุปกรณ์สวมใส่แล้ว
แม้ว่าคุณจะใช้ WearableRecyclerView
แต่คุณอาจต้องการใช้
ค่าคงที่จาก KeyEvent
การดำเนินการที่กำหนดไว้ล่วงหน้าสามารถลบล้างได้ด้วยการแยกประเภทย่อย
WearableRecyclerView
และนำพารามิเตอร์
onKeyDown()
Callback ปิดใช้ลักษณะการทำงานได้ทั้งหมด
โดยใช้ setEnableGestureNavigation(false)
สำหรับข้อมูลเพิ่มเติม โปรดดู
จัดการการดำเนินการของแป้นพิมพ์
ใช้เหตุการณ์สําคัญโดยตรง
คุณสามารถใช้เหตุการณ์สำคัญภายนอก
WearableRecyclerView
เพื่อทริกเกอร์การดำเนินการใหม่ตามท่าทางสัมผัส
กิจกรรม ที่สำคัญระบบจะจดจำเหตุการณ์ท่าทางสัมผัสเหล่านี้เมื่ออุปกรณ์อยู่ใน
ทำงาน และจะแสดงในลักษณะเดียวกับเหตุการณ์สำคัญทั้งหมด
คลาสที่เกี่ยวข้องกับการโต้ตอบของผู้ใช้ เช่น View
หรือ
Activity
และดำเนินการ
KeyEvent.Callback
สามารถฟังเหตุการณ์สําคัญที่เกี่ยวข้องกับ
ท่าทางสัมผัสด้วยข้อมือเช่นเดียวกับที่แสดงต่อเหตุการณ์สำคัญอื่นๆ เฟรมเวิร์ก Android
จะโทรหา View
หรือ Activity
ที่มี
โฟกัสที่เหตุการณ์สําคัญ สำหรับท่าทางสัมผัส พารามิเตอร์ onKeyDown()
ระบบจะเรียกเมธอด Callback เมื่อมีการท่าทางสัมผัสเกิดขึ้น
เช่น แอปลบล้างการดำเนินการที่กำหนดไว้ล่วงหน้าใน 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
ของคุณ
- มีทิศทางที่สม่ำเสมอ: ใช้ "สะบัดข้อมือออก" สำหรับ
ถัดไปและ "สะบัดข้อมือเข้า" สำหรับส่วนก่อนหน้า
- แตะคู่ขนานเพื่อท่าทางสัมผัส
- แสดงความคิดเห็นด้วยภาพ
- อย่าใช้รหัสคีย์เพื่อใช้งานฟังก์ชันที่อาจ
ใช้งานยากกับส่วนอื่นๆ ในระบบ ตัวอย่างเช่น อย่าใช้
KEYCODE_NAVIGATE_NEXT
เพื่อยกเลิกการดำเนินการหรือไปยังส่วนต่างๆ
แกนด้านซ้าย-ขวาที่มีการสะบัดนิ้ว
- อย่าสกัดกั้นเหตุการณ์สำคัญในองค์ประกอบที่ไม่ได้เป็นส่วนหนึ่งของ
อินเทอร์เฟซผู้ใช้ เช่น การดูนอกหน้าจอหรือบางส่วน
ที่ครอบคลุม ซึ่งจะเหมือนกับเหตุการณ์สําคัญอื่นๆ
- อย่าตีความท่าทางสัมผัสการสะบัดซ้ำๆ เป็นท่าทางสัมผัสแบบใหม่
ซึ่งอาจขัดแย้งกับ "การสั่นข้อมือ" ของระบบ ท่าทางสัมผัส
หากต้องการให้มุมมองรับเหตุการณ์สำคัญด้วยท่าทางสัมผัส จะต้องมี
โฟกัส ดู
View.setFocusable()
เนื่องจากท่าทางสัมผัสถือเป็นเหตุการณ์สําคัญ
อุปกรณ์จะทริกเกอร์การเปลี่ยนจาก "โหมดสัมผัส" ซึ่งอาจสร้างโดยไม่คาดคิด
สิ่งต่างๆ เนื่องจากผู้ใช้อาจสลับใช้การแตะและ
อาจจำเป็นต้องใช้เมธอด
View::setFocusableInTouchmode()
ในบางส่วน
คุณยังอาจจำเป็นต้องใช้
setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS)
ดังนั้น
เมื่อโฟกัสเปลี่ยนหลังจากเปลี่ยนเป็นหรือจากโหมดสัมผัส
มุมมองที่ต้องการจะได้รับการโฟกัส
- ใช้
requestFocus()
และ
วันที่ clearFocus()
อย่างรอบคอบ:
- เมื่อโทรหา
requestFocus()
โปรดตรวจสอบว่าเหมาะสมสำหรับ
เพื่อให้มีสมาธิ หากมุมมองอยู่นอกหน้าจอหรือถูกบังด้วยมุมมองอื่น
ซึ่งอาจเกิดขึ้นเมื่อท่าทางสัมผัสทำให้เกิด Callback
- เมธอด
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."]]