Android mendukung berbagai layar sentuh dan bantalan sentuh, termasuk tablet digitizer berbasis stylus.
Layar sentuh adalah perangkat sentuh yang diasosiasikan dengan tampilan sedemikian rupa sehingga pengguna mempunyai kesan memanipulasi item di layar secara langsung.
Bantalan sentuh adalah perangkat sentuh yang tidak dikaitkan dengan layar, seperti tablet digitizer. Bantalan sentuh biasanya digunakan untuk menunjuk atau untuk penentuan posisi tidak langsung absolut atau kontrol berbasis gerakan pada antarmuka pengguna.
Perangkat sentuh dapat memiliki tombol yang fungsinya mirip dengan tombol mouse.
Perangkat sentuh terkadang dapat dimanipulasi menggunakan berbagai alat berbeda seperti jari atau stylus, bergantung pada teknologi sensor sentuh yang mendasarinya.
Perangkat sentuh terkadang digunakan untuk mengimplementasikan kunci virtual. Misalnya, pada beberapa perangkat Android, area sensor layar sentuh melampaui tepi layar dan memiliki fungsi ganda sebagai bagian dari bantalan tombol sensitif sentuhan.
Karena banyaknya variasi perangkat sentuh, Android mengandalkan sejumlah besar properti konfigurasi untuk mendeskripsikan karakteristik dan perilaku yang diinginkan setiap perangkat.
Klasifikasi perangkat sentuh
Perangkat input diklasifikasikan sebagai perangkat multisentuh jika kedua kondisi berikut terpenuhi:
- Perangkat input melaporkan keberadaan sumbu absolut
ABS_MT_POSITION_X
danABS_MT_POSITION_Y
. - Perangkat input tidak memiliki tombol gamepad. Kondisi ini menyelesaikan ambiguitas pada 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 multisentuh. Perangkat input diklasifikasikan sebagai perangkat satu sentuhan atau perangkat multisentuh, tidak pernah keduanya.
- Perangkat input melaporkan keberadaan sumbu absolut
ABS_X
danABS_Y
, serta keberadaan kode kunciBTN_TOUCH
.
Ketika perangkat input diklasifikasikan sebagai perangkat sentuh, keberadaan kunci virtual ditentukan dengan mencoba memuat file peta kunci virtual untuk perangkat tersebut. Jika peta kunci virtual tersedia, maka file tata letak kunci untuk perangkat juga dimuat. Lihat [File peta kunci virtual](#file peta kunci virtual) untuk informasi tentang lokasi dan format file ini.
Selanjutnya, sistem memuat file konfigurasi perangkat input untuk perangkat sentuh.
Semua perangkat sentuh internal harus memiliki file konfigurasi perangkat input. Jika tidak ada file konfigurasi perangkat input, sistem akan memilih konfigurasi default yang sesuai untuk periferal sentuh serbaguna seperti layar sentuh atau bantalan sentuh USB atau Bluetooth HID eksternal. Pengaturan default ini tidak dirancang untuk layar sentuh internal dan dapat mengakibatkan perilaku yang salah.
Setelah konfigurasi perangkat input dimuat, sistem mengklasifikasikan perangkat input sebagai perangkat layar sentuh , panel sentuh , atau penunjuk .
- Perangkat layar sentuh digunakan untuk manipulasi langsung objek di layar. Pengguna langsung menyentuh layar, sehingga sistem tidak memerlukan biaya tambahan untuk menunjukkan objek yang sedang dimanipulasi.
- Perangkat panel sentuh digunakan untuk memberikan informasi posisi absolut ke 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 diartikan sebagai isyarat penunjuk multi-sentuh. Alat lain, seperti stylus, diinterpretasikan menggunakan posisi absolut. Lihat Gerakan penunjuk multisentuh tidak langsung untuk informasi lebih lanjut.
Aturan berikut digunakan untuk mengklasifikasikan perangkat input sebagai layar sentuh, panel sentuh, atau perangkat penunjuk.
- Jika properti
touch.deviceType
disetel, maka jenis perangkat disetel seperti yang ditunjukkan. - Jika perangkat input melaporkan keberadaan properti input
INPUT_PROP_DIRECT
(melaluiEVIOCGPROP
ioctl), maka jenis perangkat diatur ke layar sentuh . Kondisi ini mengasumsikan bahwa perangkat sentuh input langsung dipasang ke layar yang juga tersambung. - Jika perangkat input melaporkan keberadaan properti input
INPUT_PROP_POINTER
(melaluiEVIOCGPROP
ioctl), maka jenis perangkat disetel ke pointer . - Jika perangkat input melaporkan keberadaan sumbu relatif
REL_X
atauREL_Y
, maka jenis perangkat diatur ke touch pad . Kondisi ini menyelesaikan ambiguitas perangkat input yang terdiri dari mouse dan panel sentuh. Dalam hal ini, panel sentuh tidak digunakan untuk mengontrol penunjuk karena mouse sudah mengontrolnya. - Jika tidak, jenis perangkat disetel ke pointer . Default ini memastikan bahwa bantalan sentuh yang belum ditetapkan untuk tujuan khusus lainnya mengontrol penunjuk.
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 tipe penunjuk atau dengan stylus.
Tombol-tombol berikut ini didukung:
-
BTN_LEFT
: Dipetakan keMotionEvent.BUTTON_PRIMARY
. -
BTN_RIGHT
: Dipetakan keMotionEvent.BUTTON_SECONDARY
. -
BTN_MIDDLE
: Dipetakan keMotionEvent.BUTTON_MIDDLE
. -
BTN_BACK
danBTN_SIDE
: Dipetakan keMotionEvent.BUTTON_BACK
. Menekan tombol ini juga menyatukan penekanan tombol dengan kode kunciKeyEvent.KEYCODE_BACK
. -
BTN_FORWARD
danBTN_EXTRA
: Dipetakan keMotionEvent.BUTTON_FORWARD
. Menekan tombol ini juga menyatukan penekanan tombol dengan kode kunciKeyEvent.KEYCODE_FORWARD
. -
BTN_STYLUS
: Dipetakan keMotionEvent.BUTTON_SECONDARY
. -
BTN_STYLUS2
: Dipetakan keMotionEvent.BUTTON_TERTIARY
.
Alat dan jenis alat
Alat adalah jari, stylus, 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 ini didukung:
-
BTN_TOOL_FINGER
danMT_TOOL_FINGER
: Dipetakan keMotionEvent.TOOL_TYPE_FINGER
. -
BTN_TOOL_PEN
danMT_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
.
Melayang versus menyentuh alat
Alat dapat bersentuhan dengan perangkat sentuh atau berada dalam jangkauan dan melayang di atasnya. Tidak semua perangkat sentuh dapat merasakan keberadaan alat yang melayang di atas perangkat sentuh tersebut. Alat yang dapat melakukannya, seperti digitizer stylus berbasis RF, sering kali dapat mendeteksi ketika alat tersebut berada dalam jangkauan digitizer yang terbatas.
Komponen InputReader
membedakan alat sentuh dan alat melayang. Demikian pula, alat sentuh dan alat melayang 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 melayang 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 sebaiknya hanya mendaftarkan sumbu dan kode kunci untuk sumbu dan tombol yang didukungnya. Mendaftarkan sumbu atau kode kunci yang tidak didukung dapat membingungkan algoritma klasifikasi perangkat atau menyebabkan sistem salah mendeteksi kemampuan perangkat. Misalnya, jika perangkat melaporkan kode kunci
BTN_TOUCH
, sistem berasumsi bahwaBTN_TOUCH
selalu digunakan untuk menunjukkan apakah alat tersebut menyentuh layar. Oleh karena itu,BTN_TOUCH
tidak boleh digunakan untuk menunjukkan bahwa alat tersebut hanya berada dalam jangkauan dan melayang. - Perangkat sekali sentuh menggunakan peristiwa masukan Linux berikut:
-
ABS_X
: (WAJIB) Melaporkan koordinat X alat. -
ABS_Y
: (WAJIB) Melaporkan koordinat Y alat. -
ABS_PRESSURE
: (opsional) Melaporkan tekanan fisik yang diterapkan pada 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 pahat dari permukaan perangkat sentuh sepanjang sumbu X. -
ABS_TILT_Y
: (opsional) Melaporkan kemiringan pahat dari permukaan perangkat sentuh 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) Status tombol laporan. -
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
: (op tional) Melaporkan jenis alat .
-
- Perangkat multi-sentuh menggunakan peristiwa masukan Linux berikut:
-
ABS_MT_POSITION_X
: (DIPERLUKAN) Melaporkan koordinat X alat. -
ABS_MT_POSITION_Y
: (WAJIB) Melaporkan koordinat Y alat. -
ABS_MT_PRESSURE
: (opsional) Melaporkan tekanan fisik yang diterapkan pada ujung alat atau kekuatan sinyal kontak sentuh. -
ABS_MT_TOUCH_MAJOR
: (opsional) Melaporkan luas penampang kontak sentuh, atau panjang dimensi yang lebih panjang dari kontak sentuh. -
ABS_MT_TOUCH_MINOR
: (opsional) Melaporkan panjang dimensi kontak sentuh yang lebih pendek. Sumbu ini tidak boleh digunakan jikaABS_MT_TOUCH_MAJOR
melaporkan pengukuran area. -
ABS_MT_WIDTH_MAJOR
: (opsional) Melaporkan luas penampang pahat itu sendiri, atau panjang dimensi yang lebih panjang dari pahat itu sendiri. Jangan gunakan sumbu ini kecuali Anda mengetahui dimensi alat itu sendiri. -
ABS_MT_WIDTH_MINOR
: (opsional) Melaporkan panjang dimensi terpendek dari pahat itu sendiri. Sumbu ini tidak boleh digunakan jikaABS_MT_WIDTH_MAJOR
melaporkan pengukuran luas 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_FINGER
atauMT_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 ketika beberapa alat aktif. Misalnya, ketika beberapa jari menyentuh perangkat, setiap jari harus diberi ID pelacakan berbeda yang digunakan selama jari tersebut tetap bersentuhan. ID Pelacakan dapat digunakan kembali ketika 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 lebih jelasnya. -
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) Status tombol laporan. -
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
: (op tional) Melaporkan jenis alat .
-
- Jika sumbu untuk protokol sentuhan tunggal dan multisentuh ditentukan, maka hanya sumbu multisentuh yang digunakan dan sumbu sentuhan tunggal diabaikan.
Nilai minimum dan maksimum sumbu
ABS_X
,ABS_Y
,ABS_MT_POSITION_X
, danABS_MT_POSITION_Y
menentukan batas area aktif perangkat dalam unit permukaan khusus perangkat. Dalam kasus layar sentuh, area aktif menggambarkan bagian perangkat sentuh yang sebenarnya menutupi layar.Untuk layar sentuh, sistem secara otomatis menginterpolasi posisi sentuh yang dilaporkan dalam unit permukaan untuk mendapatkan posisi sentuh dalam piksel tampilan berdasarkan perhitungan 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 namun dapat digunakan untuk kunci virtual.
Sentuhan yang dimulai di dalam area aktif, atau yang masuk dan keluar dari area tampilan akan dikirimkan ke aplikasi. Akibatnya, jika sentuhan dimulai dalam batas aplikasi dan kemudian berpindah ke luar area aktif, aplikasi mungkin menerima kejadian sentuhan dengan koordinat tampilan yang negatif atau di luar batas tampilan. Ini adalah perilaku yang diharapkan.
Perangkat sentuh tidak boleh menjepit koordinat sentuhan ke batas area aktif. Jika sentuhan keluar dari area aktif, maka harus dilaporkan sebagai berada di luar area aktif, atau tidak boleh dilaporkan sama sekali.
Misalnya, jika jari pengguna menyentuh di dekat pojok kiri atas layar sentuh, ia mungkin melaporkan koordinat (minX, minY). Jika jari terus bergerak lebih jauh ke luar area aktif, layar sentuh akan mulai melaporkan koordinat dengan komponen yang kurang 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) ketika jari pengguna benar-benar menyentuh di luar area aktif.
Menjepit koordinat sentuhan ke tepi layar 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_PRESSURE
atauABS_MT_PRESSURE
, jika dilaporkan, harus bukan nol ketika pahat menyentuh perangkat dan nol jika tidak untuk menunjukkan bahwa pahat sedang melayang.Melaporkan informasi tekanan bersifat opsional tetapi sangat disarankan. Aplikasi dapat menggunakan informasi tekanan untuk menerapkan gambar yang peka 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_MINOR
harus bukan nol saat alat menyentuh perangkat dan nol jika tidak, namun hal ini tidak diperlukan. Misalnya, perangkat sentuh mungkin dapat mengukur ukuran kontak sentuhan jari namun tidak dapat mengukur kontak sentuh stylus.Informasi ukuran pelaporan bersifat opsional tetapi sangat disarankan. Aplikasi dapat menggunakan informasi tekanan untuk menerapkan gambar yang peka terhadap ukuran dan efek lainnya.
Nilai yang dilaporkan oleh
ABS_DISTANCE
atauABS_MT_DISTANCE
harus mendekati nol saat alat menyentuh perangkat. Jaraknya bisa tetap bukan nol meskipun alat bersentuhan langsung. Nilai pasti yang dilaporkan bergantung pada cara perangkat keras mengukur jarak.Melaporkan informasi jarak bersifat opsional tetapi disarankan untuk perangkat stylus.
Nilai yang dilaporkan oleh
ABS_TILT_X
danABS_TILT_Y
harus nol ketika pahat tegak lurus terhadap perangkat. Kemiringan yang bukan nol menunjukkan bahwa alat dipegang pada suatu bidang miring.Sudut kemiringan sepanjang sumbu X dan Y diasumsikan ditentukan dalam derajat dari tegak lurus. Titik pusat (tegak lurus sempurna) diberikan oleh
(max + min) / 2
untuk setiap sumbu. Nilai yang lebih kecil dari titik pusat menunjukkan kemiringan ke atas atau ke kiri, nilai yang lebih besar dari titik pusat menunjukkan kemiringan ke bawah atau ke kanan.InputReader
mengubah komponen kemiringan X dan Y menjadi sudut kemiringan tegak lurus mulai dari 0 hinggaPI / 2
radian dan sudut orientasi planar mulai dari-PI
hinggaPI
radian. Representasi ini menghasilkan gambaran orientasi yang sesuai dengan apa yang digunakan untuk menggambarkan sentuhan jari.Melaporkan informasi kemiringan bersifat opsional namun disarankan untuk perangkat stylus.
Jika jenis alat dilaporkan oleh
ABS_MT_TOOL_TYPE
, informasi jenis alat tersebut akan menggantikan informasi jenis alat apa pun yang dilaporkan olehBTN_TOOL_*
. Jika tidak ada informasi jenis alat yang tersedia sama sekali, jenis alat akan ditetapkan secara default keMotionEvent.TOOL_TYPE_FINGER
.Suatu alat ditentukan aktif berdasarkan ketentuan sebagai berikut:
Saat menggunakan protokol sekali sentuh, alat akan aktif jika
BTN_TOUCH
, atauBTN_TOOL_*
bernilai 1.Kondisi ini menyiratkan bahwa
InputReader
perlu memiliki setidaknya beberapa informasi tentang sifat dari alat tersebut, apakah itu sentuhan, atau setidaknya jenis alatnya. Jika tidak ada informasi yang tersedia, maka alat tersebut dianggap tidak aktif (di luar jangkauan).- Saat menggunakan protokol multi-sentuh 'A', alat ini aktif setiap kali muncul di laporan sinkronisasi terbaru. Ketika alat tersebut berhenti muncul dalam laporan sinkronisasi, alat tersebut tidak ada lagi.
- Saat menggunakan protokol multi-sentuh 'B', alat ini aktif selama memiliki slot yang aktif. Ketika slot itu dibersihkan, alat itu tidak ada lagi.
- Suatu alat ditentukan melayang berdasarkan kondisi berikut:
- Jika alat tersebut adalah
BTN_TOOL_MOUSE
atauBTN_TOOL_LENS
, maka alat tersebut tidak akan melayang, meskipun salah satu kondisi berikut ini benar. - Jika alat aktif dan pengemudi melaporkan informasi tekanan, dan tekanan yang dilaporkan adalah nol, maka alat tersebut melayang.
- Jika alat aktif dan driver mendukung kode kunci
BTN_TOUCH
danBTN_TOUCH
bernilai nol, maka alat tersebut melayang.
- Jika alat tersebut adalah
-
InputReader
mendukung protokol multi-sentuh 'A' dan 'B'. Pengemudi baru harus menggunakan protokol 'B' tetapi keduanya berfungsi. Mulai Android 4.0, driver layar sentuh mungkin perlu diubah untuk mematuhi spesifikasi protokol input Linux.
Perubahan berikut mungkin diperlukan:
Bila suatu alat menjadi tidak aktif (jari "naik"), alat tersebut akan berhenti muncul dalam laporan sinkronisasi multi-sentuh berikutnya. Ketika semua alat menjadi tidak aktif (semua jari "naik"), pengemudi harus mengirimkan paket laporan sinkronisasi kosong, seperti
SYN_MT_REPORT
diikuti olehSYN_REPORT
.Versi Android sebelumnya mengharapkan peristiwa "naik" dilaporkan dengan mengirimkan nilai tekanan 0. Perilaku lama tidak kompatibel dengan spesifikasi protokol masukan Linux dan tidak lagi didukung.
Informasi tekanan fisik atau kekuatan sinyal harus dilaporkan menggunakan
ABS_MT_PRESSURE
.Versi Android sebelumnya mengambil informasi tekanan dari
ABS_MT_TOUCH_MAJOR
. Perilaku lama tidak kompatibel dengan spesifikasi protokol masukan Linux dan tidak lagi didukung.- Informasi ukuran sentuhan harus dilaporkan menggunakan
ABS_MT_TOUCH_MAJOR
.Versi Android sebelumnya mengambil informasi ukuran dari
ABS_MT_TOOL_MAJOR
. Perilaku lama tidak kompatibel dengan spesifikasi protokol masukan Linux dan tidak lagi didukung.
Sentuh pengoperasian perangkat
Berikut ringkasan singkat pengoperasian perangkat sentuh di Android.
-
EventHub
membaca kejadian mentah dari driverevdev
. -
InputReader
menggunakan peristiwa mentah dan memperbarui keadaan internal tentang posisi dan karakteristik lain dari setiap alat. Ini juga melacak status tombol. - Jika BACK atau FORWARD ditekan atau dilepaskan,
InputReader
memberi tahuInputDispatcher
tentang peristiwa penting. -
InputReader
menentukan apakah terjadi penekanan tombol virtual. Jika demikian, ini akan memberi tahuInputDispatcher
tentang peristiwa penting tersebut. -
InputReader
menentukan apakah sentuhan dimulai dalam batas-batas tampilan. Jika demikian, ia akan memberitahukanInputDispatcher
tentang peristiwa sentuhan. - Jika tidak ada alat yang menyentuh tetapi setidaknya ada satu alat yang melayang,
InputReader
memberi tahuInputDispatcher
tentang peristiwa melayang tersebut. - Jika jenis perangkat sentuh adalah pointer ,
InputReader
melakukan deteksi gerakan penunjuk, menggerakkan penunjuk dan titik yang sesuai, serta memberi tahuInputDispatcher
tentang peristiwa penunjuk. -
InputDispatcher
menggunakanWindowManagerPolicy
untuk menentukan apakah peristiwa harus dikirim dan apakah peristiwa tersebut harus membangunkan perangkat. Kemudian,InputDispatcher
mengirimkan peristiwa tersebut ke aplikasi yang sesuai.
Sentuh konfigurasi perangkat
Perilaku perangkat sentuh ditentukan oleh sumbu perangkat, tombol, properti input, konfigurasi perangkat input, peta kunci virtual, dan tata letak tombol.
Lihat bagian berikut untuk rincian lebih lanjut tentang file yang berpartisipasi dalam konfigurasi keyboard:
Properti
Sistem bergantung pada banyak properti konfigurasi perangkat masukan 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 mereka perlu mengetahui ukuran fisik dan karakteristik lain dari node sensor perangkat sentuh.
Sistem menggunakan parameter kalibrasi yang dikodekan dalam file konfigurasi perangkat input untuk memecahkan kode, mengubah, dan menormalkan nilai yang dilaporkan oleh perangkat sentuh menjadi representasi standar yang lebih sederhana yang dapat dipahami oleh 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_X
atauABS_MT_POSITION_X
. -
raw.y
- Nilai sumbu
ABS_Y
atauABS_MT_POSITION_Y
. -
raw.pressure
- Nilai sumbu
ABS_PRESSURE
atauABS_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.touchMajor
jika tidak tersedia. -
raw.toolMajor
- Nilai sumbu
ABS_TOOL_WIDTH
atauABS_MT_WIDTH_MAJOR
, atau 0 jika tidak tersedia. -
raw.toolMinor
- Nilai sumbu
ABS_MT_WIDTH_MINOR
, atauraw.toolMajor
jika tidak tersedia. -
raw.orientation
- Nilai sumbu
ABS_MT_ORIENTATION
, atau 0 jika tidak tersedia. -
raw.distance
- Nilai sumbu
ABS_DISTANCE
atauABS_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. Mereka diperoleh dengan memanggil EVIOCGABS
ioctl untuk setiap sumbu.
-
raw.*.min
- Nilai minimum inklusif dari sumbu mentah.
-
raw.*.max
- Nilai maksimum inklusif dari sumbu mentah.
-
raw.*.range
- Setara dengan
raw.*.max - raw.*.min
. -
raw.*.fuzz
- Keakuratan sumbu mentah. misalnya. fuzz = 1 menyiratkan nilai akurat hingga +/- 1 unit.
-
raw.width
- Lebar inklusif area sentuh, setara dengan
raw.x.range + 1
. -
raw.height
- Ketinggian inklusif area sentuh, setara dengan
raw.y.range + 1
.
Rentang keluaran
Ekspresi berikut menunjukkan karakteristik sistem koordinat keluaran. Sistem ini menggunakan interpolasi linier untuk menerjemahkan informasi posisi sentuhan dari unit permukaan yang digunakan oleh perangkat sentuh menjadi unit keluaran yang dilaporkan ke aplikasi seperti piksel tampilan.
-
output.width
- Lebar keluaran. Untuk layar sentuh (yang terkait dengan tampilan), ini adalah lebar tampilan dalam piksel. Untuk bantalan sentuh (tidak terkait dengan layar), lebar keluaran sama dengan
raw.width
, yang menunjukkan bahwa tidak ada interpolasi yang dilakukan. -
output.height
- Ketinggian keluaran. Untuk layar sentuh (yang terkait dengan tampilan), ini adalah tinggi tampilan dalam piksel. Untuk bantalan sentuh (tidak terkait dengan layar), tinggi keluaran sama dengan
raw.height
, yang menunjukkan bahwa tidak ada interpolasi yang dilakukan. -
output.diag
- Panjang diagonal sistem koordinat keluaran, setara dengan
sqrt(output.width ^2 + output.height ^2)
.
Konfigurasi dasar
Pemeta input sentuh menggunakan banyak properti konfigurasi di file konfigurasi perangkat input untuk menentukan nilai kalibrasi. Tabel berikut menjelaskan beberapa properti konfigurasi tujuan umum. Semua properti lainnya dijelaskan di bagian berikut bersama dengan bidang yang digunakan untuk mengkalibrasi.
sentuh.deviceType
Definisi: touch.deviceType
= touchScreen
| touchPad
| pointer
| default
Menentukan jenis perangkat sentuh.
Jika nilainya
touchScreen
, perangkat sentuh adalah layar sentuh yang terkait dengan tampilan.Jika nilainya adalah
touchPad
, perangkat sentuh adalah panel sentuh yang tidak terkait dengan layar.Jika nilainya adalah
pointer
, perangkat sentuh adalah papan sentuh yang tidak dikaitkan dengan layar, dan gerakannya digunakan untuk gerakan penunjuk multisentuh tidak langsung .Jika nilainya
default
, sistem secara otomatis mendeteksi jenis perangkat sesuai dengan algoritma klasifikasi.
Lihat bagian Klasifikasi untuk rincian lebih lanjut tentang bagaimana jenis perangkat memengaruhi perilaku perangkat sentuh.
Di Android 3 dan lebih rendah, semua perangkat sentuh diasumsikan sebagai layar sentuh.
sentuh.orientasi Sadar
Definisi: touch.orientationAware
= 0
| 1
Menentukan apakah perangkat sentuh harus bereaksi terhadap perubahan orientasi tampilan.
Jika nilainya
1
, posisi sentuh yang dilaporkan oleh perangkat sentuh akan diputar setiap kali orientasi tampilan berubah.Jika nilainya
0
, posisi sentuh yang dilaporkan oleh perangkat sentuh kebal terhadap perubahan orientasi tampilan.
Nilai defaultnya adalah 1
jika perangkatnya adalah layar sentuh, 0
jika tidak.
Sistem membedakan antara layar sentuh dan tampilan internal dan eksternal. Layar sentuh internal yang sadar orientasi diputar berdasarkan orientasi tampilan internal. Layar sentuh eksternal yang sadar 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 dari sentuhan dipetakan ulang sehingga sentuhan di pojok kiri atas sistem koordinat absolut layar sentuh dilaporkan sebagai sentuhan di kiri atas. sudut sistem koordinat yang diputar pada layar. 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 sadar akan orientasi.
sentuh.gestureMode
Definisi: touch.gestureMode
= pointer
| spots
| default
Menentukan mode presentasi untuk gerakan penunjuk. Properti konfigurasi ini hanya relevan bila perangkat sentuh bertipe pointer .
Jika nilainya adalah
pointer
, gerakan papan sentuh disajikan melalui kursor yang mirip dengan penunjuk tetikus.Jika nilainya adalah
spots
, gerakan pada panel sentuh ditampilkan oleh jangkar yang mewakili pusat gerakan dan serangkaian titik melingkar yang mewakili posisi masing-masing jari.
Nilai defaultnya adalah pointer
ketika properti input INPUT_PROP_SEMI_MT
disetel, atau spots
.
bidang X dan Y
Bidang X dan Y memberikan informasi posisi untuk pusat area kontak.
Perhitungan
Perhitungannya mudah: informasi posisi dari driver sentuh diinterpolasi secara linier ke sistem koordinat keluaran.
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
touchMajor, touchMinor, toolMajor, toolMinor, bidang ukuran
Bidang touchMajor
dan touchMinor
menjelaskan perkiraan dimensi area kontak dalam satuan keluaran (piksel).
Bidang toolMajor
dan toolMinor
menjelaskan perkiraan dimensi alat itu sendiri dalam satuan keluaran (piksel).
Bidang size
menjelaskan ukuran sentuhan yang dinormalisasi relatif terhadap kemungkinan sentuhan terbesar yang dapat dirasakan oleh perangkat sentuh. Ukuran normalisasi terkecil yang mungkin adalah 0,0 (tidak ada kontak, atau tidak dapat diukur), dan ukuran normalisasi terbesar yang mungkin adalah 1,0 (area sensor jenuh).
Ketika perkiraan panjang dan lebar dapat diukur, maka bidang touchMajor
menentukan dimensi yang lebih panjang dan bidang touchMinor
menentukan dimensi yang lebih pendek dari area kontak. Jika hanya perkiraan diameter area kontak yang dapat diukur, maka bidang touchMajor
dan touchMinor
adalah sama.
Demikian pula, bidang toolMajor
menentukan dimensi yang lebih panjang dan bidang toolMinor
menentukan dimensi yang lebih pendek dari luas penampang pahat.
Jika ukuran sentuh tidak tersedia namun ukuran pahat tersedia, maka ukuran pahat diatur sama dengan ukuran sentuh. Sebaliknya jika ukuran pahat tidak tersedia namun ukuran sentuh tersedia, maka ukuran sentuh diatur sama dengan ukuran pahat.
Perangkat sentuh mengukur atau melaporkan ukuran sentuhan dan ukuran alat dengan berbagai cara. Implementasi saat ini mendukung tiga jenis pengukuran berbeda: diameter, luas, dan kotak pembatas geometris dalam satuan permukaan.
Definisi: touch.size.calibration
= none
| geometric
| diameter
| area
| default
Menentukan jenis pengukuran yang digunakan oleh driver sentuh untuk melaporkan ukuran sentuhan dan ukuran pahat.
Jika nilainya
none
, ukurannya diatur ke nol.Jika nilainya
geometric
, ukurannya diasumsikan ditentukan dalam satuan permukaan yang sama dengan posisinya, sehingga diskalakan dengan cara yang sama.Jika nilainya
diameter
, maka ukurannya diasumsikan sebanding dengan diameter (lebar) alat sentuh atau alat.Jika nilainya adalah
area
, maka ukurannya diasumsikan sebanding dengan luas sentuhan atau alat.Jika nilainya
default
, sistem akan menggunakan kalibrasigeometric
jika sumburaw.touchMajor
atauraw.toolMajor
tersedia, jika tidak maka sistem akan menggunakan kalibrasinone
.
sentuh.ukuran.skala
Definisi: touch.size.scale
= <angka floating point non-negatif>
Menentukan faktor skala konstan yang digunakan dalam kalibrasi.
Nilai defaultnya adalah 1.0
.
sentuh.ukuran.bias
Definisi: touch.size.bias
= <angka floating point non-negatif>
Menentukan nilai bias konstan yang digunakan dalam kalibrasi.
Nilai defaultnya adalah 0.0
.
sentuh.ukuran.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
1
, ukuran yang dilaporkan dibagi dengan jumlah kontak sebelum digunakan.Jika nilainya
0
, ukuran yang dilaporkan digunakan apa adanya.
Nilai defaultnya 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 luas atau lebarnya. Properti ini hanya boleh disetel ke 1
untuk perangkat tersebut. Jika ragu, setel nilai ini ke 0
.
Perhitungan
Penghitungan bidang 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
bidang tekanan
Bidang pressure
menggambarkan perkiraan tekanan fisik yang diterapkan pada perangkat sentuh sebagai nilai yang dinormalisasi antara 0,0 (tanpa sentuhan) dan 1,0 (kekuatan penuh).
Tekanan nol menunjukkan bahwa alat sedang melayang.
sentuh.tekanan.kalibrasi
Definisi: touch.pressure.calibration
= none
| physical
| amplitude
| default
Menentukan jenis pengukuran yang digunakan oleh driver sentuh untuk melaporkan tekanan.
Jika nilainya
none
, maka tekanannya tidak diketahui sehingga disetel ke 1,0 saat menyentuh dan 0,0 saat melayang.Jika nilainya bersifat
physical
, sumbu tekanan diasumsikan mengukur intensitas fisik sebenarnya dari tekanan yang diterapkan pada panel sentuh.Jika nilainya adalah
amplitude
, sumbu tekanan diasumsikan mengukur amplitudo sinyal, yang terkait dengan ukuran kontak dan tekanan yang diberikan.Jika nilainya
default
, sistem akan menggunakan kalibrasiphysical
jika sumbu tekanan tersedia, jika tidak, tidak akan menggunakannone
.
sentuh.tekanan.skala
Definisi: touch.pressure.scale
= <angka floating point non-negatif>
Menentukan faktor skala konstan yang digunakan dalam kalibrasi.
Nilai defaultnya adalah 1.0 / raw.pressure.max
.
Perhitungan
Perhitungan bidang 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
bidang orientasi dan kemiringan
Bidang orientation
menggambarkan 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. Ketika alat stylus hadir, rentang orientasi dapat dijelaskan dalam kisaran lingkaran penuh dari -PI
atau PI
.
Bidang tilt
menggambarkan kemiringan alat sebagai pengukuran sudut. Kemiringan 0
menunjukkan bahwa alat tersebut tegak lurus terhadap permukaan. Kemiringan PI/2
menunjukkan bahwa alat tersebut 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
none
, orientasi tidak diketahui sehingga diatur ke 0. - Jika nilainya
interpolated
, orientasi diinterpolasi secara linear sedemikian rupa sehingga nilai mentahraw.orientation.min
memetakan ke-PI/2
dan nilai mentahraw.orientation.max
Maps kePI/2
. Nilai tengah(raw.orientation.min + raw.orientation.max) / 2
peta ke0
. - Jika nilainya adalah
vector
, orientasi ditafsirkan sebagai vektor yang dikemas dengan dua bidang 4-bit yang ditandatangani. Representasi ini digunakan pada bagian protokol berbasis objek Atmel. Saat didekodekan, vektor menghasilkan sudut orientasi dan besarnya kepercayaan diri. Besarnya kepercayaan diri digunakan untuk mengukur informasi ukuran, kecuali jika geometris. - Jika nilainya
default
, sistem menggunakan kalibrasiinterpolated
jika sumbu orientasi tersedia, jika tidak menggunakannone
.
Perhitungan
Perhitungan bidang orientation
dan tilt
tergantung 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
bidang jarak
Bidang distance
menggambarkan jarak antara alat dan permukaan perangkat sentuh. Nilai 0,0 menunjukkan kontak langsung dan nilai yang lebih besar menunjukkan peningkatan jarak 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
none
, jaraknya tidak diketahui sehingga diatur ke 0.Jika nilainya
scaled
, jarak yang dilaporkan dikalikan dengan faktor skala konstan.Jika nilainya
default
, sistem menggunakan kalibrasiscaled
jika sumbu jarak tersedia, jika tidak menggunakannone
.
Touch.Distance.Scale
Definisi: touch.distance.scale
Menentukan faktor skala konstan yang digunakan dalam kalibrasi.
Nilai defaultnya adalah 1.0
.
Perhitungan
Perhitungan bidang distance
tergantung 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 diperbarui untuk menggunakan properti konfigurasi baru.
Driver perangkat sentuh yang lebih tua mungkin juga perlu diperbarui.
File peta kunci virtual
Perangkat sentuh sering digunakan untuk mengimplementasikan kunci virtual.
Ada beberapa cara untuk melakukan ini, tergantung pada kemampuan pengontrol sentuh. Beberapa pengontrol sentuh dapat secara langsung dikonfigurasi untuk mengimplementasikan tombol lunak dengan mengatur register firmware. Di lain waktu diinginkan untuk melakukan pemetaan dari koordinat sentuh ke kode -kode kunci dalam perangkat lunak.
Ketika tombol virtual diimplementasikan dalam perangkat lunak, kernel harus mengekspor file peta kunci virtual yang disebut virtualkeys.<devicename>
Sebagai properti papan. Misalnya, jika driver perangkat layar sentuh melaporkan namanya sebagai "touchyfeely" maka file peta kunci virtual harus memiliki path /sys/board_properties/virtualkeys.touchyfeely
.
File peta kunci virtual menjelaskan kode kunci koordinat dan linux dari tombol virtual pada layar sentuh.
Selain file peta kunci virtual, harus ada file tata letak kunci yang sesuai dan file peta karakter kunci untuk memetakan kode kunci Linux ke kode kunci Android dan untuk menentukan jenis perangkat keyboard (biasanya SPECIAL_FUNCTION
).
Sintaksis
File peta kunci virtual adalah file teks biasa yang terdiri dari urutan deskripsi tata letak kunci virtual yang dipisahkan oleh Newline atau oleh Colons.
Baris komentar dimulai dengan '#' dan lanjutkan ke akhir baris.
Setiap kunci virtual dijelaskan oleh 6 komponen yang dibatasi oleh usus besar:
-
0x01
: kode versi. Harus selalu0x01
. - <Linux Key Code>: Kode kunci Linux dari kunci virtual.
- <tenterx>: Koordinat x piksel dari pusat kunci virtual.
- <Edery>: Koordinat piksel y dari pusat kunci virtual.
- <bulth>: Lebar kunci virtual dalam piksel.
- <tight>: Ketinggian kunci virtual dalam piksel.
Semua koordinat dan ukuran ditentukan dalam hal sistem koordinat tampilan.
Berikut adalah file peta kunci virtual yang semuanya ditulis pada 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 kunci virtual yang sama juga dapat ditulis pada 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
Dalam contoh di atas, layar sentuh memiliki resolusi 480x800. Dengan demikian, semua kunci virtual memiliki koordinat <Centery> 835, yang sedikit di bawah area yang terlihat dari layar sentuh.
Kunci pertama memiliki kode pemindaian Linux 158
( KEY_BACK
), Centre dari 55
, Centery dari 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 kunci: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
File peta karakter kunci: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Gerakan pointer multi-touch tidak langsung
Dalam mode pointer, sistem menafsirkan gerakan berikut:
- Tap jari tunggal: Klik.
- Gerakan jari tunggal: Pindahkan pointer.
- Tombol Tombol Tombol Plus Single Finger: Seret pointer.
- Gerakan dua jari kedua jari bergerak ke arah yang sama: seret area di bawah pointer ke arah itu. Pointer itu sendiri tidak bergerak.
- Gerakan dua jari kedua jari bergerak ke arah satu sama lain atau terpisah dalam arah yang berbeda: pan/skala/putar area di sekitar pointer. Pointer itu sendiri tidak bergerak.
- Gerakan beberapa jari: Gerakan bentuk bebas.
Penolakan Palm
Pada Android 13, sistem dapat secara otomatis menolak input dari telapak tangan ketika kerangka kerja bawaan diaktifkan. In-house, solusi yang dibuat khusus masih didukung, meskipun mereka mungkin perlu dimodifikasi untuk mengembalikan bendera TOOL_TYPE_PALM
ketika telapak tangan terdeteksi. Kerangka kerja bawaan juga berfungsi bersama dengan solusi khusus.
Model aktual melihat 90 ms pertama dari data gerakan, pada pointer saat ini, dan pada pointer di sekitarnya, kemudian mempertimbangkan seberapa jauh dari tepi tampilan sentuhan. Kemudian menentukan, berdasarkan per-pointer, manakah dari petunjuknya adalah telapak tangan. Ini juga memperhitungkan ukuran setiap kontak, seperti yang dilaporkan oleh touchMajor
dan touchMinor
. Kerangka Android kemudian menghilangkan petunjuk yang ditandai sebagai telapak tangan dari aliran sentuh.
Jika pointer sudah dikirim ke aplikasi, maka sistemnya juga:
- (Jika ada pointer aktif lainnya) membatalkan pointer dengan
ACTION_POINTER_UP
dan setFLAG_CANCELED
. - (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. Bendera ini diatur untuk ACTION_CANCEL
dan ACTION_POINTER_UP
.
Jika Palm Pointer tidak dikirim ke aplikasi, maka sistem hanya menjatuhkan pointer.
Aktifkan penolakan palem
- Di driver sentuh Anda, gunakan makro
input_abs_set_res
untuk mengatur resolusi untuk bidang berikut (unit adalah piksel per mm ):-
ABS_MT_POSITION_X
-
ABS_MT_POSITION_Y
-
ABS_MT_TOUCH_MAJOR
-
ABS_MT_TOUCH_MINOR
Dukungan untuk
ABS_MT_TOUCH_MINOR
adalah opsional. Namun, jika perangkat Anda mendukungnya, pastikan resolusi diatur dengan benar. -
- Untuk mengonfirmasi bidang diatur 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
- Konfirmasikan bahwa
adb shell dumpsys input
menunjukkan bahwa ada penolakan telapak tangan di dalamUnwantedInteractionBlocker
. Jika tidak, periksa log terkait input untuk menemukan petunjuk tentang apa yang mungkin salah konfigurasi.Lihat contoh berikut untuk 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**rc
Anda:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1