Input dari alat rotasi

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

Catatan: Panduan ini terutama merujuk pada penanganan input dari tombol putar menggunakan UI berbasis Tampilan. Untuk informasi lengkap cara menangani input dari tombol putar menggunakan Compose untuk Wear OS, lihat Input dari tombol putar di Compose.

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

Praktik terbaik fokus

Untuk merespons peristiwa input dari tombol putar, penampung yang dapat di-scroll harus memiliki fokus. Peristiwa input dari tombol putar 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 tombol putar:

  • 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 putar samping.
  • 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 input scroll dari tombol putar, atau jika Anda ingin menggunakan input dari tombol putar untuk melakukan sesuatu selain men-scroll tampilan—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 input scroll dari tombol putar pada perangkat Wear. Luncurkan aplikasi Wear pada emulator untuk menjalankan project, atau tarik file APK ke emulator untuk menginstalnya.

Untuk menguji input dari tombol 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 Rotary input dalam jendela baru untuk membuka antarmuka input tombol putar dan coba berikan input.

Video berikut menunjukkan input dari tombol putar dalam emulator: