Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Masukan dari alat rotasi pada Wear

Beberapa perangkat Wear OS mendukung masukan dari alat rotasi, seperti tombol sisi rotasi (RSB). Ketika pengguna memutar tombol, tampilan saat ini aplikasi Anda akan men-scroll ke atas atau bawah.

Jika Anda menggunakan ScrollView, ListView, HorizontalScrollView, atau WearableRecyclerView dalam aplikasi Anda, tampilan aplikasi akan mendapat dukungan masukan dari alat rotasi secara default. Jika Anda menggunakan tampilan khusus selain yang tercantum dalam daftar, atau jika ingin menangani peristiwa masukan dari alat rotasi secara manual, lihat Menambahkan Scroll Masukan dari Alat Rotasi Kustom.

Lihat resource terkait berikut:

Praktik terbaik fokus

Untuk merespons peristiwa masukan dari alat rotasi, tampilan scroll Anda harus berada dalam fokus. Pada banyak kasus, hal ini terjadi secara otomatis; tampilan scroll Anda menjadi difokuskan langsung setelah Anda membuat Aktivitas. Namun, terdapat situasi ketika Anda perlu menangani fokus tampilan aplikasi secara manual, misalnya:

  • Jika tampilan yang dapat di-scroll terlampir setelah Activity.onCreate() (misalnya ketika Anda menunggu permintaan jaringan selesai sebelum membuat UI), Anda harus memanggil requestFocus setelah melampirkannya.
  • Jika tampilan yang dapat di-scroll pada awalnya INVISIBLE atau GONE, Anda harus memanggil requestFocus ketika menyetelnya ke VISIBLE.
  • Jika Aktivitas berisi beberapa tampilan yang dapat di-scroll (misalnya, jika Anda menggunakan scroll yang disarangkan), Anda harus memilih salah satu untuk difokuskan (biasanya melalui tag <requestFocus />). Scroll yang disarangkan saat ini belum didukung untuk scroll RSB.
  • Jika UI Anda berisi beberapa tampilan lain yang mencuri fokus ketika pengguna berinteraksi dengannya (hal ini jarang terjadi; contoh paling umum adalah InputText), Anda harus memberi pengguna beberapa cara untuk mengembalikan fokus ke tampilan yang dapat di-scroll jika kehilangan fokus. Hal ini biasanya dilakukan dengan memproses ketukan pada tampilan yang dapat di-scroll dan memanggil requestFocus sebagai respons.

Menambahkan scroll masukan dari alat rotasi khusus

Jika tampilan yang dapat di-scroll tidak mendukung scroll masukan dari alat rotasi secara native, atau jika Anda ingin melakukan sesuatu selain men-scroll sebagai respons atas peristiwa masukan dari alat rotasi (memperbesar/memperkecil, memutar dial, dll.), Anda dapat menggunakan metode RotaryEncoder dalam Wearable Support Library.

Cuplikan kode berikut menampilkan cara menggunakan RotaryEncoder untuk menambahkan scroll khusus dalam tampilan aplikasi Anda:

Kotlin

    myView.setOnGenericMotionListener(View.OnGenericMotionListener { v, ev ->
        if (ev.action == MotionEvent.ACTION_SCROLL && RotaryEncoder.isFromRotaryEncoder(ev)) {
            // Don't forget the negation here
            val delta = -RotaryEncoder.getRotaryAxisValue(ev) *
                    RotaryEncoder.getScaledScrollFactor(context)

            // Swap these axes if you want to do horizontal scrolling instead
            v.scrollBy(0, Math.round(delta))

            return@OnGenericMotionListener true
        }

        false
    })
    

Java

    myView.setOnGenericMotionListener(new View.OnGenericMotionListener() {
        @Override
        public boolean onGenericMotion(View v, MotionEvent ev) {
            if (ev.getAction() == MotionEvent.ACTION_SCROLL && RotaryEncoder.isFromRotaryEncoder(ev)) {
                // Don't forget the negation here
                float delta = -RotaryEncoder.getRotaryAxisValue(ev) * RotaryEncoder.getScaledScrollFactor(
                getContext());

                // Swap these axes if you want to do horizontal scrolling instead
                v.scrollBy(0, Math.round(delta));

                return true;
            }

            return false;
        }
    });
    

Menguji tombol masukan dari alat rotasi pada emulator

Anda dapat menggunakan Android Emulator untuk menyimulasikan scroll masukan dari alat rotasi pada perangkat Wear. Luncurkan aplikasi Wear pada emulator saat menjalankan project, atau tarik file APK ke emulator untuk menginstalnya.

Untuk menguji masukan dari alat putar pada emulator:

  1. Dari SDK Manager, gunakan tab SDK Tools untuk mendapatkan Android Emulator 26.0.3 atau yang lebih tinggi.
  2. Buat AVD (Android Virtual Device) dengan API 25.

    Dalam Studio, pilih Tools>Android>AVD Manager. Buat perangkat Wear baru dengan API 25.

  3. Jalankan emulator dari Android Studio.
  4. Coba scroll masukan dari alat rotasi.

    Klik tombol tambahan (tiga titik di bagian bawah toolbar emulator). Klik tab Masukan dari alat rotasi dalam jendela baru untuk membuka antarmuka masukan dari alat rotasi.

Video berikut menunjukkan masukan dari alat rotasi dalam emulator:

Tips perilaku fokus

  • Sebuah tampilan dapat difokuskan jika memiliki setFocusableInTouchMode(true). Secara default, hal ini hanya berlaku untuk tampilan yang dapat di-scroll (misalnya, ScrollView) dan InputText.
  • Secara default, dengan mengetuk suatu tampilan bukan berarti memfokuskannya (meskipun dapat difokuskan). Untuk mencapai perilaku ini, tampilan harus memproses peristiwa ketukan dan memanggil View.requestFocus() secara manual.
  • Segera setelah Activity dibuat, tampilan akan secara otomatis memfokuskan tampilan yang dapat difokuskan yang pertama ditemukan dalam hierarki tampilan. Jika Anda memiliki beberapa tampilan yang dapat difokuskan dalam Aktivitas, mungkin saja tampilan ini bukan yang Anda inginkan. Anda dapat memfokuskan tampilan yang berbeda menggunakan tag <requestFocus /> (atau dengan memanggil View.requestFocus dalam Activity.onResume secara manual).
  • Tampilan yang dapat difokuskan tidak secara otomatis difokuskan jika dilampirkan atau diperlihatkan setelah suatu Aktivitas, dibuat, meskipun tidak ada tampilan yang difokuskan saat ini. Dalam kasus ini, Anda perlu memanggil View.requestFocus secara manual.
  • Peristiwa masukan dari alat rotasi hanya dikirim ke tampilan yang difokuskan. Peristiwa ini tidak menggelembungkan hirearki tampilan. Jika tidak ada tampilan yang difokuskan, atau jika tampilan yang difokuskan mengembalikan nilai false dari View.onGenericMotionEvent, peristiwa hanya akan dikirimkan ke Activity.onGenericMotionEvent.