Menggunakan gestur pergelangan tangan di Wear

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
Mengibaskan pergelangan tangan ke luar KEYCODE_NAVIGATE_NEXT Kode tombol ini mengarahkan ke item berikutnya.
Mengibaskan 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: Class WearableRecyclerView 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.