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. Contoh yang menunjukkan penggunaan gestur pergelangan tangan mencakup:

  • Dalam aplikasi untuk joging, melihat layar vertikal yang menunjukkan langkah yang sudah dilakukan, waktu yang berlalu, dan kecepatan saat ini
  • Men-scroll informasi penerbangan dan gerbang ketika sedang di bandara dan membawa barang
  • Men-scroll artikel berita

Untuk meninjau gestur pergelangan tangan di jam tangan Anda, pastikan gestur sudah aktif dengan memilih Setelan > Gestur > Gestur Pergelangan Tangan Aktif. Kemudian, selesaikan tutorial Gestur di jam tangan (Setelan > Gestur > Luncurkan Tutorial).

Gestur dari Bantuan Wear OS berikut tidak tersedia untuk aplikasi:

  • Menggoyangkan pergelangan tangan

Gestur pergelangan tangan dapat digunakan dalam cara berikut:

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 informasi tentang penggunaan class WearableRecyclerView, lihat Membuat Daftar. Lihat juga Praktik Terbaik.

Catatan: Class WearableRecyclerView menggantikan class serupa yang tidak berlaku lagi di Wearable Support Library.

Meskipun menggunakan WearableRecyclerView, Anda mungkin ingin menggunakan konstanta dari class KeyEvent. Tindakan yang telah ditentukan dapat diganti dengan memasukkan WearableRecyclerView ke subclass dan mengimplementasikan kembali callback onKeyDown(). Perilaku ini dapat dinonaktifkan sepenuhnya menggunakan setEnableGestureNavigation(false). Lihat juga 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. Namun, pastikan bahwa peristiwa gestur ini:

  • Dikenali saat perangkat dalam Mode aktif
  • Ditayangkan seperti semua peristiwa tombol lainnya

Secara khusus, peristiwa ini ditayangkan ke Aktivitas teratas, ke Tampilan dengan fokus keyboard. Seperti peristiwa tombol lainnya, class terkait interaksi pengguna (seperti Tampilan atau Aktivitas) yang mengimplementasikan KeyEvent.Callback dapat memahami peristiwa tombol yang terkait dengan gestur pergelangan tangan. Framework Android akan memanggil Tampilan atau Aktivitas yang memiliki fokus dengan peristiwa tombol tersebut; untuk gestur, callback metode onKeyDown() dipanggil ketika gestur terjadi.

Contohnya, aplikasi dapat menggantikan tindakan yang telah ditetapkan dalam Tampilan atau Aktivitas (keduanya menerapkan KeyEvent.Callback) seperti 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 deemed
                    // 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 deemed 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 Tampilan dan Aktivitas Anda.
  • Jaga keterjangkauan berdasarkan arah yang konsisten:
    • Gunakan "Kibaskan pergelangan tangan ke luar" untuk berikutnya, "Kibaskan pergelangan tangan ke dalam" untuk sebelumnya
  • Tetapkan alternatif sentuhan untuk gestur.
  • Sediakan respons visual.
  • Jangan gunakan kode tombol untuk mengimplementasikan fungsionalitas yang berlawanan dengan intuisi bagi sistem lainnya. Misalnya, jangan gunakan KEYCODE_NAVIGATE_NEXT untuk membatalkan tindakan atau untuk menuju sumbu kiri-kanan dengan kibasan.
  • Jangan memblokir peristiwa tombol pada elemen yang bukan bagian dari antarmuka pengguna, misalnya Tampilan yang berada di balik layar atau tertutup sebagian. Hal ini sama seperti peristiwa tombol lainnya.
  • Jangan menafsirkan ulang gestur kibasan berulang menjadi gestur baru milik Anda sendiri. Hal tersebut 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 dari "Mode sentuh" yang mungkin melakukan hal-hal tidak terduga. Maka dari itu, karena pengguna dapat bergantian menggunakan sentuhan dan gestur, metode View::setFocusableInTouchmode() mungkin akan diperlukan. Dalam beberapa kasus, Anda mungkin juga perlu menggunakan setDescendantFocusability(FOCUS_BEFORE_DESCENDANTS) sehingga ketika fokus berubah setelah perubahan ke atau dari "Mode sentuh," tampilan yang diinginkan akan mendapatkan fokus.
  • Gunakan requestFocus() dan clearFocus() dengan cermat:
    • Saat memanggil requestFocus(), pastikan Tampilan benar-benar harus memiliki fokus. Jika Tampilan berada di balik layar atau tertutup oleh Tampilan lainnya, hal tidak terduga mungkin terjadi ketika gestur memicu callback.
    • clearFocus() memulai pencarian fokus untuk menemukan Tampilan lain yang cocok. Tergantung 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 menanganinya (mengembalikan false), peristiwa tidak akan ditayangkan ke Tampilan induk meskipun dapat menerima fokus dan memiliki KeyListener. Sebaliknya, peristiwa ditayangkan ke Aktivitas saat ini yang memiliki hierarki Tampilan dengan fokus. Dengan demikian, Anda mungkin perlu menangkap semua peristiwa di tingkat yang lebih tinggi lalu meneruskan kode yang relevan ke bawah. Atau, Anda dapat memasukkan Aktivitas ke subclass dan mengganti metode dispatchKeyEvent(KeyEvent event) untuk memastikan tombol dapat diblokir saat diperlukan, atau ditangani ketika tidak ditangani pada lapisan yang lebih rendah.