Input dari alat rotasi

Beberapa perangkat Wear OS memiliki tombol samping berputar dalam bentuk fisik. Saat diputar, tombol akan men-scroll tampilan aplikasi Anda saat ini ke atas atau ke bawah. Jenis input ini disebut input dari alat rotasi.

Catatan: Panduan ini terutama merujuk pada penanganan input dari alat rotasi menggunakan UI berbasis View. Untuk informasi lengkap cara menangani input dari alat rotasi menggunakan Compose untuk Wear OS, lihat Input dari alat rotasi pada Compose.

Banyak penampung yang dapat di-scroll, seperti ScrollView, ListView, HorizontalScrollView, dan WearableRecyclerView, mendukung input dari alat rotasi jika memiliki fokus tanpa memerlukan kode khusus Wear OS apa pun. Fokus merupakan prasyarat yang penting, karena pada Android 9 (API level 28) dan yang lebih tinggi, tampilan tidak secara implisit menerima fokus.

Praktik terbaik fokus

Untuk merespons peristiwa input dari alat rotasi, penampung yang dapat di-scroll harus memiliki fokus. Peristiwa input dari alat rotasi tidak menggelembungkan hierarki tampilan. Jika tidak ada tampilan yang difokuskan, atau jika tampilan yang difokuskan menampilkan false dari View.onGenericMotionEvent(), peristiwa akan dikirim ke Activity.onGenericMotionEvent().

Berikut adalah praktik terbaik untuk merespons peristiwa input dari alat rotasi:

  • Perlu diingat bahwa, secara default, meluncurkan aktivitas atau mengetuk tampilan tidak akan memberinya fokus, meskipun dapat difokuskan. Untuk memberi fokus pada tampilan Anda, tampilan harus menggunakan tag <requestFocus /> atau memanggil View.requestFocus() secara manual.
  • Menandai tampilan kustom yang dapat di-scroll sebagai dapat difokuskan menggunakan android:focusable="true" dan android:focusableInTouchMode="true".
  • Jika tampilan yang dapat di-scroll dilampirkan setelah Activity.onCreate()— misalnya, menunggu permintaan jaringan selesai sebelum mem-build UI, panggil requestFocus() setelah melampirkannya.
  • Jika tampilan yang dapat di-scroll pada awalnya adalah INVISIBLE atau GONE, panggil requestFocus() saat Anda menetapkannya ke VISIBLE.
  • Jika aktivitas Anda berisi beberapa tampilan yang dapat di-scroll, pilih salah satu untuk difokuskan menggunakan tag <requestFocus />. Scrolling bertingkat tidak didukung dengan tombol samping yang berputar.
  • Jika UI Anda berisi beberapa tampilan lain yang membutuhkan fokus saat pengguna berinteraksi dengannya—misalnya InputText, berikan cara kepada pengguna untuk memulihkan fokus ke tampilan yang dapat di-scroll jika kehilangan fokus dengan memproses ketukan pada tampilan yang dapat di-scroll dan memanggil requestFocus() sebagai respons.

Perilaku rotasi kustom

Jika tampilan yang dapat di-scroll secara native tidak mendukung scroll input dari alat rotasi, atau jika Anda ingin menggunakan input dari alat rotasi untuk sesuatu selain men-scroll—misalnya untuk memperbesar dan memperkecil atau memutar tombol—Anda dapat menangani peristiwa scroll sendiri. Jangan lupa untuk memastikan tampilan Anda mendapatkan fokus. Jika tidak, peristiwa tidak akan muncul.

Cuplikan kode berikut menunjukkan cara menggunakan MotionEvent, InputDeviceCompat, dan ViewConfigurationCompat untuk menambahkan scroll kustom ke tampilan Anda:

Kotlin

myView.setOnGenericMotionListener { v, ev ->
  if (ev.action == MotionEvent.ACTION_SCROLL &&
      ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)
  ) {
    // Don't forget the negation here
    val delta = -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL) *
        ViewConfigurationCompat.getScaledVerticalScrollFactor(
             ViewConfiguration.get(context), context
        )
    // Swap these axes to scroll horizontally instead
    v.scrollBy(0, delta.roundToInt())
    true
  } else {
    false
  }
}

Java

myView.setOnGenericMotionListener(new View.OnGenericMotionListener() {
  @Override
  public boolean onGenericMotion(View v, MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_SCROLL &&
        ev.isFromSource(InputDeviceCompat.SOURCE_ROTARY_ENCODER)
    ) {
      // Don't forget the negation here
      float delta = -ev.getAxisValue(MotionEventCompat.AXIS_SCROLL) *
          ViewConfigurationCompat.getScaledVerticalScrollFactor(
               ViewConfiguration.get(context), context
          );

      // Swap these axes to scroll horizontally instead
      v.scrollBy(0, Math.round(delta));

      return true;
    }
    return false;
  }
});

Menguji menggunakan emulator

Gunakan Android Emulator untuk menyimulasikan scroll input dari alat rotasi pada perangkat Wear. Luncurkan aplikasi Wear pada emulator untuk menjalankan project, atau tarik file APK ke emulator untuk menginstalnya.

Untuk menguji input 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. Di Android Studio, pilih Tools > Android > AVD Manager. Buat perangkat Wear baru dengan API 25 atau yang lebih tinggi.
  3. Jalankan emulator dari Android Studio.
  4. Klik menu tambahan tiga titik di bagian bawah toolbar emulator. Klik tab Input dari alat rotasi dalam jendela baru untuk membuka antarmuka input dari alat rotasi dan coba scroll input dari alat rotasi.

Video berikut menunjukkan input dari alat rotasi dalam emulator: