Android mendukung berbagai layar sentuh dan touchpad, termasuk tablet digitizer berbasis stilus.
Layar sentuh adalah perangkat sentuh yang terkait dengan layar sehingga pengguna memiliki kesan memanipulasi item di layar secara langsung.
Touch pad adalah perangkat sentuh yang tidak terkait dengan layar, seperti tablet digitizer. {i>Touch pad<i} biasanya digunakan untuk menunjuk atau untuk pemosisian tidak langsung absolut atau kontrol berbasis gestur dari antarmuka pengguna.
Perangkat sentuh dapat memiliki tombol yang fungsinya mirip dengan tombol mouse.
Perangkat sentuh terkadang dapat dimanipulasi menggunakan berbagai alat yang berbeda, seperti jari atau stilus, bergantung pada teknologi sensor sentuh yang mendasarinya.
Perangkat sentuh terkadang digunakan untuk menerapkan tombol virtual. Misalnya, di beberapa perangkat Android, area sensor layar sentuh meluas melampaui tepi layar dan berfungsi ganda sebagai bagian dari keypad yang sensitif terhadap sentuhan.
Karena banyaknya variasi perangkat sentuh, Android mengandalkan sejumlah besar properti konfigurasi untuk mendeskripsikan karakteristik dan perilaku yang diinginkan dari setiap perangkat.
Klasifikasi perangkat sentuh
Perangkat input diklasifikasikan sebagai perangkat multi-sentuh jika kedua kondisi berikut terpenuhi:
- Perangkat input melaporkan keberadaan sumbu absolut
ABS_MT_POSITION_XdanABS_MT_POSITION_Y. - Perangkat input tidak memiliki tombol gamepad. Kondisi ini menyelesaikan ambiguitas dengan gamepad tertentu yang melaporkan sumbu dengan kode yang tumpang-tindih dengan sumbu MT.
Perangkat input diklasifikasikan sebagai perangkat sekali sentuh jika kedua kondisi berikut terpenuhi:
- Perangkat input tidak diklasifikasikan sebagai perangkat multi-sentuh. Perangkat input diklasifikasikan sebagai perangkat single-touch atau sebagai perangkat multi-touch, tidak pernah keduanya.
- Perangkat input melaporkan keberadaan sumbu absolut
ABS_XdanABS_Y, serta keberadaan kode tombolBTN_TOUCH.
Saat perangkat input diklasifikasikan sebagai perangkat sentuh, keberadaan tombol virtual ditentukan dengan mencoba memuat file peta tombol virtual untuk perangkat tersebut. Jika peta tombol virtual tersedia, file tata letak tombol untuk perangkat juga akan dimuat. Lihat [File peta tombol virtual](#virtual-key-map-files) untuk mengetahui informasi tentang lokasi dan format file ini.
Selanjutnya, sistem akan memuat file konfigurasi perangkat input untuk perangkat sentuh.
Semua perangkat sentuh bawaan harus memiliki file konfigurasi perangkat input. Jika tidak ada file konfigurasi perangkat input, sistem akan memilih konfigurasi default yang sesuai untuk periferal sentuh tujuan umum seperti layar sentuh atau touchpad HID USB atau Bluetooth eksternal. Setelan default ini tidak dirancang untuk layar sentuh bawaan dan dapat menyebabkan perilaku yang salah.
Setelah konfigurasi perangkat input dimuat, sistem akan mengklasifikasikan perangkat input sebagai perangkat layar sentuh, touch pad, atau pointer.
- Perangkat layar sentuh digunakan untuk manipulasi langsung objek di layar. Pengguna menyentuh layar secara langsung, sehingga sistem tidak memerlukan affordance tambahan untuk menunjukkan objek yang dimanipulasi.
- Perangkat touch pad digunakan untuk memberikan informasi pemosisian absolut kepada aplikasi tentang sentuhan pada area sensor tertentu. Ini dapat berguna untuk tablet digitizer.
- Perangkat penunjuk digunakan untuk manipulasi tidak langsung objek di layar menggunakan kursor. Jari ditafsirkan sebagai gestur pointer multi-kontrol. Alat lain, seperti stilus, ditafsirkan menggunakan posisi absolut. Lihat Gestur pointer multi-kontrol tidak langsung untuk mengetahui informasi selengkapnya.
Aturan berikut digunakan untuk mengklasifikasikan perangkat input sebagai layar sentuh, touchpad, atau perangkat penunjuk.
- Jika properti
touch.deviceTypeditetapkan, jenis perangkat akan ditetapkan seperti yang ditunjukkan. - Jika perangkat input melaporkan keberadaan properti input
INPUT_PROP_DIRECT(melalui ioctlEVIOCGPROP), jenis perangkat akan ditetapkan ke layar sentuh. Kondisi ini mengasumsikan bahwa perangkat sentuh input langsung terpasang ke layar yang juga terhubung. - Jika perangkat input melaporkan keberadaan properti input
INPUT_PROP_POINTER(melalui ioctlEVIOCGPROP), jenis perangkat akan ditetapkan ke pointer. - Jika perangkat input melaporkan keberadaan sumbu relatif
REL_XatauREL_Y, jenis perangkat akan ditetapkan ke touch pad. Kondisi ini menyelesaikan ambiguitas untuk perangkat input yang terdiri dari mouse dan touchpad. Dalam hal ini, {i>touch pad<i} tidak digunakan untuk mengontrol penunjuk karena mouse sudah mengontrolnya. - Jika tidak, jenis perangkat akan ditetapkan ke pointer. Setelan default ini memastikan bahwa touch pad yang belum ditetapkan untuk tujuan khusus lainnya mengontrol pointer.
Tombol
Tombol adalah kontrol opsional yang dapat digunakan aplikasi untuk menjalankan fungsi tambahan. Tombol pada perangkat sentuh berperilaku mirip dengan tombol mouse dan terutama digunakan dengan perangkat sentuh jenis pointer atau dengan stilus.
Tombol berikut didukung:
BTN_LEFT: Dipetakan keMotionEvent.BUTTON_PRIMARY.BTN_RIGHT: Dipetakan keMotionEvent.BUTTON_SECONDARY.BTN_MIDDLE: Dipetakan keMotionEvent.BUTTON_MIDDLE.BTN_BACKdanBTN_SIDE: Dipetakan keMotionEvent.BUTTON_BACK. Menekan tombol ini juga akan menyintesis penekanan tombol dengan kode tombolKeyEvent.KEYCODE_BACK.BTN_FORWARDdanBTN_EXTRA: Dipetakan keMotionEvent.BUTTON_FORWARD. Menekan tombol ini juga akan menyintesis penekanan tombol dengan kode tombolKeyEvent.KEYCODE_FORWARD.BTN_STYLUS: Dipetakan keMotionEvent.BUTTON_SECONDARY.BTN_STYLUS2: Dipetakan keMotionEvent.BUTTON_TERTIARY.
Alat dan jenis alat
Alat adalah jari, stilus, atau peralatan lain yang digunakan untuk berinteraksi dengan perangkat sentuh. Beberapa perangkat sentuh dapat membedakan berbagai jenis alat.
Di tempat lain di Android, seperti di MotionEvent API, alat sering disebut
sebagai pointer.
Jenis alat berikut didukung:
BTN_TOOL_FINGERdanMT_TOOL_FINGER: Dipetakan keMotionEvent.TOOL_TYPE_FINGER.BTN_TOOL_PENdanMT_TOOL_PEN: Dipetakan keMotionEvent.TOOL_TYPE_STYLUS.BTN_TOOL_RUBBER: Dipetakan keMotionEvent.TOOL_TYPE_ERASER.BTN_TOOL_BRUSH: Dipetakan keMotionEvent.TOOL_TYPE_STYLUS.BTN_TOOL_PENCIL: Dipetakan keMotionEvent.TOOL_TYPE_STYLUS.BTN_TOOL_AIRBRUSH: Dipetakan keMotionEvent.TOOL_TYPE_STYLUS.BTN_TOOL_MOUSE: Dipetakan keMotionEvent.TOOL_TYPE_MOUSE.BTN_TOOL_LENS: Dipetakan keMotionEvent.TOOL_TYPE_MOUSE.BTN_TOOL_DOUBLETAP,BTN_TOOL_TRIPLETAP, danBTN_TOOL_QUADTAP: Dipetakan keMotionEvent.TOOL_TYPE_FINGER.
Alat mengarahkan kursor versus menyentuh
Alat dapat bersentuhan dengan perangkat sentuh atau berada dalam jangkauan dan mengambang di atasnya. Tidak semua perangkat sentuh dapat mendeteksi keberadaan alat yang mengarah di atas perangkat sentuh. Perangkat yang mendukungnya, seperti digitizer stilus berbasis RF, sering kali dapat mendeteksi saat alat berada dalam rentang terbatas digitizer.
Komponen InputReader membedakan alat sentuh dari alat pengarahan kursor. Demikian pula, alat sentuh dan alat pengarahan kursor dilaporkan ke aplikasi
dengan cara yang berbeda.
Alat sentuh dilaporkan ke aplikasi sebagai peristiwa sentuh
menggunakan MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE,
MotionEvent.ACTION_DOWN,
MotionEvent.ACTION_POINTER_DOWN, dan MotionEvent.ACTION_POINTER_UP.
Alat pengarahan kursor dilaporkan ke aplikasi sebagai peristiwa gerakan umum menggunakan
MotionEvent.ACTION_HOVER_ENTER, MotionEvent.ACTION_HOVER_MOVE,
dan MotionEvent.ACTION_HOVER_EXIT.
Persyaratan driver perangkat sentuh
- Driver perangkat sentuh hanya boleh mendaftarkan sumbu dan kode tombol untuk sumbu
dan tombol yang didukungnya. Mendaftarkan sumbu atau kode tombol yang tidak didukung
dapat membingungkan algoritma klasifikasi perangkat atau menyebabkan sistem salah
mendeteksi kemampuan perangkat. Misalnya, jika perangkat melaporkan
kode tombol
BTN_TOUCH, sistem akan mengasumsikan bahwaBTN_TOUCHselalu digunakan untuk menunjukkan apakah alat menyentuh layar. Oleh karena itu,BTN_TOUCHtidak boleh digunakan untuk menunjukkan bahwa alat hanya berada dalam jangkauan dan mengarah ke atas. - Perangkat satu sentuhan menggunakan peristiwa input Linux berikut:
ABS_X: (WAJIB) Melaporkan koordinat X alat.ABS_Y: (WAJIB) Melaporkan koordinat Y alat.ABS_PRESSURE: (opsional) Melaporkan tekanan fisik yang diterapkan ke ujung alat atau kekuatan sinyal kontak sentuh.ABS_TOOL_WIDTH: (opsional) Melaporkan luas penampang atau lebar kontak sentuh atau alat itu sendiri.ABS_DISTANCE: (opsional) Melaporkan jarak alat dari permukaan perangkat sentuh.ABS_TILT_X: (opsional) Melaporkan kemiringan alat dari permukaan perangkat sentuh di sepanjang sumbu X.ABS_TILT_Y: (opsional) Melaporkan kemiringan alat dari permukaan perangkat sentuh di sepanjang sumbu Y.BTN_TOUCH: (WAJIB) Menunjukkan apakah alat menyentuh perangkat.BTN_LEFT,BTN_RIGHT,BTN_MIDDLE,BTN_BACK,BTN_SIDE,BTN_FORWARD,BTN_EXTRA,BTN_STYLUS,BTN_STYLUS2: (opsional) Melaporkan status tombol.BTN_TOOL_FINGER,BTN_TOOL_PEN,BTN_TOOL_RUBBER,BTN_TOOL_BRUSH,BTN_TOOL_PENCIL,BTN_TOOL_AIRBRUSH,BTN_TOOL_MOUSE,BTN_TOOL_LENS,BTN_TOOL_DOUBLETAP,BTN_TOOL_TRIPLETAP,BTN_TOOL_QUADTAP: (opsional) Melaporkan jenis alat.
- Perangkat multi-sentuh menggunakan peristiwa input Linux berikut:
ABS_MT_POSITION_X: (WAJIB) Melaporkan koordinat X alat.ABS_MT_POSITION_Y: (WAJIB) Melaporkan koordinat Y alat.ABS_MT_PRESSURE: (opsional) Melaporkan tekanan fisik yang diterapkan ke ujung alat atau kekuatan sinyal kontak sentuh.ABS_MT_TOUCH_MAJOR: (opsional) Melaporkan luas penampang kontak sentuh, atau panjang dimensi kontak sentuh yang lebih panjang.ABS_MT_TOUCH_MINOR: (opsional) Melaporkan panjang dimensi yang lebih pendek dari kontak sentuh. Sumbu ini tidak boleh digunakan jikaABS_MT_TOUCH_MAJORmelaporkan pengukuran area.ABS_MT_WIDTH_MAJOR: (opsional) Melaporkan luas penampang alat itu sendiri, atau panjang dimensi alat yang lebih panjang. Jangan gunakan sumbu ini kecuali jika Anda mengetahui dimensi alat itu sendiri.ABS_MT_WIDTH_MINOR: (opsional) Melaporkan panjang dimensi yang lebih pendek dari alat itu sendiri. Sumbu ini tidak boleh digunakan jikaABS_MT_WIDTH_MAJORmelaporkan pengukuran area atau jika dimensi alat itu sendiri tidak diketahui.ABS_MT_ORIENTATION: (opsional) Melaporkan orientasi alat.ABS_MT_DISTANCE: (opsional) Melaporkan jarak alat dari permukaan perangkat sentuh.ABS_MT_TOOL_TYPE: (opsional) Melaporkan jenis alat sebagaiMT_TOOL_FINGERatauMT_TOOL_PEN.ABS_MT_TRACKING_ID: (opsional) Melaporkan ID pelacakan alat. ID pelacakan adalah bilangan bulat non-negatif arbitrer yang digunakan untuk mengidentifikasi dan melacak setiap alat secara independen saat beberapa alat aktif. Misalnya, saat beberapa jari menyentuh perangkat, setiap jari harus diberi ID pelacakan berbeda yang digunakan selama jari tetap bersentuhan. ID pelacakan dapat digunakan kembali saat alat terkaitnya berada di luar jangkauan.ABS_MT_SLOT: (opsional) Melaporkan ID slot alat, saat menggunakan protokol multi-sentuh Linux 'B'. Lihat dokumentasi protokol multi-sentuh Linux untuk mengetahui detail selengkapnya.BTN_TOUCH: (WAJIB) Menunjukkan apakah alat menyentuh perangkat.BTN_LEFT,BTN_RIGHT,BTN_MIDDLE,BTN_BACK,BTN_SIDE,BTN_FORWARD,BTN_EXTRA,BTN_STYLUS,BTN_STYLUS2: (opsional) Melaporkan status tombol.BTN_TOOL_FINGER,BTN_TOOL_PEN,BTN_TOOL_RUBBER,BTN_TOOL_BRUSH,BTN_TOOL_PENCIL,BTN_TOOL_AIRBRUSH,BTN_TOOL_MOUSE,BTN_TOOL_LENS,BTN_TOOL_DOUBLETAP,BTN_TOOL_TRIPLETAP,BTN_TOOL_QUADTAP: (opsional) Melaporkan jenis alat.
- Jika sumbu untuk protokol sekali sentuh dan multi-sentuh ditentukan, hanya sumbu multi-sentuh yang digunakan dan sumbu sekali sentuh akan diabaikan.
Nilai minimum dan maksimum sumbu
ABS_X,ABS_Y,ABS_MT_POSITION_X, danABS_MT_POSITION_Ymenentukan batas area aktif perangkat dalam unit platform khusus perangkat. Dalam kasus layar sentuh, area aktif menjelaskan bagian perangkat sentuh yang benar-benar menutupi layar.Untuk layar sentuh, sistem otomatis menginterpolasi posisi sentuh yang dilaporkan dalam unit permukaan untuk mendapatkan posisi sentuh dalam piksel layar sesuai dengan penghitungan berikut:
displayX = (x - minX) * displayWidth / (maxX - minX + 1) displayY = (y - minY) * displayHeight / (maxY - minY + 1)Layar sentuh mungkin melaporkan sentuhan di luar area aktif yang dilaporkan.
Sentuhan yang dimulai di luar area aktif tidak dikirimkan ke aplikasi, tetapi dapat digunakan untuk tombol virtual.
Sentuhan yang dimulai di dalam area aktif, atau yang masuk dan keluar dari area tampilan akan dikirim ke aplikasi. Akibatnya, jika sentuhan dimulai dalam batas aplikasi, lalu berpindah ke luar area aktif, aplikasi mungkin menerima peristiwa sentuh dengan koordinat tampilan yang negatif atau di luar batas tampilan. Ini adalah perilaku yang diharapkan.
Perangkat sentuh tidak boleh menjepit koordinat sentuh ke batas area aktif. Jika sentuhan keluar dari area aktif, sentuhan tersebut harus dilaporkan sebagai berada di luar area aktif, atau tidak boleh dilaporkan sama sekali.
Misalnya, jika jari pengguna menyentuh di dekat sudut kiri atas layar sentuh, koordinat (minX, minY) mungkin akan dilaporkan. Jika jari terus bergerak lebih jauh ke luar area aktif, layar sentuh harus mulai melaporkan koordinat dengan komponen yang lebih kecil dari minX dan minY, seperti (minX - 2, minY - 3), atau harus berhenti melaporkan sentuhan sama sekali. Dengan kata lain, layar sentuh tidak boleh melaporkan (minX, minY) saat jari pengguna benar-benar menyentuh di luar area aktif.
Menjepit koordinat sentuh ke tepi layar akan menciptakan batas keras buatan di sekitar tepi layar yang mencegah sistem melacak gerakan yang masuk atau keluar dari batas area tampilan dengan lancar.
Nilai yang dilaporkan oleh
ABS_PRESSUREatauABS_MT_PRESSURE, jika dilaporkan, harus bukan nol saat alat menyentuh perangkat dan nol jika tidak, untuk menunjukkan bahwa alat mengambang.Melaporkan informasi tekanan bersifat opsional, tetapi sangat direkomendasikan. Aplikasi dapat menggunakan informasi tekanan untuk menerapkan gambar yang sensitif terhadap tekanan dan efek lainnya.
Nilai yang dilaporkan oleh
ABS_TOOL_WIDTH,ABS_MT_TOUCH_MAJOR,ABS_MT_TOUCH_MINOR,ABS_MT_WIDTH_MAJOR, atauABS_MT_WIDTH_MINORtidak boleh nol saat alat menyentuh perangkat dan nol jika tidak, tetapi hal ini tidak wajib. Misalnya, perangkat sentuh mungkin dapat mengukur ukuran kontak sentuhan jari, tetapi tidak kontak sentuhan stilus.Melaporkan informasi ukuran bersifat opsional, tetapi sangat direkomendasikan. Aplikasi dapat menggunakan informasi tekanan untuk menerapkan gambar yang sensitif terhadap ukuran dan efek lainnya.
Nilai yang dilaporkan oleh
ABS_DISTANCEatauABS_MT_DISTANCEharus mendekati nol saat alat menyentuh perangkat. Jarak dapat tetap bukan nol meskipun alat bersentuhan langsung. Nilai pasti yang dilaporkan bergantung pada cara hardware mengukur jarak.Melaporkan informasi jarak bersifat opsional, tetapi direkomendasikan untuk perangkat stilus.
Nilai yang dilaporkan oleh
ABS_TILT_XdanABS_TILT_Yharus nol saat alat tegak lurus dengan perangkat. Kemiringan bukan nol menunjukkan bahwa alat dipegang pada posisi miring.Sudut kemiringan di sepanjang sumbu X dan Y diasumsikan ditentukan dalam derajat dari tegak lurus. Titik tengah (tegak lurus sempurna) diberikan oleh
(max + min) / 2untuk setiap sumbu. Nilai yang lebih kecil dari titik tengah mewakili kemiringan ke atas atau ke kiri, nilai yang lebih besar dari titik tengah mewakili kemiringan ke bawah atau ke kanan.InputReadermengonversi komponen kemiringan X dan Y menjadi sudut kemiringan tegak lurus mulai dari 0 hinggaPI / 2radian dan sudut orientasi planar mulai dari-PIhinggaPIradian. Representasi ini menghasilkan deskripsi orientasi yang kompatibel dengan yang digunakan untuk mendeskripsikan sentuhan jari.Melaporkan informasi kemiringan bersifat opsional, tetapi direkomendasikan untuk perangkat stilus.
Jika jenis alat dilaporkan oleh
ABS_MT_TOOL_TYPE, jenis alat tersebut akan menggantikan informasi jenis alat yang dilaporkan olehBTN_TOOL_*. Jika tidak ada informasi jenis alat sama sekali, jenis alat akan ditetapkan secara default keMotionEvent.TOOL_TYPE_FINGER.Alat ditentukan sebagai aktif berdasarkan kondisi berikut:
Saat menggunakan protokol sekali sentuh, alat akan aktif jika
BTN_TOUCH, atauBTN_TOOL_*bernilai 1.Kondisi ini menyiratkan bahwa
InputReaderharus memiliki setidaknya beberapa informasi tentang sifat alat, baik apakah alat tersebut menyentuh, atau setidaknya jenis alatnya. Jika tidak ada informasi yang tersedia, alat tersebut dianggap tidak aktif (di luar jangkauan).- Saat menggunakan protokol multi-sentuh 'A', alat akan aktif setiap kali muncul dalam laporan sinkronisasi terbaru. Jika alat berhenti muncul dalam laporan sinkronisasi, alat tersebut tidak akan ada lagi.
- Saat menggunakan protokol multi-sentuh 'B', alat akan aktif selama memiliki slot aktif. Saat slot dikosongkan, alat akan berhenti ada.
- Alat ditentukan melayang berdasarkan kondisi berikut:
- Jika alatnya adalah
BTN_TOOL_MOUSEatauBTN_TOOL_LENS, alat tersebut tidak mengarahkan kursor, meskipun salah satu kondisi berikut terpenuhi. - Jika alat aktif dan driver melaporkan informasi tekanan, dan tekanan yang dilaporkan adalah nol, berarti alat sedang mengambang.
- Jika alat aktif dan driver mendukung kode tombol
BTN_TOUCHdanBTN_TOUCHmemiliki nilai nol, berarti alat sedang mengarahkan kursor.
- Jika alatnya adalah
InputReadermendukung protokol multi-sentuh 'A' dan 'B'. Driver baru harus menggunakan protokol 'B', tetapi keduanya berfungsi.Mulai Android 4.0, driver layar sentuh mungkin perlu diubah agar sesuai dengan spesifikasi protokol input Linux.
Perubahan berikut mungkin diperlukan:
Jika alat menjadi tidak aktif (jari "diangkat"), alat tersebut akan berhenti muncul dalam laporan sinkronisasi multi-sentuh berikutnya. Saat semua alat menjadi tidak aktif (semua jari "diangkat"), driver harus mengirim paket laporan sinkronisasi kosong, seperti
SYN_MT_REPORTdiikuti denganSYN_REPORT.Versi Android sebelumnya mengharapkan peristiwa "up" dilaporkan dengan mengirimkan nilai tekanan 0. Perilaku lama tidak kompatibel dengan spesifikasi protokol input Linux dan tidak lagi didukung.
Informasi tekanan fisik atau kekuatan sinyal harus dilaporkan menggunakan
ABS_MT_PRESSURE.Android versi sebelumnya mengambil informasi tekanan dari
ABS_MT_TOUCH_MAJOR. Perilaku lama tidak kompatibel dengan spesifikasi protokol input Linux dan tidak lagi didukung.- Informasi ukuran sentuh harus dilaporkan menggunakan
ABS_MT_TOUCH_MAJOR.Android versi sebelumnya mengambil informasi ukuran dari
ABS_MT_TOOL_MAJOR. Perilaku lama tidak kompatibel dengan spesifikasi protokol input Linux dan tidak lagi didukung.
Pengoperasian perangkat sentuh
Berikut adalah ringkasan singkat pengoperasian perangkat sentuh di Android.
EventHubmembaca peristiwa mentah dari driverevdev.InputReadermenggunakan peristiwa mentah dan memperbarui status internal tentang posisi dan karakteristik lain dari setiap alat. Class ini juga melacak status tombol.- Jika BACK atau FORWARD ditekan atau dilepaskan,
InputReaderakan memberi tahuInputDispatchertentang peristiwa tombol. InputReadermenentukan apakah penekanan tombol virtual terjadi. Jika ya,InputDispatcherakan diberi tahu tentang peristiwa utama.InputReadermenentukan apakah sentuhan dimulai dalam batas tampilan. Jika ya, tampilan akan memberi tahuInputDispatchertentang peristiwa sentuh.- Jika tidak ada alat yang menyentuh, tetapi ada setidaknya satu alat yang mengarahkan kursor,
InputReaderakan memberi tahuInputDispatchertentang peristiwa pengarahan kursor. - Jika jenis perangkat sentuh adalah pointer,
InputReaderakan melakukan deteksi gestur pointer, memindahkan pointer dan titik yang sesuai, serta memberi tahuInputDispatchertentang peristiwa pointer. InputDispatchermenggunakanWindowManagerPolicyuntuk menentukan apakah peristiwa harus dikirim dan apakah peristiwa harus mengaktifkan perangkat. Kemudian,InputDispatcherakan mengirimkan peristiwa ke aplikasi yang sesuai.
Konfigurasi perangkat sentuh
Perilaku perangkat sentuh ditentukan oleh sumbu, tombol, properti input, konfigurasi perangkat input, peta tombol virtual, dan tata letak tombol perangkat.
Lihat bagian berikut untuk mengetahui detail selengkapnya tentang file yang berpartisipasi dalam konfigurasi keyboard:
Properti
Sistem mengandalkan banyak properti konfigurasi perangkat input untuk mengonfigurasi dan mengkalibrasi perilaku perangkat sentuh.
Salah satu alasannya adalah driver perangkat untuk perangkat sentuh sering kali melaporkan karakteristik sentuhan menggunakan unit khusus perangkat.
Misalnya, banyak perangkat sentuh mengukur area kontak sentuh menggunakan skala internal khusus perangkat, seperti jumlah total node sensor yang dipicu oleh sentuhan. Nilai ukuran mentah ini tidak akan berarti bagi aplikasi karena aplikasi perlu mengetahui ukuran fisik dan karakteristik lain dari node sensor perangkat sentuh.
Sistem menggunakan parameter kalibrasi yang dienkode dalam file konfigurasi perangkat input untuk mendekode, mengubah, dan menormalisasi nilai yang dilaporkan oleh perangkat sentuh menjadi representasi standar yang lebih sederhana yang dapat dipahami aplikasi.
Konvensi dokumentasi
Untuk tujuan dokumentasi, kami menggunakan konvensi berikut untuk menjelaskan nilai yang digunakan oleh sistem selama proses kalibrasi.
Nilai sumbu mentah
Ekspresi berikut menunjukkan nilai mentah yang dilaporkan oleh driver perangkat sentuh sebagai peristiwa EV_ABS.
raw.x- Nilai sumbu
ABS_XatauABS_MT_POSITION_X. raw.y- Nilai sumbu
ABS_YatauABS_MT_POSITION_Y. raw.pressure- Nilai sumbu
ABS_PRESSUREatauABS_MT_PRESSURE, atau 0 jika tidak tersedia. raw.touchMajor- Nilai sumbu
ABS_MT_TOUCH_MAJOR, atau 0 jika tidak tersedia. raw.touchMinor- Nilai sumbu
ABS_MT_TOUCH_MINOR, atauraw.touchMajorjika tidak tersedia. raw.toolMajor- Nilai sumbu
ABS_TOOL_WIDTHatauABS_MT_WIDTH_MAJOR, atau 0 jika tidak tersedia. raw.toolMinor- Nilai sumbu
ABS_MT_WIDTH_MINOR, atauraw.toolMajorjika tidak tersedia. raw.orientation- Nilai sumbu
ABS_MT_ORIENTATION, atau 0 jika tidak tersedia. raw.distance- Nilai sumbu
ABS_DISTANCEatauABS_MT_DISTANCE, atau 0 jika tidak tersedia. raw.tiltX- Nilai sumbu
ABS_TILT_X, atau 0 jika tidak tersedia. raw.tiltY- Nilai sumbu
ABS_TILT_Y, atau 0 jika tidak tersedia.
Rentang sumbu mentah
Ekspresi berikut menunjukkan batas nilai mentah. Nilai ini diperoleh
dengan memanggil ioctl EVIOCGABS untuk setiap sumbu.
raw.*.min- Nilai minimum inklusif sumbu mentah.
raw.*.max- Nilai maksimum inklusif sumbu mentah.
raw.*.range- Setara dengan
raw.*.max - raw.*.min. raw.*.fuzz- Akurasi sumbu mentah. Misalnya, fuzz = 1 berarti nilai akurat hingga +/- 1 unit.
raw.width- Lebar inklusif area sentuh, setara dengan
raw.x.range + 1. raw.height- Tinggi inklusif area sentuh, setara dengan
raw.y.range + 1.
Rentang output
Ekspresi berikut menunjukkan karakteristik sistem koordinat output. Sistem menggunakan interpolasi linear untuk menerjemahkan informasi posisi sentuh dari unit permukaan yang digunakan oleh perangkat sentuh ke unit output yang dilaporkan ke aplikasi seperti piksel layar.
output.width- Lebar output. Untuk layar sentuh (yang terkait dengan layar), ini
adalah lebar layar dalam piksel. Untuk touch pad (tidak terkait dengan layar),
lebar output sama dengan
raw.width, yang menunjukkan bahwa tidak ada interpolasi yang dilakukan. output.height- Tinggi output. Untuk layar sentuh (yang terkait dengan layar), ini
adalah tinggi layar dalam piksel. Untuk touch pad (tidak terkait dengan layar),
tinggi output sama dengan
raw.height, yang menunjukkan bahwa tidak ada interpolasi yang dilakukan. output.diag- Panjang diagonal sistem koordinat output, setara dengan
sqrt(output.width ^2 + output.height ^2).
Konfigurasi dasar
Pemeta input sentuh menggunakan banyak properti konfigurasi dalam file konfigurasi perangkat input untuk menentukan nilai kalibrasi. Tabel berikut menjelaskan beberapa properti konfigurasi tujuan umum. Semua properti lainnya dijelaskan di bagian berikut beserta kolom yang digunakan untuk mengkalibrasinya.
touch.deviceType
Definisi: touch.deviceType = touchScreen |
touchPad | pointer | default
Menentukan jenis perangkat sentuh.
-
Jika nilainya adalah
touchScreen, perangkat sentuh adalah layar sentuh yang terkait dengan layar. -
Jika nilainya adalah
touchPad, perangkat sentuh adalah touch pad yang tidak terkait dengan layar. -
Jika nilainya
pointer, perangkat sentuh adalah touch pad yang tidak terkait dengan layar, dan gerakannya digunakan untuk gestur pointer multi-sentuh tidak langsung. -
Jika nilainya adalah
default, sistem akan otomatis mendeteksi jenis perangkat sesuai dengan algoritma klasifikasi.
Lihat bagian Klasifikasi untuk mengetahui detail selengkapnya tentang pengaruh jenis perangkat terhadap perilaku perangkat sentuh.
Di Android 3 dan yang lebih rendah, semua perangkat sentuh diasumsikan sebagai layar sentuh.
touch.orientationAware
Definisi: touch.orientationAware = 0 | 1
Menentukan apakah perangkat sentuh harus bereaksi terhadap perubahan orientasi layar.
-
Jika nilainya adalah
1, posisi sentuh yang dilaporkan oleh perangkat sentuh akan diputar setiap kali orientasi layar berubah. -
Jika nilainya adalah
0, posisi sentuh yang dilaporkan oleh perangkat sentuh tidak akan terpengaruh oleh perubahan orientasi layar.
Nilai defaultnya adalah 1 jika perangkat adalah layar sentuh, 0
jika tidak.
Sistem membedakan antara layar sentuh dan layar internal dan eksternal. Layar sentuh internal yang peka orientasi diputar berdasarkan orientasi layar internal. Layar sentuh eksternal yang mendukung orientasi diputar berdasarkan orientasi layar eksternal.
Kesadaran orientasi digunakan untuk mendukung rotasi layar sentuh pada perangkat seperti Nexus One. Misalnya, saat perangkat diputar searah jarum jam 90 derajat dari orientasi alaminya, posisi absolut sentuhan akan dipetakan ulang sehingga sentuhan di sudut kiri atas sistem koordinat absolut layar sentuh dilaporkan sebagai sentuhan di sudut kiri atas sistem koordinat layar yang diputar. Hal ini dilakukan agar sentuhan dilaporkan dengan sistem koordinat yang sama dengan yang digunakan aplikasi untuk menggambar elemen visualnya.
Sebelum Honeycomb, semua perangkat sentuh diasumsikan memiliki orientasi.
touch.gestureMode
Definisi: touch.gestureMode = pointer | spots |
default
Menentukan mode presentasi untuk gestur pointer. Properti konfigurasi ini hanya relevan jika perangkat sentuh berjenis pointer.
-
Jika nilainya adalah
pointer, gestur touchpad akan ditampilkan melalui kursor yang mirip dengan kursor mouse. -
Jika nilainya adalah
spots, gestur touchpad ditampilkan oleh anchor yang mewakili sentroid gestur dan sekumpulan titik melingkar yang mewakili posisi setiap jari.
Nilai defaultnya adalah pointer jika properti input INPUT_PROP_SEMI_MT
ditetapkan, atau spots jika tidak.
Kolom X dan Y
Kolom X dan Y memberikan informasi posisi untuk pusat area kontak.
Penghitungan
Penghitungannya mudah: informasi posisi dari driver sentuh diinterpolasi secara linear ke sistem koordinat output.
xScale = output.width / raw.width
yScale = output.height / raw.height
If not orientation aware or screen rotation is 0 degrees:
output.x = (raw.x - raw.x.min) * xScale
output.y = (raw.y - raw.y.min) * yScale
Else If rotation is 90 degrees:
output.x = (raw.y - raw.y.min) * yScale
output.y = (raw.x.max - raw.x) * xScale
Else If rotation is 180 degrees:
output.x = (raw.x.max - raw.x) * xScale
output.y = (raw.y.max - raw.y) * yScale
Else If rotation is 270 degrees:
output.x = (raw.y.max - raw.y) * yScale
output.y = (raw.x - raw.x.min) * xScale
End If
kolom touchMajor, touchMinor, toolMajor, toolMinor, size
Kolom touchMajor dan touchMinor menjelaskan perkiraan dimensi
area kontak dalam unit output (piksel).
Kolom toolMajor dan toolMinor menjelaskan perkiraan dimensi
alat itu sendiri dalam unit output (piksel).
Kolom size menjelaskan ukuran sentuhan yang dinormalisasi relatif terhadap
sentuhan terbesar yang dapat dideteksi oleh perangkat sentuh. Ukuran terkecil
yang dinormalisasi adalah 0,0 (tidak ada kontak, atau tidak dapat diukur), dan ukuran terbesar
yang dinormalisasi adalah 1,0 (area sensor jenuh).
Jika perkiraan panjang dan lebar dapat diukur, kolom touchMajor menentukan dimensi yang lebih panjang dan kolom touchMinor menentukan dimensi yang lebih pendek dari area kontak. Jika hanya perkiraan diameter area kontak yang dapat diukur,
kolom touchMajor dan touchMinor akan sama.
Demikian pula, kolom toolMajor menentukan dimensi yang lebih panjang dan kolom
toolMinor
menentukan dimensi yang lebih pendek dari area penampang alat.
Jika ukuran sentuh tidak tersedia, tetapi ukuran alat tersedia, ukuran alat akan ditetapkan sama dengan ukuran sentuh. Sebaliknya, jika ukuran alat tidak tersedia, tetapi ukuran sentuh tersedia, ukuran sentuh akan ditetapkan sama dengan ukuran alat.
Perangkat sentuh mengukur atau melaporkan ukuran sentuh dan ukuran alat dengan berbagai cara. Implementasi saat ini mendukung tiga jenis pengukuran yang berbeda: diameter, area, dan kotak pembatas geometris dalam unit permukaan.
<touch.size.calibration< h4=""></touch.size.calibration<>
Definition: touch.size.calibration = none |
geometric | diameter
| area | default
Menentukan jenis pengukuran yang digunakan oleh driver sentuh untuk melaporkan ukuran sentuh dan ukuran alat.
-
Jika nilainya adalah
none, ukurannya akan ditetapkan ke nol. -
Jika nilainya adalah
geometric, ukuran diasumsikan ditentukan dalam unit permukaan yang sama dengan posisi, sehingga diskalakan dengan cara yang sama. -
Jika nilainya adalah
diameter, ukuran diasumsikan sebanding dengan diameter (lebar) sentuhan atau alat. -
Jika nilainya adalah
area, ukuran diasumsikan sebanding dengan area sentuh atau alat. -
Jika nilainya adalah
default, sistem akan menggunakan kalibrasigeometricjika sumburaw.touchMajoratauraw.toolMajortersedia, jika tidak, sistem akan menggunakan kalibrasinone.
touch.size.scale
Definisi: touch.size.scale = <angka floating point non-negatif>
Menentukan faktor skala konstan yang digunakan dalam kalibrasi.
Nilai default-nya adalah 1.0.
touch.size.bias
Definisi: touch.size.bias = <angka floating point non-negatif>
Menentukan nilai bias konstan yang digunakan dalam kalibrasi.
Nilai default-nya adalah 0.0.
touch.size.isSummed
Definisi: touch.size.isSummed = 0 | 1
Menentukan apakah ukuran dilaporkan sebagai jumlah ukuran semua kontak aktif, atau dilaporkan satu per satu untuk setiap kontak.
-
Jika nilainya adalah
1, ukuran yang dilaporkan akan dibagi dengan jumlah kontak sebelum digunakan. -
Jika nilainya adalah
0, ukuran yang dilaporkan akan digunakan apa adanya.
Nilai default-nya adalah 0.
Beberapa perangkat sentuh, khususnya perangkat "Semi-MT", tidak dapat membedakan
dimensi individual dari beberapa kontak sehingga perangkat tersebut melaporkan pengukuran ukuran
yang mewakili total area atau lebarnya. Properti ini hanya boleh ditetapkan ke
1 untuk perangkat tersebut. Jika ragu, tetapkan nilai ini ke 0.
Penghitungan
Penghitungan kolom touchMajor, touchMinor, toolMajor,
toolMinor,
dan size bergantung pada parameter kalibrasi yang ditentukan.
If raw.touchMajor and raw.toolMajor are available:
touchMajor = raw.touchMajor
touchMinor = raw.touchMinor
toolMajor = raw.toolMajor
toolMinor = raw.toolMinor
Else If raw.touchMajor is available:
toolMajor = touchMajor = raw.touchMajor
toolMinor = touchMinor = raw.touchMinor
Else If raw.toolMajor is available:
touchMajor = toolMajor = raw.toolMajor
touchMinor = toolMinor = raw.toolMinor
Else
touchMajor = toolMajor = 0
touchMinor = toolMinor = 0
size = 0
End If
size = avg(touchMajor, touchMinor)
If touch.size.isSummed == 1:
touchMajor = touchMajor / numberOfActiveContacts
touchMinor = touchMinor / numberOfActiveContacts
toolMajor = toolMajor / numberOfActiveContacts
toolMinor = toolMinor / numberOfActiveContacts
size = size / numberOfActiveContacts
End If
If touch.size.calibration == "none":
touchMajor = toolMajor = 0
touchMinor = toolMinor = 0
size = 0
Else If touch.size.calibration == "geometric":
outputScale = average(output.width / raw.width, output.height / raw.height)
touchMajor = touchMajor * outputScale
touchMinor = touchMinor * outputScale
toolMajor = toolMajor * outputScale
toolMinor = toolMinor * outputScale
Else If touch.size.calibration == "area":
touchMajor = sqrt(touchMajor)
touchMinor = touchMajor
toolMajor = sqrt(toolMajor)
toolMinor = toolMajor
Else If touch.size.calibration == "diameter":
touchMinor = touchMajor
toolMinor = toolMajor
End If
If touchMajor != 0:
output.touchMajor = touchMajor * touch.size.scale + touch.size.bias
Else
output.touchMajor = 0
End If
If touchMinor != 0:
output.touchMinor = touchMinor * touch.size.scale + touch.size.bias
Else
output.touchMinor = 0
End If
If toolMajor != 0:
output.toolMajor = toolMajor * touch.size.scale + touch.size.bias
Else
output.toolMajor = 0
End If
If toolMinor != 0:
output.toolMinor = toolMinor * touch.size.scale + touch.size.bias
Else
output.toolMinor = 0
End If
output.size = size
kolom tekanan
Kolom pressure menjelaskan perkiraan tekanan fisik yang diterapkan ke
perangkat sentuh sebagai nilai yang dinormalisasi antara 0,0 (tanpa sentuhan) dan 1,0 (tekanan normal).
Tekanan nol menunjukkan bahwa alat sedang mengarah.
touch.pressure.calibration
Definisi: touch.pressure.calibration = none |
physical | amplitude | default
Menentukan jenis pengukuran yang digunakan oleh driver sentuh untuk melaporkan tekanan.
-
Jika nilainya adalah
none, tekanan tidak diketahui sehingga disetel ke 1,0 saat menyentuh dan 0,0 saat mengarahkan kursor. -
Jika nilainya adalah
physical, sumbu tekanan diasumsikan mengukur intensitas fisik tekanan yang sebenarnya yang diterapkan ke touchpad. -
Jika nilainya adalah
amplitude, sumbu tekanan diasumsikan mengukur amplitudo sinyal, yang terkait dengan ukuran kontak dan tekanan yang diterapkan. -
Jika nilainya adalah
default, sistem akan menggunakan kalibrasiphysicaljika sumbu tekanan tersedia, jika tidak, sistem akan menggunakannone.
touch.pressure.scale
Definisi: touch.pressure.scale = <angka floating point non-negatif>
Menentukan faktor skala konstan yang digunakan dalam kalibrasi.
Nilai default-nya adalah 1.0 / raw.pressure.max.
Penghitungan
Penghitungan kolom pressure bergantung pada parameter kalibrasi yang ditentukan.
If touch.pressure.calibration == "physical" or "amplitude":
output.pressure = raw.pressure * touch.pressure.scale
Else
If hovering:
output.pressure = 0
Else
output.pressure = 1
End If
End If
kolom orientasi dan kemiringan
Kolom orientation menjelaskan orientasi sentuhan dan alat sebagai
pengukuran sudut. Orientasi 0 menunjukkan bahwa sumbu utama
berorientasi vertikal, -PI/2 menunjukkan bahwa sumbu utama berorientasi ke kiri,
PI/2 menunjukkan bahwa sumbu utama berorientasi ke kanan. Jika alat stilus
ada, rentang orientasi dapat dijelaskan dalam rentang lingkaran penuh
dari -PI atau PI.
Kolom tilt menjelaskan kemiringan alat sebagai pengukuran sudut.
Kemiringan 0 menunjukkan bahwa alat tegak lurus terhadap permukaan.
Kemiringan PI/2 menunjukkan bahwa alat diletakkan rata di permukaan.
touch.orientation.calibration
Definisi: touch.orientation.calibration = none |
interpolated | vector | default
Menentukan jenis pengukuran yang digunakan oleh driver sentuh untuk melaporkan orientasi.
- Jika nilainya adalah
none, orientasi tidak diketahui sehingga ditetapkan ke 0. - Jika nilainya adalah
interpolated, orientasi diinterpolasi secara linear sehingga nilai mentahraw.orientation.mindipetakan ke-PI/2dan nilai mentahraw.orientation.maxdipetakan kePI/2. Nilai tengah(raw.orientation.min + raw.orientation.max) / 2dipetakan ke0. - Jika nilainya adalah
vector, orientasi akan ditafsirkan sebagai vektor yang dipaketkan yang terdiri dari dua kolom 4-bit bertanda. Representasi ini digunakan pada bagian Atmel Object Based Protocol. Saat didekode, vektor akan menghasilkan sudut orientasi dan magnitudo keyakinan. Besaran keyakinan digunakan untuk menskalakan informasi ukuran, kecuali jika bersifat geometris. - Jika nilainya adalah
default, sistem akan menggunakan kalibrasiinterpolatedjika sumbu orientasi tersedia, jika tidak, sistem akan menggunakannone.
Penghitungan
Penghitungan kolom orientation dan tilt bergantung pada
parameter kalibrasi yang ditentukan dan input yang tersedia.
If touch.tiltX and touch.tiltY are available:
tiltXCenter = average(raw.tiltX.min, raw.tiltX.max)
tiltYCenter = average(raw.tiltY.min, raw.tiltY.max)
tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180
tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180
output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle))
output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle))
Else If touch.orientation.calibration == "interpolated":
center = average(raw.orientation.min, raw.orientation.max)
output.orientation = PI / (raw.orientation.max - raw.orientation.min)
output.tilt = 0
Else If touch.orientation.calibration == "vector":
c1 = (raw.orientation & 0xF0) >> 4
c2 = raw.orientation & 0x0F
If c1 != 0 or c2 != 0:
If c1 >= 8 Then c1 = c1 - 16
If c2 >= 8 Then c2 = c2 - 16
angle = atan2(c1, c2) / 2
confidence = sqrt(c1*c1 + c2*c2)
output.orientation = angle
If touch.size.calibration == "diameter" or "area":
scale = 1.0 + confidence / 16
output.touchMajor *= scale
output.touchMinor /= scale
output.toolMajor *= scale
output.toolMinor /= scale
End If
Else
output.orientation = 0
End If
output.tilt = 0
Else
output.orientation = 0
output.tilt = 0
End If
If orientation aware:
If screen rotation is 90 degrees:
output.orientation = output.orientation - PI / 2
Else If screen rotation is 270 degrees:
output.orientation = output.orientation + PI / 2
End If
End If
kolom jarak
Kolom distance menjelaskan jarak antara alat dan permukaan perangkat
sentuh. Nilai 0,0 menunjukkan kontak langsung dan nilai yang lebih besar menunjukkan
jarak yang meningkat dari permukaan.
touch.distance.calibration
Definisi: touch.distance.calibration = none |
scaled | default
Menentukan jenis pengukuran yang digunakan oleh driver sentuh untuk melaporkan jarak.
-
Jika nilainya adalah
none, jaraknya tidak diketahui sehingga ditetapkan ke 0. -
Jika nilainya adalah
scaled, jarak yang dilaporkan akan dikalikan dengan faktor skala konstan. -
Jika nilainya adalah
default, sistem akan menggunakan kalibrasiscaledjika sumbu jarak tersedia, jika tidak, sistem akan menggunakannone.
touch.distance.scale
Definisi: touch.distance.scale = <angka floating point non-negatif>
Menentukan faktor skala konstan yang digunakan dalam kalibrasi.
Nilai default-nya adalah 1.0.
Penghitungan
Penghitungan kolom distance bergantung pada parameter kalibrasi yang ditentukan.
If touch.distance.calibration == "scaled":
output.distance = raw.distance * touch.distance.scale
Else
output.distance = 0
End If
Contoh
# Input device configuration file for a touch screen that supports pressure, # size and orientation. The pressure and size scale factors were obtained # by measuring the characteristics of the device itself and deriving # useful approximations based on the resolution of the touch sensor and the # display. # # Note that these parameters are specific to a particular device model. # Different parameters need to be used for other devices. # Basic Parameters touch.deviceType = touchScreen touch.orientationAware = 1 # Size # Based on empirical measurements, we estimate the size of the contact # using size = sqrt(area) * 28 + 0. touch.size.calibration = area touch.size.scale = 28 touch.size.bias = 0 touch.size.isSummed = 0 # Pressure # Driver reports signal strength as pressure. # # A normal index finger touch typically registers about 80 signal strength # units although we don't expect these values to be accurate. touch.pressure.calibration = amplitude touch.pressure.scale = 0.0125 # Orientation touch.orientation.calibration = vector
Catatan kompatibilitas
Properti konfigurasi untuk perangkat sentuh berubah secara signifikan di Android Ice Cream Sandwich 4.0. Semua file konfigurasi perangkat input untuk perangkat sentuh harus diupdate agar menggunakan properti konfigurasi baru.
Driver perangkat sentuh lama mungkin juga perlu diupdate.
File peta tombol virtual
Perangkat sentuh dapat digunakan untuk menerapkan tombol virtual.
Ada beberapa cara untuk melakukannya, bergantung pada kemampuan pengontrol sentuh. Beberapa pengontrol sentuh dapat dikonfigurasi secara langsung untuk menerapkan tombol virtual dengan menyetel register firmware. Di lain waktu, sebaiknya lakukan pemetaan dari koordinat sentuh ke kode tombol di software.
Saat tombol virtual diimplementasikan dalam software, kernel harus mengekspor file peta tombol virtual
yang disebut virtualkeys.<devicename> sebagai properti board. Misalnya,
jika driver perangkat layar sentuh melaporkan namanya sebagai "touchyfeely",
file peta tombol virtual harus memiliki jalur
/sys/board_properties/virtualkeys.touchyfeely.
File peta tombol virtual menjelaskan koordinat dan kode tombol Linux dari tombol virtual di layar sentuh.
Selain file peta tombol virtual, harus ada file tata letak tombol dan file peta karakter tombol yang sesuai untuk memetakan kode tombol Linux ke kode tombol Android dan untuk menentukan jenis perangkat keyboard (biasanya SPECIAL_FUNCTION).
Sintaksis
File peta tombol virtual adalah file teks biasa yang terdiri dari urutan deskripsi tata letak tombol virtual yang dipisahkan oleh baris baru atau titik dua.
Baris komentar dimulai dengan '#' dan berlanjut hingga akhir baris.
Setiap kunci virtual dijelaskan oleh 6 komponen yang dipisahkan titik dua:
0x01: Kode versi. Harus selalu0x01.- <Linux key code>: Kode tombol Linux dari tombol virtual.
- <centerX>: Koordinat piksel X dari pusat tombol virtual.
- <centerY>: Koordinat piksel Y dari pusat tombol virtual.
- <width>: Lebar tombol virtual dalam piksel.
- <height>: Tinggi tombol virtual dalam piksel.
Semua koordinat dan ukuran ditentukan dalam sistem koordinat tampilan.
Berikut adalah file peta tombol virtual yang semuanya ditulis dalam satu baris.
# All on one line 0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55
File peta tombol virtual yang sama juga dapat ditulis di beberapa baris.
# One key per line 0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
Pada contoh di atas, layar sentuh memiliki resolusi 480x800. Oleh karena itu, semua tombol virtual memiliki koordinat <centerY> 835, yang sedikit di bawah area layar sentuh yang terlihat.
Tombol pertama memiliki kode pemindaian Linux 158 (KEY_BACK), centerX
55, centerY 835, lebar 90, dan tinggi
55.
Contoh
File peta kunci virtual: /sys/board_properties/virtualkeys.touchyfeely.
0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
File tata letak tombol: /system/usr/keylayout/touchyfeely.kl.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
File peta karakter tombol: /system/usr/keychars/touchyfeely.kcm.
type SPECIAL_FUNCTION
Gestur pointer multi-sentuh tidak langsung
Dalam mode pointer, sistem akan menafsirkan gestur berikut:
- Ketuk dengan satu jari: klik.
- Gerakan satu jari: menggerakkan kursor.
- Gerakan satu jari plus penekanan tombol: menarik pointer.
- Gerakan dua jari, kedua jari bergerak ke arah yang sama: menarik area di bawah kursor ke arah tersebut. Pointer itu sendiri tidak bergerak.
- Gerakan dua jari, kedua jari bergerak saling mendekat atau menjauh ke arah yang berbeda: menggeser/menskalakan/memutar area di sekitar pointer. Pointer itu sendiri tidak bergerak.
- Gerakan beberapa jari: gestur bentuk bebas.
Penolakan telapak tangan
Mulai Android 13, sistem dapat otomatis menolak input dari telapak tangan
saat framework bawaan diaktifkan. Solusi internal yang dibuat khusus masih didukung,
meskipun mungkin perlu dimodifikasi untuk menampilkan flag TOOL_TYPE_PALM saat telapak tangan
terdeteksi. Framework bawaan juga berfungsi bersama dengan solusi kustom.
Model sebenarnya melihat 90 md pertama data gestur, pada pointer saat ini, dan pada
pointer di sekitarnya, lalu mempertimbangkan seberapa jauh sentuhan dari tepi layar.
Kemudian, sistem akan menentukan, berdasarkan per pointer, pointer mana yang merupakan telapak tangan. Metode ini juga memperhitungkan
ukuran setiap kontak, seperti yang dilaporkan oleh touchMajor dan
touchMinor. Framework Android kemudian menghapus pointer yang ditandai sebagai
telapak tangan dari aliran sentuh.
Jika pointer sudah dikirim ke aplikasi, sistem akan:
- (Jika ada pointer aktif lainnya) Membatalkan pointer dengan
ACTION_POINTER_UPdanFLAG_CANCELEDyang ditetapkan. - (Jika ini adalah satu-satunya pointer) Membatalkan pointer dengan
ACTION_CANCEL.
API publik, MotionEvent.FLAG_CANCELED, menunjukkan bahwa peristiwa saat ini tidak boleh memicu tindakan pengguna. Flag ini ditetapkan untuk ACTION_CANCEL
dan ACTION_POINTER_UP.
Jika pointer telapak tangan tidak dikirim ke aplikasi, sistem akan menghapus pointer tersebut.
Mengaktifkan penolakan telapak tangan
- Dalam driver sentuh, gunakan
makro
input_abs_set_resuntuk menetapkan resolusi untuk kolom berikut (unitnya adalah piksel per mm):ABS_MT_POSITION_XABS_MT_POSITION_YABS_MT_TOUCH_MAJORABS_MT_TOUCH_MINOR
Dukungan untuk
ABS_MT_TOUCH_MINORbersifat opsional. Namun, jika perangkat Anda mendukungnya, pastikan resolusinya disetel dengan benar. - Untuk mengonfirmasi bahwa kolom ditetapkan dengan benar, jalankan:
$ adb shell getevent -li - Untuk mengaktifkan fitur selama runtime, jalankan:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1 - Mulai ulang proses
system_server.$ adb shell stop && adb shell start - Pastikan
adb shell dumpsys inputmenunjukkan bahwa ada penolak telapak tangan di dalamUnwantedInteractionBlocker. Jika tidak, periksa log terkait input untuk menemukan petunjuk tentang hal yang mungkin salah dikonfigurasi.Lihat contoh berikut sebagai referensi:
UnwantedInteractionBlocker: mEnablePalmRejection: true isPalmRejectionEnabled (flag value): true mPalmRejectors: deviceId = 3: mDeviceInfo: max_x =max_y = x_res = 11.00 y_res = 11.00 major_radius_res = 1.00 minor_radius_res = 1.00 minor_radius_supported = true touch_major_res = 1 touch_minor_res = 1 mSlotState: mSlotsByPointerId: mPointerIdsBySlot: mSuppressedPointerIds: {} - Untuk mengaktifkan fitur secara permanen, tambahkan perintah sysprop yang sesuai di file
init**rcAnda:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1