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 memanggilView.requestFocus()
secara manual. - Menandai tampilan kustom yang dapat di-scroll sebagai dapat difokuskan menggunakan
android:focusable="true"
danandroid:focusableInTouchMode="true"
. - Jika tampilan yang dapat di-scroll dilampirkan setelah
Activity.onCreate()
— misalnya, menunggu permintaan jaringan selesai sebelum mem-build UI, panggilrequestFocus()
setelah melampirkannya. - Jika tampilan yang dapat di-scroll pada awalnya adalah
INVISIBLE
atauGONE
, panggilrequestFocus()
saat Anda menetapkannya keVISIBLE
. - 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 memanggilrequestFocus()
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:
- Dari SDK Manager, gunakan tab SDK Tools untuk mendapatkan Android Emulator 26.0.3 atau yang lebih tinggi.
- Di Android Studio, pilih Tools > Android > AVD Manager. Buat perangkat Wear baru dengan API 25 atau yang lebih tinggi.
- Jalankan emulator dari Android Studio.
- 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: