Perangkat Sentuh

Android mendukung berbagai layar sentuh dan bantalan sentuh, termasuk tablet digitizer berbasis stylus.

Layar sentuh adalah perangkat sentuh yang dikaitkan dengan tampilan sedemikian rupa sehingga pengguna memiliki kesan memanipulasi item di layar secara langsung.

Bantalan sentuh adalah perangkat sentuh yang tidak terkait dengan tampilan seperti tablet digitizer. Bantalan sentuh biasanya digunakan untuk menunjuk atau untuk penentuan posisi tidak langsung mutlak atau kontrol berbasis gerakan dari antarmuka pengguna.

Perangkat sentuh mungkin memiliki tombol yang fungsinya mirip dengan tombol mouse.

Perangkat sentuh terkadang dapat dimanipulasi menggunakan berbagai alat yang berbeda seperti jari atau stylus tergantung 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 berfungsi ganda sebagai bagian dari bantalan tombol sensitif sentuhan.

Karena banyaknya variasi perangkat sentuh, Android bergantung pada sejumlah besar properti konfigurasi untuk menggambarkan karakteristik dan perilaku yang diinginkan dari 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 dan ABS_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 multisentuh. Perangkat input diklasifikasikan sebagai perangkat sentuh tunggal atau sebagai perangkat multisentuh, tidak pernah keduanya.

  • Perangkat input melaporkan keberadaan sumbu absolut ABS_X dan ABS_Y , dan keberadaan kode kunci BTN_TOUCH .

Setelah 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 bagian di bawah ini tentang lokasi dan format file peta kunci virtual.

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 tujuan umum seperti USB eksternal atau layar sentuh atau bantalan sentuh Bluetooth HID. Default ini tidak dirancang untuk layar sentuh internal dan kemungkinan besar akan menghasilkan perilaku yang salah.

Setelah konfigurasi perangkat input dimuat, sistem akan mengklasifikasikan perangkat input sebagai layar sentuh, panel sentuh , atau perangkat penunjuk .

  • Perangkat layar sentuh digunakan untuk manipulasi langsung objek di layar. Karena pengguna secara langsung menyentuh layar, sistem tidak memerlukan biaya tambahan untuk menunjukkan objek yang sedang dimanipulasi.

  • Perangkat panel sentuh digunakan untuk memberikan informasi posisi mutlak ke aplikasi tentang sentuhan pada area sensor tertentu. Ini mungkin berguna untuk tablet digitizer.

  • Perangkat penunjuk digunakan untuk manipulasi objek secara tidak langsung di layar menggunakan kursor. Jari ditafsirkan sebagai gerakan penunjuk multi-sentuh. Alat lain, seperti stylus, diinterpretasikan menggunakan posisi absolut.

    Lihat Gerakan Penunjuk Multi-sentuh 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 akan disetel seperti yang ditunjukkan.

  • Jika perangkat input melaporkan keberadaan properti input INPUT_PROP_DIRECT (melalui EVIOCGPROP ioctl), maka jenis perangkat akan disetel 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 EVIOCGPROP ioctl), maka jenis perangkat akan diatur ke pointer .

  • Jika perangkat input melaporkan keberadaan sumbu relatif REL_X atau REL_Y , maka jenis perangkat akan disetel ke panel sentuh . Kondisi ini mengatasi ambiguitas untuk perangkat input yang terdiri dari mouse dan panel sentuh. Dalam hal ini, touch pad tidak akan digunakan untuk mengontrol pointer karena mouse sudah mengontrolnya.

  • Jika tidak, jenis perangkat akan disetel ke pointer . Default ini memastikan bahwa bantalan sentuh yang tidak ditujukan untuk tujuan khusus lainnya akan berfungsi untuk mengontrol penunjuk.

Tombol

Tombol adalah kontrol opsional yang dapat digunakan oleh aplikasi untuk melakukan fungsi tambahan. Tombol pada perangkat sentuh berperilaku mirip dengan tombol mouse dan terutama digunakan dengan perangkat sentuh jenis penunjuk atau dengan stylus.

Tombol-tombol berikut ini didukung:

  • BTN_LEFT : dipetakan ke MotionEvent.BUTTON_PRIMARY .

  • BTN_RIGHT : dipetakan ke MotionEvent.BUTTON_SECONDARY .

  • BTN_MIDDLE : dipetakan ke MotionEvent.BUTTON_MIDDLE .

  • BTN_BACK dan BTN_SIDE : dipetakan ke MotionEvent.BUTTON_BACK . Menekan tombol ini juga mensintesis penekanan tombol dengan kode kunci KeyEvent.KEYCODE_BACK .

  • BTN_FORWARD dan BTN_EXTRA : dipetakan ke MotionEvent.BUTTON_FORWARD . Menekan tombol ini juga mensintesis penekanan tombol dengan kode kunci KeyEvent.KEYCODE_FORWARD .

  • BTN_STYLUS : dipetakan ke MotionEvent.BUTTON_SECONDARY .

  • BTN_STYLUS2 : dipetakan ke MotionEvent.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 didukung:

  • BTN_TOOL_FINGER dan MT_TOOL_FINGER : dipetakan ke MotionEvent.TOOL_TYPE_FINGER .

  • BTN_TOOL_PEN dan MT_TOOL_PEN : dipetakan ke MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_RUBBER : dipetakan ke MotionEvent.TOOL_TYPE_ERASER .

  • BTN_TOOL_BRUSH : dipetakan ke MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_PENCIL : dipetakan ke MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_AIRBRUSH : dipetakan ke MotionEvent.TOOL_TYPE_STYLUS .

  • BTN_TOOL_MOUSE : dipetakan ke MotionEvent.TOOL_TYPE_MOUSE .

  • BTN_TOOL_LENS : dipetakan ke MotionEvent.TOOL_TYPE_MOUSE .

  • BTN_TOOL_DOUBLETAP , BTN_TOOL_TRIPLETAP , dan BTN_TOOL_QUADTAP : dipetakan ke MotionEvent.TOOL_TYPE_FINGER .

Alat Melayang vs. Menyentuh

Alat dapat bersentuhan dengan perangkat sentuh atau dalam jangkauan dan melayang di atasnya. Tidak semua perangkat sentuh dapat merasakan keberadaan alat yang melayang di atas perangkat sentuh. Mereka yang melakukannya, seperti digitizer stylus berbasis RF, sering dapat mendeteksi saat alat berada dalam jangkauan digitizer yang terbatas.

Komponen InputReader berhati-hati untuk membedakan alat sentuh dari alat melayang. Demikian juga, 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

  1. Driver perangkat sentuh hanya boleh mendaftarkan sumbu dan kode kunci untuk sumbu dan tombol yang benar-benar mereka dukung. Mendaftarkan sumbu berlebih atau kode kunci dapat membingungkan algoritme klasifikasi perangkat atau menyebabkan sistem salah mendeteksi kemampuan perangkat.

    Misalnya, jika perangkat melaporkan kode kunci BTN_TOUCH , sistem akan menganggap bahwa BTN_TOUCH akan selalu digunakan untuk menunjukkan apakah alat benar-benar menyentuh layar. Oleh karena itu, BTN_TOUCH tidak boleh digunakan untuk menunjukkan bahwa alat tersebut hanya dalam jangkauan dan melayang.

  2. Perangkat sekali sentuh menggunakan peristiwa input Linux berikut:

    • ABS_X : (DIPERLUKAN) Melaporkan koordinat X alat.

    • ABS_Y : (DIPERLUKAN) Melaporkan koordinat Y alat.

    • ABS_PRESSURE : (opsional) Melaporkan tekanan fisik yang diterapkan pada ujung pahat atau kekuatan sinyal dari kontak sentuh.

    • ABS_TOOL_WIDTH : (opsional) Melaporkan luas penampang atau lebar kontak sentuh atau alat itu sendiri.

    • ABS_DISTANCE : (opsional) Melaporkan jarak pahat 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 : (DIPERLUKAN) 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_QUADTAP BTN_TOOL_DOUBLETAP BTN_TOOL_TRIPLETAP

  3. Perangkat multisentuh menggunakan peristiwa input Linux berikut:

    • ABS_MT_POSITION_X : (DIPERLUKAN) Melaporkan koordinat X alat.

    • ABS_MT_POSITION_Y : (DIPERLUKAN) Melaporkan koordinat Y alat.

    • ABS_MT_PRESSURE : (opsional) Melaporkan tekanan fisik yang diterapkan pada ujung pahat atau kekuatan sinyal dari 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 jika ABS_MT_TOUCH_MAJOR melaporkan pengukuran area.

    • ABS_MT_WIDTH_MAJOR : (opsional) Melaporkan luas penampang pahat itu sendiri, atau panjang dimensi pahat itu sendiri yang lebih panjang. Sumbu ini tidak boleh digunakan jika dimensi alat itu sendiri tidak diketahui.

    • ABS_MT_WIDTH_MINOR : (opsional) Melaporkan panjang dari dimensi yang lebih pendek dari pahat itu sendiri. Sumbu ini tidak boleh digunakan jika ABS_MT_WIDTH_MAJOR melaporkan pengukuran area atau jika dimensi alat itu sendiri tidak diketahui.

    • ABS_MT_ORIENTATION : (opsional) Melaporkan orientasi alat.

    • ABS_MT_DISTANCE : (opsional) Melaporkan jarak pahat dari permukaan perangkat sentuh.

    • ABS_MT_TOOL_TYPE : (opsional) Melaporkan jenis pahat sebagai MT_TOOL_FINGER atau MT_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 keluar dari 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 : (DIPERLUKAN) 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_QUADTAP BTN_TOOL_DOUBLETAP BTN_TOOL_TRIPLETAP

  4. Jika sumbu untuk protokol satu-sentuh dan multi-sentuh ditentukan, maka hanya sumbu multi-sentuh yang akan digunakan dan sumbu sekali-sentuh akan diabaikan.

  5. Nilai minimum dan maksimum ABS_X , ABS_Y , ABS_MT_POSITION_X dan ABS_MT_POSITION_Y menentukan batas area aktif perangkat dalam unit permukaan khusus perangkat. Dalam kasus layar sentuh, area aktif menjelaskan bagian perangkat sentuh yang sebenarnya menutupi tampilan.

    Untuk layar sentuh, sistem secara otomatis menginterpolasi posisi sentuh yang dilaporkan dalam unit permukaan untuk mendapatkan posisi sentuh dalam piksel tampilan sesuai dengan 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 dikirim ke aplikasi tetapi dapat digunakan untuk kunci virtual.

    Sentuhan yang dimulai di dalam area aktif, atau yang masuk dan keluar dari area tampilan dikirim ke aplikasi. Akibatnya, jika sentuhan dimulai dalam batas aplikasi dan kemudian bergerak di luar area aktif, aplikasi dapat menerima peristiwa sentuhan 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, itu harus dilaporkan sebagai di luar area aktif, atau tidak boleh dilaporkan sama sekali.

    Misalnya, jika jari pengguna menyentuh di dekat sudut kiri atas layar sentuh, ini mungkin melaporkan koordinat (minX, minY). Jika jari terus bergerak lebih jauh di luar area aktif, layar sentuh harus 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 sentuh ke tepi layar menciptakan batas keras buatan di sekitar tepi layar yang mencegah sistem melacak dengan mulus gerakan yang masuk atau keluar dari batas area tampilan.

  6. Nilai yang dilaporkan oleh ABS_PRESSURE atau ABS_MT_PRESSURE , jika dilaporkan sama sekali, harus bukan nol saat pahat menyentuh perangkat dan nol untuk menunjukkan bahwa pahat melayang.

    Melaporkan informasi tekanan adalah opsional tetapi sangat disarankan. Aplikasi dapat menggunakan informasi tekanan untuk menerapkan gambar peka tekanan dan efek lainnya.

  7. Nilai yang dilaporkan oleh ABS_TOOL_WIDTH , ABS_MT_TOUCH_MAJOR , ABS_MT_TOUCH_MINOR , ABS_MT_WIDTH_MAJOR , atau ABS_MT_WIDTH_MINOR harus bukan nol saat pahat menyentuh perangkat dan nol jika tidak, tetapi ini tidak wajib. Misalnya, perangkat sentuh mungkin dapat mengukur ukuran kontak sentuh jari tetapi tidak dapat mengukur kontak sentuh stylus.

    Informasi ukuran pelaporan bersifat opsional tetapi sangat disarankan. Aplikasi dapat menggunakan informasi tekanan untuk menerapkan gambar peka ukuran dan efek lainnya.

  8. Nilai yang dilaporkan oleh ABS_DISTANCE atau ABS_MT_DISTANCE harus mendekati nol saat pahat menyentuh perangkat. Jarak mungkin tetap tidak nol bahkan saat alat bersentuhan langsung. Nilai pasti yang dilaporkan bergantung pada cara perangkat keras mengukur jarak.

    Melaporkan informasi jarak adalah opsional tetapi disarankan untuk perangkat stilus.

  9. Nilai yang dilaporkan oleh ABS_TILT_X dan ABS_TILT_Y harus nol saat pahat tegak lurus dengan perangkat. Kemiringan bukan nol diambil sebagai indikasi bahwa pahat ditahan pada 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 tengah menunjukkan kemiringan ke atas atau ke kiri, nilai yang lebih besar dari titik tengah menunjukkan kemiringan ke bawah atau ke kanan.

    InputReader mengubah komponen kemiringan X dan Y menjadi sudut kemiringan tegak lurus mulai dari 0 hingga PI / 2 radian dan sudut orientasi planar mulai dari -PI hingga PI radian. Representasi ini menghasilkan deskripsi orientasi yang sesuai dengan apa yang digunakan untuk menggambarkan sentuhan jari.

    Melaporkan informasi kemiringan adalah opsional tetapi disarankan untuk perangkat stylus.

  10. Jika jenis pahat dilaporkan oleh ABS_MT_TOOL_TYPE , itu akan menggantikan informasi jenis pahat apa pun yang dilaporkan oleh BTN_TOOL_* . Jika tidak ada informasi jenis alat yang tersedia sama sekali, jenis alat secara default MotionEvent.TOOL_TYPE_FINGER .

  11. Sebuah alat ditentukan untuk aktif berdasarkan kondisi berikut:

    • Saat menggunakan protokol sekali sentuh, alat ini aktif jika BTN_TOUCH , atau BTN_TOOL_* adalah 1.

      Kondisi ini menyiratkan bahwa InputReader harus memiliki setidaknya beberapa informasi tentang sifat alat, apakah itu menyentuh, atau setidaknya jenis alatnya. Jika tidak ada informasi yang tersedia, maka alat dianggap tidak aktif (di luar jangkauan).

    • Saat menggunakan protokol multi-sentuh 'A', alat ini aktif setiap kali muncul di laporan sinkronisasi terbaru. Saat alat berhenti muncul di laporan sinkronisasi, alat itu 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.

  12. Sebuah alat ditentukan untuk melayang berdasarkan kondisi berikut:

    • Jika alat tersebut adalah BTN_TOOL_MOUSE atau BTN_TOOL_LENS , maka alat tersebut tidak melayang, meskipun salah satu dari kondisi berikut ini benar.

    • Jika pahat aktif dan pengemudi melaporkan informasi tekanan, dan tekanan yang dilaporkan adalah nol, maka pahat melayang.

    • Jika alat aktif dan driver mendukung kode kunci BTN_TOUCH dan BTN_TOUCH bernilai nol, maka alat melayang.

  13. InputReader mendukung protokol multi-sentuh 'A' dan 'B'. Pengemudi baru harus menggunakan protokol 'B' tetapi keduanya akan berfungsi.

  14. Pada Android Ice Cream Sandwich 4.0, driver layar sentuh mungkin perlu diubah agar sesuai dengan spesifikasi protokol input Linux.

    Perubahan berikut mungkin diperlukan:

    • Saat alat menjadi tidak aktif (jari naik "ke atas"), alat itu akan berhenti muncul di laporan sinkronisasi multisentuh berikutnya. Ketika semua alat menjadi tidak aktif (semua jari "naik"), driver harus mengirim paket laporan sinkronisasi kosong, seperti SYN_MT_REPORT diikuti oleh SYN_REPORT .

      Versi Android sebelumnya mengharapkan peristiwa "naik" dilaporkan dengan mengirimkan nilai tekanan 0. Perilaku lama tidak kompatibel dengan spesifikasi protokol input Linux dan tidak lagi didukung.

    • Tekanan fisik atau informasi 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 input Linux dan tidak lagi didukung.

    • Informasi ukuran sentuh 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 input Linux dan tidak lagi didukung.

    Driver perangkat sentuh tidak lagi memerlukan penyesuaian khusus Android. Dengan mengandalkan protokol input Linux standar, Android dapat mendukung berbagai periferal sentuh yang lebih luas, seperti layar sentuh multi-sentuh HID eksternal, menggunakan driver yang tidak dimodifikasi.

Operasi Perangkat Sentuh

Berikut ini adalah ringkasan singkat tentang pengoperasian perangkat sentuh di Android.

  1. EventHub membaca kejadian mentah dari driver evdev .

  2. InputReader menggunakan kejadian mentah dan memperbarui status internal tentang posisi dan karakteristik lain dari setiap alat. Ini juga melacak status tombol.

  3. Jika tombol BACK atau FORWARD ditekan atau dilepaskan, InputReader memberi tahu InputDispatcher tentang peristiwa kunci.

  4. InputReader menentukan apakah penekanan tombol virtual terjadi. Jika demikian, ini akan memberi tahu InputDispatcher tentang acara kunci.

  5. InputReader menentukan apakah sentuhan dimulai dalam batas tampilan. Jika demikian, ini akan memberi tahu InputDispatcher tentang acara sentuh.

  6. Jika tidak ada alat sentuh tetapi setidaknya ada satu alat melayang, InputReader memberi tahu InputDispatcher tentang acara melayang.

  7. Jika jenis perangkat sentuh adalah penunjuk , InputReader melakukan deteksi gerakan penunjuk, menggerakkan penunjuk dan titik yang sesuai dan memberi tahu InputDispatcher tentang peristiwa penunjuk.

  8. InputDispatcher menggunakan WindowManagerPolicy untuk menentukan apakah peristiwa harus dikirim dan apakah harus membangunkan perangkat. Kemudian, InputDispatcher mengirimkan acara 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 detail selengkapnya tentang file yang berpartisipasi dalam konfigurasi keyboard:

Properti

Sistem bergantung pada banyak properti konfigurasi perangkat input untuk mengonfigurasi dan mengkalibrasi perilaku perangkat sentuh.

Salah satu alasannya adalah bahwa driver perangkat untuk perangkat sentuh sering melaporkan karakteristik sentuhan menggunakan unit khusus perangkat.

Misalnya, banyak perangkat sentuh mengukur area kontak sentuh menggunakan skala khusus perangkat internal, seperti jumlah total node sensor yang dipicu oleh sentuhan. Nilai ukuran mentah ini tidak akan berarti bagi aplikasi karena mereka perlu mengetahui tentang 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 akan menggunakan konvensi berikut untuk menggambarkan 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 atau ABS_MT_POSITION_X .
raw.y
Nilai sumbu ABS_Y atau ABS_MT_POSITION_Y .
raw.pressure
Nilai sumbu ABS_PRESSURE atau ABS_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 , atau raw.touchMajor jika tidak tersedia.
raw.toolMajor
Nilai sumbu ABS_TOOL_WIDTH atau ABS_MT_WIDTH_MAJOR , atau 0 jika tidak tersedia.
raw.toolMinor
Nilai sumbu ABS_MT_WIDTH_MINOR , atau raw.toolMajor jika tidak tersedia.
raw.orientation
Nilai sumbu ABS_MT_ORIENTATION , atau 0 jika tidak tersedia.
raw.distance
Nilai sumbu ABS_DISTANCE atau ABS_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-nilai yang akurat untuk +/- 1 unit.
raw.width
Lebar inklusif area sentuh, setara dengan raw.x.range + 1 .
raw.height
Ketinggian inklusif dari area sentuh, setara dengan raw.y.range + 1 .

Rentang Keluaran

Ekspresi berikut menunjukkan karakteristik sistem koordinat keluaran. Sistem menggunakan interpolasi linier untuk menerjemahkan informasi posisi sentuh dari unit permukaan yang digunakan oleh perangkat sentuh ke dalam unit keluaran yang akan dilaporkan ke aplikasi seperti piksel tampilan.

output.width
Lebar keluaran. Untuk layar sentuh (terkait dengan tampilan), ini adalah lebar tampilan dalam piksel. Untuk bantalan sentuh (tidak terkait dengan tampilan), lebar keluaran sama dengan raw.width , yang menunjukkan bahwa tidak ada interpolasi yang akan dilakukan.
output.height
Tinggi keluaran. Untuk layar sentuh (terkait dengan tampilan), ini adalah tinggi tampilan dalam piksel. Untuk bantalan sentuh (tidak terkait dengan tampilan), tinggi keluaran sama dengan raw.height , yang menunjukkan bahwa tidak ada interpolasi yang akan 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 dalam 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.

touch.deviceType

Definisi: touch.deviceType = touchScreen | touchPad | pointer | default

Menentukan jenis perangkat sentuh.

  • Jika nilainya adalah touchScreen sentuh , perangkat sentuh adalah layar sentuh yang terkait dengan tampilan.

  • Jika nilainya adalah touchPad sentuh , perangkat sentuh adalah panel sentuh yang tidak terkait dengan layar.

  • Jika nilainya adalah pointer , perangkat sentuh adalah bantalan sentuh yang tidak terkait dengan tampilan, 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 detail selengkapnya tentang bagaimana jenis perangkat memengaruhi perilaku perangkat sentuh.

Sebelum Honeycomb, semua perangkat sentuh diasumsikan sebagai layar sentuh.

touch.orientationAware

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 default adalah 1 jika perangkat 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 layar 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, ketika perangkat diputar searah jarum jam 90 derajat dari orientasi alaminya, posisi absolut sentuhan dipetakan ulang sedemikian rupa sehingga sentuhan di sudut 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 dianggap sadar akan orientasi.

touch.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 pointer , gerakan panel sentuh disajikan dengan cara kursor mirip dengan pointer mouse.

  • Jika nilainya adalah spots , gerakan bantalan sentuh disajikan oleh jangkar yang mewakili pusat gerakan dan sekumpulan titik melingkar yang mewakili posisi masing-masing jari.

Nilai default adalah pointer ketika properti input INPUT_PROP_SEMI_MT disetel, atau spots sebaliknya.

Bidang X dan Y

Bidang X dan Y memberikan informasi posisi untuk pusat bidang 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 Size

Bidang TouchMajor dan TouchMinor menjelaskan perkiraan dimensi area kontak dalam unit keluaran (piksel).

Bidang ToolMajor dan ToolMinor menjelaskan perkiraan dimensi alat itu sendiri dalam unit 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 terukur), 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. Ketika hanya perkiraan diameter bidang kontak yang dapat diukur, maka bidang TouchMajor dan TouchMinor akan sama.

Demikian juga, bidang ToolMajor menentukan dimensi yang lebih panjang dan bidang ToolMinor menentukan dimensi yang lebih pendek dari area penampang alat.

Jika ukuran sentuh tidak tersedia tetapi ukuran pahat tersedia, maka ukuran pahat akan disetel sama dengan ukuran sentuh. Sebaliknya, jika ukuran pahat tidak tersedia tetapi ukuran sentuh tersedia, maka ukuran sentuh akan disetel sama dengan ukuran pahat.

Perangkat sentuh mengukur atau melaporkan ukuran sentuh dan ukuran alat dengan berbagai cara. Implementasi saat ini mendukung tiga jenis pengukuran yang berbeda: diameter, luas, dan kotak pembatas geometris dalam satuan permukaan.

touch.size.calibration

Definisi: 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 none , ukurannya disetel ke nol.

  • Jika nilainya geometric , ukuran diasumsikan ditentukan dalam satuan permukaan yang sama dengan posisinya, sehingga diskalakan dengan cara yang sama.

  • Jika nilainya diameter , maka ukuran diasumsikan sebanding dengan diameter (lebar) alat sentuh atau alat.

  • Jika nilainya adalah area , ukuran diasumsikan sebanding dengan luas sentuhan atau alat.

  • Jika nilainya default , sistem akan menggunakan kalibrasi geometric jika sumbu raw.touchMajor atau raw.toolMajor tersedia, jika tidak maka sistem akan menggunakan kalibrasi none .

touch.size.scale

Definisi: touch.size.scale = <bilangan floating point non-negatif>

Menentukan faktor skala konstan yang digunakan dalam kalibrasi.

Nilai defaultnya adalah 1.0 .

touch.size.bias

Definisi: touch.size.bias = <bilangan floating point non-negatif>

Menentukan nilai bias konstan yang digunakan dalam kalibrasi.

Nilai defaultnya 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 1 , ukuran yang dilaporkan akan dibagi dengan jumlah kontak sebelum digunakan.

  • Jika nilainya 0 , ukuran yang dilaporkan akan digunakan apa adanya.

Nilai defaultnya adalah 0 .

Beberapa perangkat sentuh, khususnya perangkat "Semi-MT" tidak dapat membedakan dimensi individual dari beberapa kontak sehingga mereka melaporkan pengukuran ukuran yang mewakili total area atau lebarnya. Properti ini hanya boleh disetel ke 1 untuk perangkat tersebut. Jika ragu, setel nilai ini ke 0 .

Perhitungan

Perhitungan bidang TouchMajor , TouchMinor , ToolMajor , ToolMinor dan Size tergantung 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 Pressure

Bidang Pressure menjelaskan 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.

touch.pressure.calibration

Definisi: touch.pressure.calibration = none | physical | amplitude | default

Menentukan jenis pengukuran yang digunakan oleh driver sentuh untuk melaporkan tekanan.

  • Jika nilainya none , tekanannya tidak diketahui sehingga disetel ke 1,0 saat menyentuh dan 0,0 saat melayang.

  • Jika nilainya physical , sumbu tekanan diasumsikan mengukur intensitas fisik sebenarnya dari tekanan yang diterapkan pada panel sentuh.

  • If the value is amplitude , the pressure axis is assumed to measure the signal amplitude, which is related to the size of the contact and the pressure applied.

  • If the value is default , the system uses the physical calibration if the pressure axis available, otherwise uses none .

touch.pressure.scale

Definition: touch.pressure.scale = <a non-negative floating point number>

Specifies a constant scale factor used in the calibration.

The default value is 1.0 / raw.pressure.max .

Calculation

The calculation of the Pressure field depends on the specified calibration parameters.

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

Orientation and Tilt Fields

The Orientation field describes the orientation of the touch and tool as an angular measurement. An orientation of 0 indicates that the major axis is oriented vertically, -PI/2 indicates that the major axis is oriented to the left, PI/2 indicates that the major axis is oriented to the right. When a stylus tool is present, the orientation range may be described in a full circle range from -PI or PI .

The Tilt field describes the inclination of the tool as an angular measurement. A tilt of 0 indicates that the tool is perpendicular to the surface. A tilt of PI/2 indicates that the tool is flat on the surface.

touch.orientation.calibration

Definition: touch.orientation.calibration = none | interpolated | vector | default

Specifies the kind of measurement used by the touch driver to report the orientation.

  • If the value is none , the orientation is unknown so it is set to 0.

  • If the value is interpolated , the orientation is linearly interpolated such that a raw value of raw.orientation.min maps to -PI/2 and a raw value of raw.orientation.max maps to PI/2 . The center value of (raw.orientation.min + raw.orientation.max) / 2 maps to 0 .

  • If the value is vector , the orientation is interpreted as a packed vector consisiting of two signed 4-bit fields. This representation is used on Atmel Object Based Protocol parts. When decoded, the vector yields an orientation angle and confidence magnitude. The confidence magnitude is used to scale the size information, unless it is geometric.

  • If the value is default , the system uses the interpolated calibration if the orientation axis available, otherwise uses none .

Calculation

The calculation of the Orientation and Tilt fields depends on the specified calibration parameters and available input.

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

Distance Field

The Distance field describes the distance between the tool and the touch device surface. A value of 0.0 indicates direct contact and larger values indicate increasing distance from the surface.

touch.distance.calibration

Definition: touch.distance.calibration = none | scaled | default

Specifies the kind of measurement used by the touch driver to report the distance.

  • If the value is none , the distance is unknown so it is set to 0.

  • If the value is scaled , the reported distance is multiplied by a constant scale factor.

  • If the value is default , the system uses the scaled calibration if the distance axis available, otherwise uses none .

touch.distance.scale

Definition: touch.distance.scale = <a non-negative floating point number>

Specifies a constant scale factor used in the calibration.

The default value is 1.0 .

Calculation

The calculation of the Distance field depends on the specified calibration parameters.

If touch.distance.calibration == "scaled":
    output.distance = raw.distance * touch.distance.scale
Else
    output.distance = 0
End If

Example

# 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 will 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

Compatibility Notes

The configuration properties for touch devices changed significantly in Android Ice Cream Sandwich 4.0. All input device configuration files for touch devices must be updated to use the new configuration properties.

Older touch device drivers may also need to be updated.

Virtual Key Map Files

Touch devices are often used to implement virtual keys.

There are several ways of doing this, depending on the capabilities of the touch controller. Some touch controllers can be directly configured to implement soft keys by setting firmware registers. Other times it is desirable to perform the mapping from touch coordinates to key codes in software.

When virtual keys are implemented in software, the kernel must export a virtual key map file called virtualkeys.<devicename> as a board property. For example, if the touch screen device drivers reports its name as "touchyfeely" then the virtual key map file must have the path /sys/board_properties/virtualkeys.touchyfeely .

A virtual key map file describes the coordinates and Linux key codes of virtual keys on the touch screen.

In addition to the virtual key map file, there must be a corresponding key layout file and key character map file to map the Linux key codes to Android key codes and to specify the type of the keyboard device (usually SPECIAL_FUNCTION ).

Syntax

A virtual key map file is a plain text file consisting of a sequence of virtual key layout descriptions either separated by newlines or by colons.

Comment lines begin with '#' and continue to the end of the line.

Each virtual key is described by 6 colon-delimited components:

  • 0x01 : A version code. Must always be 0x01 .
  • <Linux key code>: The Linux key code of the virtual key.
  • <centerX>: The X pixel coordinate of the center of the virtual key.
  • <centerY>: The Y pixel coordinate of the center of the virtual key.
  • <width>: The width of the virtual key in pixels.
  • <height>: The height of the virtual key in pixels.

All coordinates and sizes are specified in terms of the display coordinate system.

Here is a virtual key map file all written on one line.

# 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

The same virtual key map file can also be written on multiple lines.

# 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

In the above example, the touch screen has a resolution of 480x800. Accordingly, all of the virtual keys have a <centerY> coordinate of 835, which is a little bit below the visible area of the touch screen.

The first key has a Linux scan code of 158 ( KEY_BACK ), centerX of 55 , centerY of 835 , width of 90 and height of 55 .

Example

Virtual key map file: /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

Key layout file: /system/usr/keylayout/touchyfeely.kl .

key 158 BACK
key 139 MENU
key 172 HOME
key 217 SEARCH

Key character map file: /system/usr/keychars/touchyfeely.kcm .

type SPECIAL_FUNCTION

Indirect Multi-touch Pointer Gestures

In pointer mode, the system interprets the following gestures:

  1. Single finger tap: click.

  2. Single finger motion: move the pointer.

  3. Single finger motion plus button presses: drag the pointer.

  4. Two finger motion both fingers moving in the same direction: drag the area under the pointer in that direction. The pointer itself does not move.

  5. Two finger motion both fingers moving towards each other or apart in different directions: pan/scale/rotate the area surrounding the pointer. The pointer itself does not move.

  6. Multiple finger motion: freeform gesture.

Further Reading

  1. Linux multi-touch protocol
  2. ENAC list of available multitouch devices on Linux