Perangkat sentuh

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 dan ABS_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 dan ABS_Y , serta keberadaan kode kunci BTN_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 (melalui EVIOCGPROP 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 (melalui EVIOCGPROP ioctl), maka jenis perangkat disetel ke pointer .
  • Jika perangkat input melaporkan keberadaan sumbu relatif REL_X atau REL_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 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 menyatukan penekanan tombol dengan kode kunci KeyEvent.KEYCODE_BACK .
  • BTN_FORWARD dan BTN_EXTRA : Dipetakan ke MotionEvent.BUTTON_FORWARD . Menekan tombol ini juga menyatukan 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 ini 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 .

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 bahwa BTN_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 : (opsional) 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 jika ABS_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 jika ABS_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 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 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 : (opsional) 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 , dan ABS_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 atau ABS_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 , atau ABS_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 atau ABS_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 dan ABS_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 hingga PI / 2 radian dan sudut orientasi planar mulai dari -PI hingga PI 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 oleh BTN_TOOL_* . Jika tidak ada informasi jenis alat yang tersedia sama sekali, jenis alat akan ditetapkan secara default ke MotionEvent.TOOL_TYPE_FINGER .

  • Suatu alat ditentukan aktif berdasarkan ketentuan sebagai berikut:

    • Saat menggunakan protokol sekali sentuh, alat akan aktif jika BTN_TOUCH , atau BTN_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 atau BTN_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 dan BTN_TOUCH bernilai nol, maka alat tersebut melayang.
  • 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 oleh SYN_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.

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

Sentuh pengoperasian perangkat

Berikut ringkasan singkat pengoperasian perangkat sentuh di Android.

  1. EventHub membaca kejadian mentah dari driver evdev .
  2. InputReader menggunakan peristiwa mentah dan memperbarui keadaan internal tentang posisi dan karakteristik lain dari setiap alat. Ini juga melacak status tombol.
  3. Jika BACK atau FORWARD ditekan atau dilepaskan, InputReader memberi tahu InputDispatcher tentang peristiwa penting.
  4. InputReader menentukan apakah terjadi penekanan tombol virtual. Jika demikian, ini akan memberi tahu InputDispatcher tentang peristiwa penting tersebut.
  5. InputReader menentukan apakah sentuhan dimulai dalam batas-batas tampilan. Jika demikian, ia akan memberitahukan InputDispatcher tentang peristiwa sentuhan.
  6. Jika tidak ada alat yang menyentuh tetapi setidaknya ada satu alat yang melayang, InputReader memberi tahu InputDispatcher tentang peristiwa melayang tersebut.
  7. Jika jenis perangkat sentuh adalah pointer , InputReader melakukan deteksi gerakan penunjuk, menggerakkan penunjuk dan titik yang sesuai, serta memberi tahu InputDispatcher tentang peristiwa penunjuk.
  8. InputDispatcher menggunakan WindowManagerPolicy 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 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 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 output (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 kalibrasi geometric jika sumbu raw.touchMajor atau raw.toolMajor tersedia, jika tidak maka sistem akan menggunakan kalibrasi none .

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 (tekanan normal).

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 kalibrasi physical jika sumbu tekanan tersedia, jika tidak, tidak akan menggunakan none .

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 tergantung 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 mentah raw.orientation.min memetakan ke -PI/2 dan nilai mentah raw.orientation.max Maps ke PI/2 . Nilai tengah (raw.orientation.min + raw.orientation.max) / 2 peta ke 0 .
  • 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 kalibrasi interpolated jika sumbu orientasi tersedia, jika tidak menggunakan none .

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 kalibrasi scaled jika sumbu jarak tersedia, jika tidak menggunakan none .

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 dapat 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 selalu 0x01 .
  • <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 telapak tangan

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 set FLAG_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

  1. 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.

  2. Untuk mengonfirmasi bidang diatur dengan benar, jalankan:
        $ adb shell getevent -li
    
  3. Untuk mengaktifkan fitur selama runtime, jalankan:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Mulai ulang proses system_server .
         $ adb shell stop && adb shell start
        
  5. Konfirmasikan bahwa adb shell dumpsys input menunjukkan bahwa ada penolakan telapak tangan di dalam UnwantedInteractionBlocker . 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: {}
    
  6. 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
    

Bacaan lebih lanjut

,

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

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

Touch Pads adalah perangkat sentuh yang tidak terkait dengan layar, seperti tablet digitizer. Touch bantalan biasanya digunakan untuk menunjuk atau untuk penentuan posisi tidak langsung absolut atau kontrol berbasis gerakan dari antarmuka pengguna.

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

Perangkat sentuh kadang -kadang 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 memanjang melampaui tepi tampilan dan melayani tujuan ganda sebagai bagian dari bantalan kunci yang sensitif terhadap sentuhan.

Karena banyaknya 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 multi-sentuh jika kedua kondisi berikut berlaku:

  • 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 gamepads tertentu yang melaporkan sumbu dengan kode yang tumpang tindih dengan sumbu MT.

Perangkat input diklasifikasikan sebagai perangkat sentuhan tunggal jika kedua kondisi berikut berlaku:

  • Perangkat input tidak diklasifikasikan sebagai perangkat multi-sentuh. Perangkat input diklasifikasikan sebagai perangkat sentuhan tunggal atau sebagai perangkat multi-sentuh, tidak pernah keduanya.
  • Perangkat input melaporkan keberadaan sumbu absolut ABS_X dan ABS_Y , dan keberadaan kode kunci BTN_TOUCH .

Ketika perangkat input diklasifikasikan sebagai perangkat sentuh, keberadaan tombol virtual ditentukan dengan mencoba memuat file peta kunci virtual untuk perangkat. Jika peta kunci virtual tersedia, maka file tata letak kunci untuk perangkat juga dimuat. Lihat [File Peta Kunci Virtual] (#Virtual-Key-Map-Files) untuk informasi tentang tentang lokasi dan format file-file ini.

Selanjutnya, sistem 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 memilih konfigurasi default yang sesuai untuk periferal sentuh tujuan umum seperti USB eksternal atau layar sentuh HID Bluetooth atau bantalan sentuh. Default ini tidak dirancang untuk layar sentuh bawaan dan dapat menghasilkan perilaku yang salah.

Setelah konfigurasi perangkat input dimuat, sistem mengklasifikasikan perangkat input sebagai layar sentuh , pad sentuh , atau perangkat pointer .

  • Perangkat layar sentuh digunakan untuk manipulasi langsung objek di layar. Pengguna secara langsung menyentuh layar, sehingga sistem tidak memerlukan biaya tambahan untuk menunjukkan objek yang dimanipulasi.
  • Perangkat pad sentuh digunakan untuk memberikan informasi penentuan posisi absolut ke aplikasi tentang sentuhan pada area sensor yang diberikan. Ini bisa berguna untuk tablet digitizer.
  • Perangkat pointer digunakan untuk manipulasi tidak langsung objek di layar menggunakan kursor. Jari-jari ditafsirkan sebagai gerakan pointer multi-sentuh. Alat lain, seperti stylus, ditafsirkan menggunakan posisi absolut. Lihat Gerakan Pointer Multi-Touch Tidak Langsung untuk informasi lebih lanjut.

Aturan berikut digunakan untuk mengklasifikasikan perangkat input sebagai layar sentuh, pad sentuh, atau perangkat pointer.

  • Jika properti touch.deviceType diatur, maka jenis perangkat diatur seperti yang ditunjukkan.
  • Jika perangkat input melaporkan keberadaan properti input INPUT_PROP_DIRECT (melalui EVIOCGPROP ioctl), maka jenis perangkat diatur ke layar sentuh . Kondisi ini mengasumsikan bahwa perangkat sentuh input langsung dilampirkan ke tampilan yang juga terhubung.
  • Jika perangkat input melaporkan keberadaan properti input INPUT_PROP_POINTER (melalui Ioctl EVIOCGPROP ), maka jenis perangkat diatur ke pointer .
  • Jika perangkat input melaporkan keberadaan sumbu relatif REL_X atau REL_Y , maka jenis perangkat diatur ke pad sentuh . Kondisi ini menyelesaikan ambiguitas untuk perangkat input yang terdiri dari mouse dan pad sentuh. Dalam hal ini, pad sentuh tidak digunakan untuk mengontrol pointer karena mouse sudah mengendalikannya.
  • Kalau tidak, jenis perangkat diatur ke pointer . Default ini memastikan bahwa bantalan sentuh yang belum ditetapkan untuk mengontrol pointer tujuan khusus lainnya.

Tombol

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

Tombol -tombol berikut 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 tombol tekan dengan kode tombol KeyEvent.KEYCODE_BACK .
  • BTN_FORWARD dan BTN_EXTRA : dipetakan ke MotionEvent.BUTTON_FORWARD . Menekan tombol ini juga mensintesis tombol tekan dengan kode tombol KeyEvent.KEYCODE_FORWARD .
  • BTN_STYLUS : dipetakan ke MotionEvent.BUTTON_SECONDARY .
  • BTN_STYLUS2 : dipetakan ke MotionEvent.BUTTON_TERTIARY .

Jenis Alat dan Alat

Alat adalah jari, stylus, atau peralatan lain yang digunakan untuk berinteraksi dengan perangkat sentuh. Beberapa perangkat sentuh dapat membedakan antara berbagai jenis alat.

Di tempat lain di Android, seperti di API MotionEvent , sebuah alat sering disebut sebagai penunjuk .

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 .

Melayang versus alat 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 melakukan, seperti digitizer stylus berbasis RF, sering dapat mendeteksi ketika alat berada dalam kisaran digitizer terbatas.

Komponen InputReader membedakan alat yang menyentuh dari melayang. Demikian juga, alat menyentuh dan alat melayang dilaporkan ke aplikasi dengan cara yang berbeda.

Alat menyentuh 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 gerak generik menggunakan MotionEvent.ACTION_HOVER_ENTER , MotionEvent.ACTION_HOVER_MOVE , dan MotionEvent.ACTION_HOVER_EXIT .

Sentuh Persyaratan Driver Perangkat

  • Touch Device Driver hanya harus mendaftarkan sumbu dan kode kunci untuk sumbu dan tombol yang mereka dukung. 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 mengasumsikan bahwa BTN_TOUCH selalu digunakan untuk menunjukkan apakah alat menyentuh layar. Oleh karena itu, BTN_TOUCH tidak boleh digunakan untuk menunjukkan bahwa alat ini hanya dalam jangkauan dan melayang.
  • Perangkat satu sentuhan menggunakan peristiwa input Linux berikut:
    • ABS_X : (Diperlukan) melaporkan koordinat x alat.
    • ABS_Y : (wajib) melaporkan koordinat Y dari alat.
    • ABS_PRESSURE : (Opsional) melaporkan tekanan fisik yang diterapkan pada ujung alat atau kekuatan sinyal dari kontak sentuh.
    • ABS_TOOL_WIDTH : (Opsional) melaporkan area cross-sectional 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 : (Diperlukan) menunjukkan apakah alat menyentuh perangkat.
    • BTN_LEFT , BTN_RIGHT , BTN_MIDDLE , BTN_SIDE , BTN_FORWARD , BTN_EXTRA BTN_BACK btn_extra, BTN_STYLUS , BTN_STYLUS2 : (opsional) Laporan menyatakan tombol .
    • BTN_TOOL_FINGER , BTN_TOOL_PEN BTN_TOOL_LENS BTN_TOOL_BRUSH BTN_TOOL_TRIPLETAP BTN_TOOL_RUBBER BTN_TOOL_QUADTAP BTN_TOOL_AIRBRUSH BTN_TOOL_DOUBLETAP BTN_TOOL_PENCIL , BTN_TOOL_MOUSE jenis alat .
  • Perangkat multi-touch menggunakan peristiwa input Linux berikut:
    • ABS_MT_POSITION_X : (Diperlukan) melaporkan koordinat x alat.
    • ABS_MT_POSITION_Y : (Diperlukan) melaporkan koordinat Y dari alat.
    • ABS_MT_PRESSURE : (Opsional) melaporkan tekanan fisik yang diterapkan pada ujung alat atau kekuatan sinyal dari kontak sentuh.
    • ABS_MT_TOUCH_MAJOR : (Opsional) melaporkan area cross-sectional dari kontak sentuh, atau panjang dimensi yang lebih panjang dari kontak sentuh.
    • 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 area cross-sectional dari alat itu sendiri, atau panjang dimensi yang lebih panjang dari alat itu sendiri. Jangan gunakan sumbu ini kecuali Anda tahu dimensi alat itu sendiri.
    • ABS_MT_WIDTH_MINOR : (Opsional) melaporkan panjang dimensi yang lebih pendek dari alat 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 alat dari permukaan perangkat sentuh.
    • ABS_MT_TOOL_TYPE : (Opsional) melaporkan jenis alat sebagai MT_TOOL_FINGER atau MT_TOOL_PEN .
    • ABS_MT_TRACKING_ID : (Opsional) melaporkan ID pelacakan alat. ID pelacakan adalah bilangan bulat non-negatif yang sewenang-wenang 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 tetap bersentuhan. Pelacakan ID dapat digunakan kembali ketika alat terkait mereka keluar dari jangkauan.
    • ABS_MT_SLOT : (Opsional) melaporkan ID slot alat, saat menggunakan protokol multi-touch 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_SIDE , BTN_FORWARD , BTN_EXTRA BTN_BACK btn_extra, BTN_STYLUS , BTN_STYLUS2 : (opsional) Laporan menyatakan tombol .
    • BTN_TOOL_FINGER , BTN_TOOL_PEN BTN_TOOL_LENS BTN_TOOL_BRUSH BTN_TOOL_TRIPLETAP BTN_TOOL_RUBBER BTN_TOOL_QUADTAP BTN_TOOL_AIRBRUSH BTN_TOOL_DOUBLETAP BTN_TOOL_PENCIL , BTN_TOOL_MOUSE jenis alat .
  • Jika sumbu untuk protokol sentuhan tunggal dan multi-sentuh didefinisikan, maka hanya sumbu multi-touch yang digunakan dan sumbu sentuhan tunggal diabaikan.
  • Nilai minimum dan maksimum dari ABS_X , ABS_Y , ABS_MT_POSITION_X , dan ABS_MT_POSITION_Y AXES menentukan batas-batas area aktif perangkat dalam unit permukaan khusus perangkat. Dalam kasus layar sentuh, area aktif menggambarkan bagian perangkat sentuh yang benar -benar menutupi layar.

    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 -batas aplikasi dan kemudian bergerak di luar area aktif, aplikasi mungkin menerima acara sentuh dengan koordinat tampilan yang negatif atau di luar batas layar. Ini adalah perilaku yang diharapkan.

    Perangkat sentuh tidak boleh menjepit sentuh koordinat ke batas -batas area aktif. Jika sentuhan keluar dari area aktif, itu harus dilaporkan berada di luar area aktif, atau tidak boleh dilaporkan sama sekali.

    Misalnya, jika jari pengguna menyentuh di dekat sudut kiri atas layar sentuh, itu mungkin melaporkan koordinat (Minx, Miny). Jika jari terus bergerak lebih jauh di luar area aktif, layar sentuh harus mulai melaporkan koordinat dengan komponen 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.

    Koordinat sentuhan penjepit ke tepi tampilan menciptakan batas keras buatan di sekitar tepi layar yang mencegah sistem dari gerakan pelacakan yang lancar yang masuk atau keluar dari batas area tampilan.

  • Nilai-nilai yang dilaporkan oleh ABS_PRESSURE atau ABS_MT_PRESSURE , jika dilaporkan sama sekali, harus tidak nol ketika alat menyentuh perangkat dan nol sebaliknya untuk menunjukkan bahwa alat tersebut melayang.

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

  • Nilai-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 tidak nol ketika alat menyentuh perangkat dan nol sebaliknya, tetapi ini tidak diperlukan. Misalnya, perangkat sentuh mungkin dapat mengukur ukuran kontak sentuh jari tetapi tidak kontak sentuh stylus.

    Pelaporan informasi ukuran adalah opsional tetapi sangat disarankan. Aplikasi dapat menggunakan informasi tekanan untuk mengimplementasikan gambar yang peka terhadap ukuran dan efek lainnya.

  • Nilai yang dilaporkan oleh ABS_DISTANCE atau ABS_MT_DISTANCE harus mendekati nol ketika alat menyentuh perangkat. Jarak dapat tetap tidak nol bahkan ketika alat tersebut bersentuhan langsung. Nilai pasti yang dilaporkan tergantung pada cara di mana perangkat keras mengukur jarak.

    Pelaporan informasi jarak adalah opsional tetapi direkomendasikan untuk perangkat stylus.

  • Nilai yang dilaporkan oleh ABS_TILT_X dan ABS_TILT_Y harus nol ketika alat tegak lurus terhadap perangkat. Kemiringan yang tidak nol menunjukkan bahwa alat ini dipegang di lereng.

    Sudut kemiringan di sepanjang sumbu X dan Y diasumsikan ditentukan dalam derajat dari tegak lurus. Titik tengah (tegak lurus) sempurna diberikan oleh (max + min) / 2 untuk setiap sumbu. Nilai lebih kecil dari titik tengah mewakili kemiringan ke atas atau ke kiri, nilai lebih besar dari titik tengah mewakili kemiringan ke bawah atau ke kanan.

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

    Melaporkan informasi kemiringan adalah opsional tetapi direkomendasikan untuk perangkat stylus.

  • Jika jenis alat dilaporkan oleh ABS_MT_TOOL_TYPE , itu menggantikan informasi jenis alat yang dilaporkan oleh BTN_TOOL_* . Jika tidak ada informasi jenis alat yang tersedia sama sekali, jenis alat default ke MotionEvent.TOOL_TYPE_FINGER .

  • Alat ditentukan untuk aktif berdasarkan kondisi berikut:

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

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

    • Saat menggunakan protokol multi-sentuh 'A', alat ini aktif setiap kali muncul dalam laporan sinkronisasi terbaru. Ketika alat berhenti muncul dalam laporan sinkronisasi, itu tidak ada lagi.
    • Saat menggunakan protokol multi-sentuh 'B', alat ini aktif selama memiliki slot aktif. Saat slot itu dibersihkan, alat tidak ada lagi.
  • Alat ditentukan untuk melayang berdasarkan kondisi berikut:
    • Jika alatnya adalah BTN_TOOL_MOUSE atau BTN_TOOL_LENS , maka alat ini tidak melayang, bahkan jika salah satu dari kondisi berikut ini benar.
    • Jika alat aktif dan driver melaporkan informasi tekanan, dan tekanan yang dilaporkan nol, maka alatnya melayang.
    • Jika alat aktif dan driver mendukung kode kunci BTN_TOUCH dan BTN_TOUCH memiliki nilai nol, maka alat ini melayang.
  • InputReader mendukung protokol multi-sentuh 'A' dan 'B'. Driver baru harus menggunakan protokol 'B' tetapi keduanya berfungsi.
  • Pada Android 4.0, driver layar sentuh mungkin perlu diubah untuk mematuhi spesifikasi protokol input Linux.

    Perubahan berikut mungkin diperlukan:

    • Ketika sebuah alat menjadi tidak aktif (jari naik "ke atas"), ia harus berhenti muncul dalam laporan sinkronisasi multi-touch berikutnya. Ketika semua alat menjadi tidak aktif (semua jari naik "ke atas"), pengemudi harus mengirim paket laporan sinkronisasi kosong, seperti SYN_MT_REPORT diikuti oleh SYN_REPORT .

      Versi sebelumnya dari peristiwa "UP" yang diharapkan untuk dilaporkan dengan mengirimkan nilai tekanan 0. Perilaku lama tidak sesuai dengan spesifikasi protokol input Linux dan tidak lagi didukung.

    • Tekanan fisik atau informasi kekuatan sinyal harus dilaporkan menggunakan ABS_MT_PRESSURE .

      Versi sebelumnya dari Android mengambil informasi tekanan dari ABS_MT_TOUCH_MAJOR . Perilaku lama tidak sesuai dengan spesifikasi protokol input Linux dan tidak lagi didukung.

    • Informasi ukuran sentuh harus dilaporkan menggunakan ABS_MT_TOUCH_MAJOR .

      Versi sebelumnya dari Android mengambil informasi ukuran dari ABS_MT_TOOL_MAJOR . Perilaku lama tidak sesuai dengan spesifikasi protokol input Linux dan tidak lagi didukung.

    Touch Device Driver tidak lagi membutuhkan kustomisasi khusus Android. Dengan mengandalkan protokol input Linux standar, Android dapat mendukung variasi 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 dari operasi perangkat sentuh di Android.

  1. EventHub membaca acara mentah dari driver evdev .
  2. InputReader mengkonsumsi acara mentah dan memperbarui keadaan internal tentang posisi dan karakteristik lain dari masing -masing alat. Ini juga melacak status tombol.
  3. Jika kembali atau maju ditekan atau dirilis, InputReader memberi tahu InputDispatcher tentang acara kunci.
  4. InputReader menentukan apakah pers tombol virtual terjadi. Jika demikian, ia memberi tahu InputDispatcher tentang acara utama.
  5. InputReader menentukan apakah sentuhan dimulai dalam batas layar. Jika demikian, itu memberi tahu InputDispatcher tentang acara Touch.
  6. Jika tidak ada alat yang menyentuh tetapi setidaknya ada satu alat yang melayang, InputReader memberi tahu InputDispatcher tentang acara Hover.
  7. Jika jenis perangkat sentuh adalah pointer , InputReader melakukan deteksi gerakan pointer, memindahkan pointer dan bintik -bintik sesuai dan memberi tahu InputDispatcher tentang acara pointer.
  8. InputDispatcher menggunakan WindowManagerPolicy untuk menentukan apakah peristiwa tersebut harus dikirim dan apakah mereka harus membangunkan perangkat. Kemudian, InputDispatcher memberikan acara ke aplikasi yang sesuai.

Konfigurasi Perangkat Sentuh

Perilaku perangkat sentuh ditentukan oleh sumbu perangkat, tombol, properti input, konfigurasi perangkat input, peta kunci virtual dan tata letak kunci.

Lihat bagian berikut untuk detail lebih lanjut 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 alasan untuk ini adalah bahwa driver perangkat untuk perangkat sentuh sering melaporkan karakteristik sentuhan menggunakan unit khusus perangkat.

Sebagai contoh, banyak perangkat sentuh mengukur area kontak sentuh menggunakan skala spesifik perangkat internal, seperti jumlah total node sensor yang dipicu oleh sentuhan. Nilai ukuran mentah ini tidak akan bermakna bagi aplikasi karena mereka perlu tahu tentang ukuran fisik dan karakteristik lain dari node sensor perangkat sentuh.

Sistem menggunakan parameter kalibrasi yang dikodekan dalam file konfigurasi perangkat input untuk mendekode, 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 menggambarkan nilai -nilai yang digunakan oleh sistem selama proses kalibrasi.

Nilai sumbu mentah

Ekspresi berikut menunjukkan nilai -nilai mentah yang dilaporkan oleh driver perangkat sentuh sebagai acara 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 ABS_PRESSURE atau ABS_MT_PRESSURE AXIS, 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 ABS_TOOL_WIDTH atau ABS_MT_WIDTH_MAJOR AXIS, 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 -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 dari 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 ini menggunakan interpolasi linier untuk menerjemahkan informasi posisi sentuh dari unit permukaan yang digunakan oleh perangkat sentuh ke dalam unit output yang dilaporkan ke aplikasi seperti piksel tampilan.

output.width
Lebar output. Untuk layar sentuh (terkait dengan layar), ini adalah lebar tampilan dalam piksel. Untuk bantalan sentuh (tidak terkait dengan tampilan), lebar output sama dengan raw.width , menunjukkan bahwa tidak ada interpolasi yang dilakukan.
output.height
Tinggi output. For touch screens (associated with a display), this is the display height in pixels. For touch pads (not associated with a display), the output height equals raw.height , indicating that no interpolation is performed.
output.diag
The diagonal length of the output coordinate system, equivalent to sqrt(output.width ^2 + output.height ^2) .

Konfigurasi dasar

The touch input mapper uses many configuration properties in the input device configuration file to specify calibration values. The following table describes some general purpose configuration properties. All other properties are described in the following sections along with the fields they are used to calibrate.

touch.deviceType

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

Specifies the touch device type.

  • If the value is touchScreen , the touch device is a touch screen associated with a display.

  • If the value is touchPad , the touch device is a touch pad not associated with a display.

  • If the value is pointer , the touch device is a touch pad not associated with a display, and its motions are used for indirect multi-touch pointer gestures .

  • If the value is default , the system automatically detects the device type according to the classification algorithm.

Refer to the Classification section for more details about how the device type influences the behavior of the touch device.

In Android 3 and lower, all touch devices were assumed to be touch screens.

touch.orientationAware

Definition: touch.orientationAware = 0 | 1

Specifies whether the touch device should react to display orientation changes.

  • If the value is 1 , touch positions reported by the touch device are rotated whenever the display orientation changes.

  • If the value is 0 , touch positions reported by the touch device are immune to display orientation changes.

The default value is 1 if the device is a touch screen, 0 otherwise.

The system distinguishes between internal and external touch screens and displays. An orientation aware internal touch screen is rotated based on the orientation of the internal display. An orientation aware external touch screen is rotated based on the orientation of the external display.

Orientation awareness is used to support rotation of touch screens on devices like the Nexus One. For example, when the device is rotated clockwise 90 degrees from its natural orientation, the absolute positions of touches are remapped such that a touch in the top-left corner of the touch screen's absolute coordinate system is reported as a touch in the top-left corner of the display's rotated coordinate system. This is done so that touches are reported with the same coordinate system that apps use to draw their visual elements.

Prior to Honeycomb, all touch devices were assumed to be orientation aware.

touch.gestureMode

Definition: touch.gestureMode = pointer | spots | default

Specifies the presentation mode for pointer gestures. This configuration property is only relevant when the touch device is of type pointer .

  • If the value is pointer , the touch pad gestures are presented by way of a cursor similar to a mouse pointer.

  • If the value is spots , the touch pad gestures are presented by an anchor that represents the centroid of the gesture and a set of circular spots that represent the position of individual fingers.

The default value is pointer when the INPUT_PROP_SEMI_MT input property is set, or spots otherwise.

X and Y fields

The X and Y fields provide positional information for the center of the contact area.

Perhitungan

The calculation is straightforward: positional information from the touch driver is linearly interpolated to the output coordinate system.

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, size fields

The touchMajor and touchMinor fields describe the approximate dimensions of the contact area in output units (pixels).

The toolMajor and toolMinor fields describe the approximate dimensions of the tool itself in output units (pixels).

The size field describes the normalized size of the touch relative to the largest possible touch that the touch device can sense. The smallest possible normalized size is 0.0 (no contact, or it is unmeasurable), and the largest possible normalized size is 1.0 (sensor area is saturated).

When both the approximate length and breadth can be measured, then the touchMajor field specifies the longer dimension and the touchMinor field specifies the shorter dimension of the contact area. When only the approximate diameter of the contact area can be measured, then the touchMajor and touchMinor fields are equal.

Likewise, the toolMajor field specifies the longer dimension and the toolMinor field specifies the shorter dimension of the tool's cross-sectional area.

If the touch size is unavailable but the tool size is available, then the tool size is set equal to the touch size. Conversely, if the tool size is unavailable but the touch size is available, then the touch size is set equal to the tool size.

Touch devices measure or report the touch size and tool size in various ways. The current implementation supports three different kinds of measurements: diameter, area, and geometric bounding box in surface units.

Definition: touch.size.calibration = none | geometric | diameter | area | default

Specifies the kind of measurement used by the touch driver to report the touch size and tool size.

  • If the value is none , the size is set to zero.

  • If the value is geometric , the size is assumed to be specified in the same surface units as the position, so it is scaled in the same manner.

  • If the value is diameter , the size is assumed to be proportional to the diameter (width) of the touch or tool.

  • If the value is area , the size is assumed to be proportional to the area of the touch or tool.

  • If the value is default , the system uses the geometric calibration if the raw.touchMajor or raw.toolMajor axis is available, otherwise it uses the none calibration.

touch.size.scale

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

Specifies a constant scale factor used in the calibration.

Nilai defaultnya adalah 1.0 .

touch.size.bias

Definition: touch.size.bias = <a non-negative floating point number>

Specifies a constant bias value used in the calibration.

Nilai defaultnya adalah 0.0 .

touch.size.isSummed

Definition: touch.size.isSummed = 0 | 1

Specifies whether the size is reported as the sum of the sizes of all active contacts, or is reported individually for each contact.

  • If the value is 1 , the reported size is divided by the number of contacts prior to use.

  • If the value is 0 , the reported size is used as is.

Nilai defaultnya adalah 0 .

Some touch devices, particularly "Semi-MT" devices cannot distinguish the individual dimensions of multiple contacts so they report a size measurement that represents their total area or width. This property should only be set to 1 for such devices. If in doubt, set this value to 0 .

Perhitungan

The calculation of the touchMajor , touchMinor , toolMajor , toolMinor , and size fields depends on the specified calibration parameters.

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

pressure field

The pressure field describes the approximate physical pressure applied to the touch device as a normalized value between 0.0 (no touch) and 1.0 (normal pressure).

A zero pressure indicates that the tool is hovering.

touch.pressure.calibration

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

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

  • If the value is none , the pressure is unknown so it is set to 1.0 when touching and 0.0 when hovering.

  • If the value is physical , the pressure axis is assumed to measure the actual physical intensity of pressure applied to the touch pad.

  • 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 .

Perhitungan

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 can 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 .

Perhitungan

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.

Nilai defaultnya adalah 1.0 .

Perhitungan

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

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

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 might also need to be updated.

Virtual key map files

Touch devices can be 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 ).

Sintaksis

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 .

Contoh

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:

  • Single finger tap: click.
  • Single finger motion: move the pointer.
  • Single finger motion plus button presses: drag the pointer.
  • 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.
  • 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.
  • Multiple finger motion: freeform gesture.

Penolakan telapak tangan

As of Android 13, the system can automatically reject inputs from palms when the built-in framework is enabled. In-house, custom-built solutions are still supported, though they might need to be modified to return the TOOL_TYPE_PALM flag when a palm is detected. The built-in framework also works in conjunction with custom solutions.

The actual model looks at the first 90 ms of gesture data, at the current pointer, and at the surrounding pointers, then considers how far away from the display edge the touches are. It then determines, on a per-pointer basis, which of the pointers are palms. It also takes into account the size of each contact, as reported by touchMajor and touchMinor . The Android framework then removes the pointers that are marked as palms from the touch stream.

If a pointer was already sent to the apps, then the system either:

  • (If there are other active pointers) Cancels the pointer with ACTION_POINTER_UP and FLAG_CANCELED set.
  • (If this is the only pointer) Cancels the pointer with ACTION_CANCEL .

A public API, MotionEvent.FLAG_CANCELED , indicates that the current event shouldn't trigger user action. This flag is set for both ACTION_CANCEL and ACTION_POINTER_UP .

If the palm pointer wasn't sent to apps, then the system simply drops the pointer.

Enable palm rejection

  1. In your touch driver, use the input_abs_set_res macro to set the resolutions for the following fields (units are pixels per mm ):
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

    Support for ABS_MT_TOUCH_MINOR is optional. However, if your device does support it, make sure the resolution is set correctly.

  2. To confirm the fields are set correctly, run:
        $ adb shell getevent -li
    
  3. To enable the feature during runtime, run:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. Restart the system_server process.
         $ adb shell stop && adb shell start
        
  5. Confirm that adb shell dumpsys input shows that there are palm rejectors inside UnwantedInteractionBlocker . If it doesn't, check the input-related logs to find clues on what might be misconfigured.

    See the following example for reference:

    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: {}
    
  6. To permanently enable the feature, add the corresponding sysprop command in your init**rc file:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Bacaan lebih lanjut