Menggunakan gestur pergelangan tangan di Wear
Tetap teratur dengan koleksi
Simpan dan kategorikan konten berdasarkan preferensi Anda.
Gestur pergelangan tangan dapat mengaktifkan interaksi cepat satu tangan dengan aplikasi Anda
saat layar sentuh tidak dapat digunakan.
Misalnya, pengguna dapat men-scroll
notifikasi dengan satu tangan sambil memegang segelas air dengan tangan
lainnya. Kasus penggunaan lainnya untuk gestur pergelangan tangan mencakup:
- Dalam aplikasi joging, melihat layar vertikal yang menunjukkan
jumlah langkah, waktu yang dihabiskan, dan kecepatan saat ini
- Dalam aplikasi perjalanan, men-scroll informasi penerbangan dan gerbang
- Dalam aplikasi berita, men-scroll artikel
Untuk meninjau gestur pergelangan tangan di perangkat
smartwatch, pastikan gestur
sudah aktif dengan memilih Setelan > Fitur lanjutan > Gestur > Gestur Pergelangan Tangan
Aktif. Kemudian, selesaikan tutorial
Gestur di smartwatch dengan memilih Luncurkan Tutorial.
Catatan: Menggoyangkan pergelangan tangan adalah gestur kembali atau urungkan di seluruh sistem
dan tidak dapat disesuaikan oleh aplikasi.
Gestur pergelangan tangan dapat digunakan dalam cara berikut, seperti dijelaskan dalam panduan ini:
Setiap gestur pergelangan tangan dipetakan ke konstanta int
dari class
KeyEvent
,
seperti yang ditunjukkan dalam tabel berikut:
Gestur
|
KeyEvent
|
Deskripsi
|
Memutar pergelangan tangan ke luar
|
KEYCODE_NAVIGATE_NEXT
|
Kode tombol ini mengarahkan ke item berikutnya.
|
Memutar pergelangan tangan ke dalam
|
KEYCODE_NAVIGATE_PREVIOUS
|
Kode tombol ini mengarahkan ke item sebelumnya.
|
Menggunakan tata letak melengkung untuk mendukung gestur pergelangan tangan
Class
WearableRecyclerView
menyediakan tata letak melengkung
untuk daftar dan mendukung gestur pergelangan tangan
secara otomatis. Class ini memiliki tindakan yang telah ditentukan untuk kejadian
gestur pergelangan tangan ketika fokus berada pada tampilan. Untuk mengetahui informasi tentang penggunaan
class WearableRecyclerView
, lihat Membuat daftar di Wear OS. Selain itu, lihat
bagian Praktik terbaik di panduan ini.
Catatan: ClassWearableRecyclerView
menggantikan class serupa
yang tidak digunakan lagi di Wearable Support Library.
Meskipun menggunakan WearableRecyclerView
, Anda mungkin perlu menggunakan
konstanta dari class
KeyEvent
. Tindakan yang telah ditentukan dapat diganti dengan menambahkan
WearableRecyclerView
ke subclass dan mengimplementasikan kembali
callback onKeyDown()
. Perilaku ini dapat dinonaktifkan sepenuhnya
menggunakan setEnableGestureNavigation(false)
.
Untuk mengetahui informasi selengkapnya, lihat
Menangani tindakan keyboard.
Menggunakan peristiwa tombol secara langsung
Anda dapat menggunakan peristiwa tombol di luar
WearableRecyclerView
untuk memicu tindakan baru sebagai respons terhadap
peristiwa gestur. Yang penting, peristiwa gestur ini dikenali saat perangkat dalam
mode aktif, dan peristiwa ditayangkan dengan cara yang sama seperti semua peristiwa tombol.
Class yang berkaitan dengan interaksi pengguna, seperti View
atau
Activity
, dan yang menerapkan
KeyEvent.Callback
dapat memproses peristiwa tombol yang berkaitan dengan
gestur pergelangan tangan, seperti halnya class tersebut dapat dicantumkan ke peristiwa tombol lainnya. Framework Android
memanggil View
atau Activity
yang memiliki
fokus dengan peristiwa tombol. Untuk gestur, callback metode onKeyDown()
dipanggil saat gestur terjadi.
Contohnya, aplikasi dapat mengganti tindakan yang telah ditetapkan dalam View
atau Activity
yang mengimplementasikan KeyEvent.Callback
sebagai berikut:
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;
}
}
Praktik terbaik
- Tinjau halaman
KeyEvent
dan
KeyEvent.Callback
untuk penayangan peristiwa tombol ke
View
dan Activity
.
- Pertahankan tindakan dengan arah yang konsisten: gunakan "putar pergelangan tangan ke luar" untuk
berikutnya dan "putar pergelangan tangan ke dalam" untuk sebelumnya.
- Tetapkan alternatif sentuhan untuk gestur.
- Sediakan respons visual.
- Jangan gunakan kode tombol untuk mengimplementasikan fungsi yang
kontra-intuitif dengan bagian sistem lainnya. Misalnya, jangan gunakan
KEYCODE_NAVIGATE_NEXT
untuk membatalkan tindakan atau memilih
sumbu kiri-kanan dengan memutar pergelangan.
- Jangan memblokir peristiwa tombol pada elemen yang bukan bagian dari
antarmuka pengguna, seperti tampilan yang berada di balik layar atau tertutup
sebagian. Ini juga berlaku untuk peristiwa tombol apa pun.
- Jangan menafsirkan ulang gestur putar pergelangan berulang menjadi gestur baru milik Anda sendiri.
Hal ini mungkin bertentangan dengan gestur "menggoyangkan pergelangan tangan" yang ada di sistem.
Agar dapat menerima peristiwa tombol gestur, tampilan harus memiliki
fokus. Lihat
View.setFocusable()
.
Karena diperlakukan sebagai peristiwa tombol,
gestur memicu transisi keluar dari "mode sentuh" yang mungkin melakukan
hal-hal tidak terduga. Karena pengguna dapat bergantian menggunakan sentuhan dan
gestur, metode
View::setFocusableInTouchmode()
mungkin diperlukan. Dalam
beberapa kasus, Anda mungkin juga perlu menggunakan
setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS)
sehingga
ketika fokus berubah setelah peralihan ke atau dari mode sentuh,
tampilan yang diinginkan akan mendapatkan fokus.
- Gunakan
requestFocus()
dan
clearFocus()
dengan hati-hati:
- Saat memanggil
requestFocus()
, pastikan sesuai agar
tampilan dapat memiliki fokus. Jika tampilan berada di balik layar atau tertutup oleh tampilan lainnya,
hal tidak terduga mungkin terjadi ketika gestur memicu callback.
- Metode
clearFocus()
memulai penelusuran fokus untuk menemukan
tampilan lain yang sesuai. Bergantung pada hierarki tampilan, pencarian ini mungkin
memerlukan komputasi yang sulit. Penetapan fokus ke tampilan
yang tidak diharapkan untuk menerimanya juga dapat terjadi.
Peristiwa tombol ditayangkan terlebih dahulu ke tampilan dengan fokus dalam hierarki
tampilan. Jika tampilan yang difokuskan tidak menangani peristiwa—dengan kata lain hanya menampilkan
false
—peristiwa tersebut tidak akan ditayangkan ke tampilan induk, meskipun
dapat menerima fokus dan memiliki
KeyListener
. Sebaliknya, peristiwa akan ditayangkan ke aktivitas saat ini yang
memiliki hierarki tampilan dengan fokus.
Oleh karena itu, Anda mungkin perlu
menangkap semua peristiwa di level yang lebih tinggi, lalu meneruskan kode yang relevan ke bawah.
Atau, Anda dapat memasukkan aktivitas ke subclass dan mengganti metode
dispatchKeyEvent(KeyEvent event)
untuk menangkap kunci
saat diperlukan atau menanganinya ketika tidak ditangani di
lapisan yang lebih rendah.
Konten dan contoh kode di halaman ini tunduk kepada lisensi yang dijelaskan dalam Lisensi Konten. Java dan OpenJDK adalah merek dagang atau merek dagang terdaftar dari Oracle dan/atau afiliasinya.
Terakhir diperbarui pada 2025-07-26 UTC.
[[["Mudah dipahami","easyToUnderstand","thumb-up"],["Memecahkan masalah saya","solvedMyProblem","thumb-up"],["Lainnya","otherUp","thumb-up"]],[["Informasi yang saya butuhkan tidak ada","missingTheInformationINeed","thumb-down"],["Terlalu rumit/langkahnya terlalu banyak","tooComplicatedTooManySteps","thumb-down"],["Sudah usang","outOfDate","thumb-down"],["Masalah terjemahan","translationIssue","thumb-down"],["Masalah kode / contoh","samplesCodeIssue","thumb-down"],["Lainnya","otherDown","thumb-down"]],["Terakhir diperbarui pada 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."]]