Di perangkat ChromeOS, banyak pengguna yang berinteraksi dengan aplikasi menggunakan keyboard, mouse, trackpad, stilus, atau gamepad. Meskipun perangkat input ini juga digunakan di ponsel Android, perangkat ini tidak terlalu umum dan sering diabaikan oleh developer.
Developer yang ingin aplikasinya berfungsi dengan baik dengan input di ChromeOS, dan perangkat layar besar berkemampuan Android lainnya, harus melihat pengoptimalan berikut:
- Menambahkan dan menguji dukungan keyboard dasar, seperti navigasi keyboard menggunakan tombol panah dan tab, tombol Enter untuk mengonfirmasi entri teks, dan Spasi untuk memutar/menjeda di aplikasi media.
-
Menambahkan pintasan keyboard standar jika memungkinkan, misalnya
ctrl+zuntuk mengurungkan,ctrl+suntuk menyimpan. - Menguji interaksi mouse dasar dengan cara mengklik kanan untuk menu konteks, perubahan ikon saat mengarahkan mouse, dan peristiwa scroll roda mouse/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 menonjol di lingkungan desktop: touchpad sebagai cross fader untuk aplikasi DJ, mouse capture untuk game, dan pintasan keyboard yang ekstensif untuk pengguna super.
Keyboard
Cara aplikasi Anda merespons input keyboard berkontribusi pada pengalaman desktop 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 dengan keyboard. Hal ini juga penting bagi pengguna dengan kebutuhan aksesibilitas di ponsel maupun perangkat desktop.
Untuk banyak aplikasi, hanya tombol panah dan navigasi tab 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. Agar dapat mengaktifkan navigasi keyboard untuk tampilan yang tidak dapat difokuskan secara default, developer harus menandainya sebagai dapat difokuskan. Hal ini dapat dilakukan secara terprogram atau dalam XML, sebagai berikut. Lihat dokumentasi Penanganan Fokus untuk mengetahui informasi selengkapnya.
yourView.isFocusable = 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:
// 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
Sebaiknya Anda mengakses setiap bagian fungsi aplikasi Anda sebelum setiap rilis menggunakan keyboard saja. Tindakan yang paling umum harus dapat diakses tanpa input mouse atau sentuh.
Catatan: 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 ChromeOS 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 peristiwa onKeyUp dan menambahkan perilaku yang diharapkan untuk setiap kode tombol yang diterima, sebagai berikut.
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) } }
Menggunakan onKeyUp akan mencegah aplikasi menerima beberapa peristiwa jika tombol ditahan atau dilepaskan secara perlahan. Game dan aplikasi yang mengharapkan pengguna menekan tombol keyboard dapat mencari peristiwa onKeyDown.
Bergantung pada kebutuhan aplikasi, menimpa onKeyUp untuk seluruh Aktivitas biasanya memberikan perilaku yang diperlukan. Jika perlu, onKeyListener dapat ditambahkan ke tampilan tertentu. Misalnya, aplikasi mungkin hanya mendeteksi tombol Enter di EditText tertentu, bukan Aktivitas, untuk mengimplementasikan fungsi pengiriman hanya ketika pengguna mengetik di kotak chat.
Saat Anda menambahkan dukungan keyboard, ikuti dokumentasi penanganan keyboard Android.
Pintasan
Pintasan umum dengan fungsi tombol ctrl, alt, dan shift diharapkan ada di lingkungan desktop. Jika aplikasi tidak menerapkannya, pengalaman tersebut dapat membuat pengguna merasa kesal dan kecewa. 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 simpan (ctrl+s), urungkan (ctrl+z), dan ulangi (ctrl+shift+z). 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 atau 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.
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) } } }
Anda juga dapat mengimplementasikan pintasan di onKeyUp dengan memeriksa KeyEvent.isCtrlPressed(), KeyEvent.isShiftPressed(), atau KeyEvent.isAltPressed() dengan cara yang sama. 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".
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 } } else -> super.onKeyUp(keyCode, event) } }
Dukungan mouse dan touchpad
ChromeOS secara otomatis menangani sebagian besar peristiwa mouse dan trackpad sehingga berfungsi seperti peristiwa sentuh di ponsel Android. Ini termasuk touchpad/roda mouse yang dapat di-scroll dengan dua jari. Sebagian besar aplikasi umumnya hanya perlu menangani tiga peristiwa yang berfokus pada desktop: Klik kanan, Arahkan kursor, dan Tarik lalu Lepaskan.
Klik kanan
Tindakan apa pun yang menyebabkan aplikasi menampilkan menu konteks, seperti menekan 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 dokumentasi menu konteks Android
yourView.setOnContextClickListener { view -> showContextMenu() true }
Catatan: tampilan apa pun yang telah didaftarkan untuk menu konteks menggunakan Activity.registerForContextMenu() akan otomatis berfungsi dengan menekan lama dan mengklik kanan tanpa perlu mendaftarkan pemroses klik konteks.
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
// 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(applicationContext, PointerIcon.TYPE_HAND) false // listener did not consume the event. }
Tarik lalu Lepas
Dalam lingkungan multi-aplikasi, pengguna berharap dapat menarik lalu melepas item di antara aplikasi. Hal ini berlaku untuk perangkat ChromeOS 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
-
Untuk menangani file dari aplikasi Files ChromeOS, cari jenis MIME
application/x-arc-uri-list -
Jangan lupa untuk meminta izin menggunakan
requestDragAndDropPermissionsuntuk mengakses item yang ditarik dari luar aplikasi -
Item harus memiliki flag
View.DRAG_FLAG_GLOBALagar dapat ditarik ke aplikasi lain
Dukungan pemilihan ganda
Jika aplikasi Anda berisi daftar atau petak, pertimbangkan apakah pengguna Anda akan mendapatkan manfaat dari dukungan untuk pemilihan ganda. Pengalaman pemilihan ganda berkualitas tinggi dengan mouse dan trackpad sering kali mencakup fitur seperti pemilihan rentang. Menerapkan hal ini sendiri bisa jadi sulit, tetapi Anda dapat menggunakan library Seleksi Recyclerview.
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_PRESSdanACTION_BUTTON_RELEASE. Anda juga dapat memeriksa status saat ini dari semua tombol mouse/trackpad menggunakangetButtonState(). -
Scrolling roda mouse menghasilkan peristiwa
ACTION_SCROLL
Stilus
Banyak Chromebook 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 menggunakan View.onTouchEvent() atau View.onGenericMotionEvent(), dan berisi MotionEvent.getSource() jenis SOURCE_STYLUS. MotionEvent juga akan berisi data tambahan:
-
MotionEvent.getToolType()akan menampilkanTOOL_TYPE_FINGER,TOOL_TYPE_STYLUS, atauTOOL_TYPE_ERASERbergantung pada alat yang membuat kontak dengan permukaan -
MotionEvent.getPressure()akan melaporkan tekanan fisik yang diterapkan ke pena stilus, jika didukung -
MotionEvent.getAxisValue()denganMotionEvent.AXIS_TILTdanMotionEvent.AXIS_ORIENTATIONyang 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
ChromeOS mencoba mengenali saat telapak tangan pengguna berada di layar sentuh. Namun, hal ini tidak selalu dapat dilakukan. Terkadang peristiwa sentuh mungkin dilaporkan ke aplikasi sebelum OS mengenalinya sebagai telapak tangan. Dalam hal ini, sentuhan akan dibatalkan dengan melaporkan peristiwa ACTION_CANCEL.
Peristiwa ini memberi tahu aplikasi bahwa sentuhan tertentu tidak valid dan akan mengurungkan semua interaksi yang disebabkan oleh sentuhan tersebut. Misalnya, aplikasi menggambar mungkin menggambar garis baru untuk sementara segera setelah diterima untuk memberikan latensi terendah, tetapi hanya menempatkannya secara permanen ke kanvas setelah rangkaian sentuh selesai dengan rapi. Sementara itu, jika peristiwa sentuh dibatalkan, garis sementara dapat dihapus.
Catatan: Salah satu cara untuk mengurangi peristiwa telapak tangan dan jari yang tidak relevan dalam aplikasi menggambar dan menulis adalah dengan menyediakan setelan UI yang menonaktifkan gambar menggunakan sentuhan, dan hanya menggunakan peristiwa stilus untuk menggambar saat dalam mode ini.
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 catatan:
- Alihkan ke mode developer dan buat perangkat agar dapat ditulis
-
Tekan
ctrl+alt+f2untuk membuka terminal -
Jalankan perintah
sudo vi /etc/chrome_dev.conf -
Tekan
iuntuk mengedit dan menambahkan--ash-enable-paletteke baris baru di akhir file -
Simpan dengan menekan
Esc, lalu mengetik:,w,q, dan menekanEnter -
Tekan
ctrl+alt+f1untuk kembali ke UI ChromeOS reguler
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 kolom, 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.
Pengontrol Game
Chromebook mendukung hingga empat pengontrol game. Developer harus menggunakan API Pengontrol Game Android standar untuk menanganinya.
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.
Mode terjemahan input
ChromeOS mengaktifkan mode terjemahan input secara default. Untuk sebagian besar aplikasi Android, mode ini membantu aplikasi berfungsi seperti yang diharapkan di lingkungan desktop. Beberapa contohnya 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 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 Android manifes:
<uses-feature android:name="android.hardware.type.pc" android:required="false" />