Di perangkat layar berukuran besar, pengguna lebih sering berinteraksi dengan aplikasi menggunakan keyboard, mouse, trackpad, stilus, atau gamepad. Agar aplikasi Anda dapat menerima input dari perangkat eksternal, lakukan hal berikut:
- Menguji dukungan keyboard dasar seperti navigasi Tab dan tombol keyboard tombol panah, konfirmasi entri tombol Enter, dan putar/jeda tombol Spasi di aplikasi media
- Menambahkan pintasan keyboard standar jika berlaku; misalnya, Ctrl + Z untuk mengurungkan dan Ctrl + S untuk menyimpan
- Menguji interaksi mouse dasar dengan cara mengklik kanan untuk menu konteks, perubahan ikon saat mengarahkan kursor, dan peristiwa scroll roda mouse atau trackpad pada tampilan kustom.
- Menguji perangkat input khusus aplikasi seperti stilus untuk aplikasi menggambar, pengontrol game untuk game, dan pengontrol MIDI untuk aplikasi musik
- Pertimbangkan dukungan input lanjutan yang dapat membuat aplikasi terlihat menarik di lingkungan desktop; misalnya, touchpad sebagai cross fader untuk aplikasi DJ, mouse capture untuk game, dan pintasan keyboard yang ekstensif untuk pengguna yang lebih memilih keyboard
Keyboard
Cara aplikasi Anda merespons input keyboard berkontribusi pada pengalaman layar besar yang baik. Ada tiga jenis input keyboard: navigasi, tombol, dan pintasan.
Navigasi
Navigasi keyboard jarang diterapkan di aplikasi yang berfokus pada sentuhan, tetapi pengguna mengharapkannya saat mereka menggunakan aplikasi dan menggunakan keyboard. Hal ini juga penting untuk pengguna dengan kebutuhan aksesibilitas di ponsel, tablet, perangkat foldable, serta perangkat desktop.
Untuk banyak aplikasi, hanya tombol panah dan navigasi tab sederhana yang diperlukan dan
sebagian besar ditangani secara otomatis oleh framework Android. Misalnya, tampilan
Button
dapat difokuskan secara default, dan navigasi keyboard umumnya
akan berfungsi tanpa kode tambahan. Untuk mengaktifkan navigasi keyboard pada tampilan yang
tidak dapat difokuskan secara default, developer harus menandainya sebagai dapat difokuskan, yang dapat
dilakukan secara terprogram atau dalam XML, seperti yang ditunjukkan di bawah. Lihat
Penanganan Fokus
untuk mengetahui informasi selengkapnya.
Kotlin
yourView.isFocusable = true
Java
yourView.setFocusable(true);
Atau, Anda dapat menyetel atribut focusable
di file tata letak:
android:focusable="true"
Setelah fokus diaktifkan, framework Android akan membuat pemetaan navigasi untuk semua tampilan yang dapat difokuskan berdasarkan posisinya. Hal ini biasanya berhasil seperti yang diharapkan dan tidak perlu pekerjaan lebih lanjut. Jika pemetaan default tidak sesuai dengan kebutuhan aplikasi, pemetaan tersebut dapat diganti sebagai berikut:
Kotlin
// Arrow keys yourView.nextFocusLeftId = R.id.view_to_left yourView.nextFocusRightId = R.id.view_to_right yourView.nextFocusTopId = R.id.view_above yourView.nextFocusBottomId = R.id.view_below // Tab key yourView.nextFocusForwardId = R.id.next_view
Java
// Arrow keys yourView.setNextFocusLeftId(R.id.view_to_left); yourView.setNextFocusRightId(R.id.view_to_left); yourView.setNextFocusTopId(R.id.view_to_left); yourView.setNextFocusBottomId(R.id.view_to_left); // Tab key yourView.setNextFocusForwardId(R.id.next_view);
Sebaiknya Anda mengakses setiap bagian fungsi aplikasi Anda sebelum setiap rilis menggunakan keyboard saja. Harus mudah mengakses tindakan yang paling umum tanpa mouse atau input sentuh.
Ingat, dukungan keyboard mungkin penting bagi pengguna dengan kebutuhan aksesibilitas.
Penekanan tombol
Untuk input teks yang akan ditangani oleh keyboard virtual di layar
(IME) seperti EditText
, aplikasi
harus berperilaku seperti yang diharapkan di layar perangkat besar tanpa pekerjaan tambahan dari
developer. Untuk penekanan tombol yang tidak dapat diperkirakan oleh framework, aplikasi
harus menangani sendiri perilaku tersebut. Hal ini terutama berlaku untuk aplikasi
dengan tampilan khusus.
Beberapa contohnya adalah aplikasi chat yang menggunakan tombol enter untuk mengirim pesan, aplikasi media yang memulai/menghentikan pemutaran dengan tombol spasi, dan game yang mengontrol gerakan dengan tombol w, a, s, dan d.
Sebagian besar aplikasi mengganti
callback onKeyUp()
dan menambahkan perilaku yang diharapkan untuk setiap kode tombol yang diterima, seperti yang ditunjukkan
di bawah ini:
Kotlin
override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean { return when (keyCode) { KeyEvent.KEYCODE_ENTER -> { sendChatMessage() true } KeyEvent.KEYCODE_SPACE -> { playOrPauseMedia() true } else -> super.onKeyUp(keyCode, event) } }
Java
@Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_ENTER) { sendMessage(); return true; } else if (KeyEvent.KEYCODE_SPACE){ playOrPauseMedia(); return true; } else { return super.onKeyUp(keyCode, event); } }
Peristiwa onKeyUp
terjadi saat tombol dirilis. Penggunaan callback ini akan mencegah
aplikasi memproses beberapa peristiwa onKeyDown
jika tombol ditahan
atau dirilis secara perlahan. Game dan aplikasi yang ingin mengetahui saat tombol
ditekan atau yang mengharapkan pengguna menekan tombol keyboard dapat mencari
peristiwa onKeyDown()
dan menangani sendiri peristiwa onKeyDown
yang berulang.
Untuk informasi menyediakan dukungan keyboard lebih lanjut, lihat Menangani tindakan keyboard.
Pintasan
Pintasan berbasis Ctrl, Alt, dan Shift umum diharapkan saat menggunakan keyboard hardware. Jika aplikasi tidak menerapkannya, pengalaman tersebut dapat membuat pengguna merasa kesulitan. Pengguna lanjutan juga menghargai adanya pintasan untuk tugas khusus aplikasi yang sering digunakan. Pintasan membuat aplikasi lebih mudah digunakan dan membedakannya dari aplikasi yang tidak memiliki pintasan.
Beberapa pintasan umum antara lain Ctrl + S (simpan), Ctrl + Z (urungkan), dan Ctrl + Shift + Z (ulangi). Untuk melihat contoh beberapa pintasan lanjutan lainnya, lihat daftar tombol pintasan VLC Media Player.
Pintasan dapat diterapkan menggunakan
dispatchKeyShortcutEvent()
.
Tindakan ini mencegat semua kombinasi tombol meta (Alt, Ctrl, dan Shift) untuk kode tombol
tertentu. Untuk memeriksa tombol meta tertentu, gunakan
KeyEvent.isCtrlPressed()
,
KeyEvent.isShiftPressed()
,
KeyEvent.isAltPressed()
,
atau
KeyEvent.hasModifiers()
.
Memisahkan kode pintasan dari penanganan tombol lainnya (seperti onKeyUp()
dan onKeyDown()
) dapat mempermudah pemeliharaan kode dan mempertahankan penerimaan default
tombol meta tanpa harus menerapkan pemeriksaan tombol meta secara manual dalam setiap kasus. Mengizinkan semua kombinasi tombol meta juga terasa lebih nyaman bagi
pengguna yang terbiasa dengan tata letak keyboard dan sistem operasi yang berbeda.
Kotlin
override fun dispatchKeyShortcutEvent(event: KeyEvent): Boolean { return when (event.keyCode) { KeyEvent.KEYCODE_O -> { openFile() // Ctrl+O, Shift+O, Alt+O true } KeyEvent.KEYCODE_Z-> { if (event.isCtrlPressed) { if (event.isShiftPressed) { redoLastAction() // Ctrl+Shift+Z pressed true } else { undoLastAction() // Ctrl+Z pressed true } } } else -> { return super.dispatchKeyShortcutEvent(event) } } }
Java
@Override public boolean dispatchKeyShortcutEvent(KeyEvent event) { if (event.getKeyCode() == KeyEvent.KEYCODE_O) { openFile(); // Ctrl+O, Shift+O, Alt+O return true; } else if(event.getKeyCode() == KeyEvent.KEYCODE_Z) { if (event.isCtrlPressed()) { if (event.isShiftPressed()) { redoLastAction(); return true; } else { undoLastAction(); return true; } } } return super.dispatchKeyShortcutEvent(event); }
Anda juga dapat mengimplementasikan pintasan di onKeyUp()
dengan memeriksa
KeyEvent.isCtrlPressed()
,
KeyEvent.isShiftPressed()
,
atau
KeyEvent.isAltPressed()
dengan cara yang sama seperti di atas. Hal ini dapat lebih mudah dipertahankan jika perilaku
meta lebih mengarah ke modifikasi pada perilaku aplikasi daripada pintasan.
Misalnya, jika W berarti "berjalan ke depan" dan Shift + W berarti "berlari ke depan".
Kotlin
override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean { return when(keyCode) { KeyEvent.KEYCODE_W-> { if (event.isShiftPressed) { if (event.isCtrlPressed) { flyForward() // Ctrl+Shift+W pressed true } else { runForward() // Shift+W pressed true } } else { walkForward() // W pressed true } } else -> super.onKeyUp(keyCode, event) } }
Java
@Override public boolean onKeyUp(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_W) { if (event.isShiftPressed()) { if (event.isCtrlPressed()) { flyForward(); // Ctrl+Shift+W pressed return true; } else { runForward(); // Shift+W pressed return true; } } else { walkForward(); return true; } } return super.onKeyUp(keyCode, event); }
Stilus
Banyak perangkat layar besar dilengkapi dengan stilus, dan aplikasi Android akan menanganinya sebagai input layar sentuh. Beberapa perangkat mungkin juga memiliki tablet menggambar USB atau bluetooth, seperti Wacom Intuos. Aplikasi Android dapat menerima input bluetooth, tetapi tidak akan berfungsi dengan input USB.
Peristiwa stilus dilaporkan sebagai peristiwa layar sentuh melalui
View.onTouchEvent()
atau
View.onGenericMotionEvent()
,
dan berisi
MotionEvent.getSource()
dari jenis
SOURCE_STYLUS
.
MotionEvent
juga akan berisi data tambahan:
MotionEvent.getToolType()
menampilkanTOOL_TYPE_FINGER
, TOOL_TYPE_STYLUS, atauTOOL_TYPE_ERASER
bergantung pada alat yang membuat kontak dengan permukaanMotionEvent.getPressure()
melaporkan tekanan fisik yang diterapkan pada pena stilus (jika didukung)MotionEvent.getAxisValue()
denganMotionEvent.AXIS_TILT
danMotionEvent.AXIS_ORIENTATION
yang dapat digunakan untuk membaca kemiringan dan orientasi fisik stilus (jika didukung)
Titik historis
Android mengumpulkan input peristiwa dan mengirimkannya sekali per frame. Pena stilus
dapat melaporkan peristiwa pada frekuensi yang jauh lebih tinggi daripada tampilan. Saat membuat
aplikasi menggambar, penting untuk memeriksa peristiwa yang mungkin terjadi di masa
lalu menggunakan API getHistorical
:
MotionEvent.getHistoricalX()
MotionEvent.getHistoricalY()
MotionEvent.getHistoricalPressure()
MotionEvent.getHistoricalAxisValue()
Penolakan telapak tangan
Saat menggambar, menulis, atau berinteraksi dengan aplikasi Anda menggunakan stilus, terkadang pengguna
menyentuh layar dengan telapak tangan mereka. Peristiwa sentuh (disetel ke
ACTION_DOWN
atau
ACTION_POINTER_DOWN
)
dapat dilaporkan ke aplikasi Anda sebelum sistem mengenali dan mengabaikan
sentuhan telapak tangan yang tidak disengaja.
Android membatalkan peristiwa sentuhan telapak tangan dengan mengirim
MotionEvent
. Jika aplikasi Anda menerima
ACTION_CANCEL
, batalkan
gestur. Jika aplikasi Anda menerima
ACTION_POINTER_UP
,
periksa apakah
FLAG_CANCELED
telah disetel. Jika
ya, batalkan gestur.
Jangan hanya memeriksa FLAG_CANCELED
. Mulai Android 13, untuk memudahkan,
sistem menyetel FLAG_CANCELED
untuk peristiwa ACTION_CANCEL
, tetapi versi sebelumnya
tidak.
Android 12
Di Android 12 (API level 32) dan yang lebih rendah, deteksi penolakan telapak tangan hanya
dapat dilakukan untuk peristiwa sentuh satu pointer. Jika sentuhan telapak tangan adalah satu-satunya pointer, sistem akan membatalkan peristiwa dengan menyetel ACTION_CANCEL
pada objek peristiwa gerakan.
Jika pointer lain turun, sistem akan menyetel ACTION_POINTER_UP
, yang
tidak cukup untuk mendeteksi penolakan telapak tangan.
Android 13
Di Android 13 (API level 33) dan yang lebih baru, jika sentuhan telapak tangan adalah satu-satunya pointer,
sistem akan membatalkan peristiwa dengan menyetel ACTION_CANCEL
dan FLAG_CANCELED
pada
objek peristiwa gerakan. Jika pointer lain turun, sistem akan menyetel
ACTION_POINTER_UP
dan FLAG_CANCELED
.
Setiap kali aplikasi Anda menerima peristiwa gerakan dengan ACTION_POINTER_UP
, periksa
FLAG_CANCELED
untuk menentukan apakah peristiwa tersebut menunjukkan penolakan telapak tangan (atau
pembatalan peristiwa lainnya).
Aplikasi pencatatan
ChromeOS memiliki intent khusus yang menampilkan aplikasi pencatatan terdaftar kepada pengguna. Untuk mendaftarkan aplikasi sebagai aplikasi pencatatan, tambahkan kode berikut ke manifes Android:
<intent-filter>
<action android:name="org.chromium.arc.intent.action.CREATE_NOTE" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
Saat aplikasi didaftarkan, pengguna dapat memilihnya sebagai aplikasi
pencatatan default. Saat catatan baru diminta, aplikasi harus membuat catatan kosong yang siap
untuk input stilus. Saat pengguna ingin memberi anotasi pada gambar (seperti
screenshot atau gambar yang didownload), aplikasi akan diluncurkan dengan ClipData
yang berisi
satu atau beberapa item dengan URI content://
. Aplikasi harus membuat catatan yang
menggunakan gambar terlampir pertama sebagai gambar latar dan dalam mode yang
memungkinkan pengguna menggambar dengan stilus.
Menguji intent pencatatan tanpa stilus
Untuk menguji apakah aplikasi merespons intent pencatatan tanpa mendeteksi stilus aktif dengan benar, gunakan metode berikut untuk menampilkan opsi pencatatan di ChromeOS:
- Alihkan ke mode developer dan buat perangkat agar dapat ditulis
- Tekan Ctrl + Alt + F2 untuk membuka terminal
- Jalankan perintah
sudo vi /etc/chrome_dev.conf
- Tekan
i
untuk mengedit dan menambahkan--ash-enable-palette
ke baris baru di akhir file - Simpan dengan menekan Esc, lalu mengetikkan :, w, q, dan menekan Enter
- Tekan Ctrl + Alt + F1 untuk kembali ke UI ChromeOS reguler
- Logout dan login kembali
Sekarang akan ada menu stilus di rak:
- Ketuk tombol stilus di rak, lalu pilih Catatan baru. Ini akan membuka catatan gambar kosong.
- Ambil screenshot. Dari rak, pilih tombol stilus > Tangkap layar atau download gambar. Akan ada opsi "Anotasi gambar" dalam notifikasi. Tindakan ini akan meluncurkan aplikasi dengan gambar yang siap untuk dianotasi.
Dukungan mouse dan touchpad
Umumnya aplikasi hanya perlu menangani tiga peristiwa besar yang berfokus pada layar: klik kanan, arahkan kursor, serta tarik lalu lepas.
Klik kanan
Tindakan apa pun yang menyebabkan aplikasi menampilkan menu konteks, seperti menyentuh lama pada
item daftar, juga harus menanggapi peristiwa klik kanan. Untuk menangani peristiwa
klik kanan, aplikasi harus mendaftarkan
View.OnContextClickListener
.
Untuk mengetahui detail tentang membuat menu konteks, lihat
Membuat Menu Kontekstual.
Kotlin
yourView.setOnContextClickListener { showContextMenu() true }
Java
yourView.setOnContextClickListener(v -> { showContextMenu(); return true; });
Arahkan kursor
Developer dapat membuat tata letak aplikasinya terasa keren dan lebih mudah digunakan dengan menangani peristiwa pengarahan kursor. Hal ini terutama berlaku untuk tampilan kustom. Dua contoh yang paling umum adalah:
- Menunjukkan kepada pengguna apakah suatu elemen memiliki perilaku interaktif atau tidak, seperti dapat diklik atau dapat diedit, dengan mengubah ikon kursor mouse
- Menambahkan masukan visual ke item dalam daftar atau petak besar jika kursor diarahkan ke atasnya
Kotlin
// Change the icon to a "hand" pointer on hover, // Highlight the view by changing the background. yourView.setOnHoverListener { view, _ -> addVisualHighlighting(true) view.pointerIcon = PointerIcon.getSystemIcon(view.context, PointerIcon.TYPE_HAND) false // listener did not consume the event. }
Java
yourView.setOnHoverListener((view, event) -> { addVisualHighlighting(true); view.setPointerIcon(PointerIcon .getSystemIcon(view.getContext(), PointerIcon.TYPE_HAND)); return true; });
Tarik lalu lepas
Dalam lingkungan multi-aplikasi, pengguna berharap dapat menarik lalu melepas item di antara aplikasi. Hal ini berlaku untuk perangkat desktop serta tablet, ponsel, dan perangkat foldable dalam mode layar terpisah.
Developer sebaiknya mempertimbangkan apakah pengguna cenderung akan menarik item ke aplikasinya atau tidak. Beberapa contoh umum mencakup: editor foto akan menerima foto, pemutar audio akan menerima file audio, dan program menggambar akan menerima foto.
Untuk menambahkan dukungan tarik lalu lepas, ikuti dokumentasi Tarik lalu Lepas Android dan lihat postingan blog ChromeOS ini.
Pertimbangan khusus untuk ChromeOS
- Jangan lupa untuk meminta izin melalui
requestDragAndDropPermissions
untuk mengakses item yang ditarik dari luar aplikasi - Item harus memiliki flag
View.DRAG_FLAG_GLOBAL
agar dapat ditarik ke aplikasi lain
Dukungan pointer lanjutan
Aplikasi yang menangani input mouse dan touchpad tingkat lanjut harus mengikuti
dokumentasi Android untuk
View.onGenericMotionEvent()
dan menggunakan
MotionEvent.getSource()
untuk membedakan antara
SOURCE_MOUSE
dan
SOURCE_TOUCHSCREEN
.
Periksa MotionEvent
untuk menerapkan perilaku yang diperlukan:
- Gerakan menghasilkan peristiwa
ACTION_HOVER_MOVE
. - Tombol menghasilkan peristiwa
ACTION_BUTTON_PRESS
danACTION_BUTTON_RELEASE
. Anda juga dapat memeriksa status saat ini dari semua tombol mouse/trackpad menggunakangetButtonState()
. - Scrolling roda mouse menghasilkan peristiwa
ACTION_SCROLL
.
Pengontrol game
Beberapa perangkat Android layar besar mendukung hingga empat pengontrol game. Developer harus menggunakan API pengontrol game Android standar untuk menanganinya (lihat Mendukung pengontrol game).
Tombol dipetakan ke nilai umum setelah pemetaan umum. Sayangnya, tidak semua produsen pengontrol game mengikuti konvensi pemetaan yang sama. Anda dapat memberikan pengalaman yang jauh lebih baik jika mengizinkan pengguna memilih berbagai pemetaan pengontrol yang populer. Lihat Memproses penekanan tombol gamepad untuk mengetahui informasi selengkapnya.
Mode terjemahan input
ChromeOS mengaktifkan mode terjemahan input secara default. Untuk sebagian besar aplikasi Android, mode ini membantu aplikasi bekerja seperti yang diharapkan di lingkungan desktop. Beberapa contoh termasuk mengaktifkan scrolling dua jari secara otomatis pada touchpad, scrolling roda mouse, dan memetakan koordinat tampilan mentah ke koordinat jendela. Umumnya, developer aplikasi tidak perlu menerapkan perilaku ini sendiri.
Jika aplikasi menerapkan perilaku input kustom, misalnya menentukan tindakan cubit touchpad dengan dua jari kustom, atau terjemahan input ini tidak memberikan peristiwa input yang diharapkan oleh aplikasi, Anda dapat menonaktifkan mode terjemahan input dengan menambahkan tag berikut ke manifes Android:
<uses-feature
android:name="android.hardware.type.pc"
android:required="false" />
Referensi lainnya
Direkomendasikan untuk Anda
- Catatan: teks link ditampilkan saat JavaScript nonaktif
- Meningkatkan dukungan stilus di aplikasi Android
- Editor teks kustom
- Dukungan tablet dan perangkat layar besar