Perangkat sentuh

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

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

Touch pad adalah perangkat sentuh yang tidak terkait dengan layar, seperti tablet digitizer. Touchpad biasanya digunakan untuk menunjuk atau untuk pemosisian tidak langsung absolut atau kontrol berbasis gestur pada antarmuka pengguna.

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

Perangkat sentuh terkadang dapat dimanipulasi menggunakan berbagai alat yang berbeda, seperti jari atau stylus, bergantung pada teknologi sensor sentuh yang mendasarinya.

Perangkat sentuh terkadang digunakan untuk menerapkan tombol virtual. Misalnya, di beberapa perangkat Android, area sensor layar sentuh meluas di luar tepi layar dan berfungsi ganda sebagai bagian dari keypad sensitif sentuhan.

Karena banyaknya variasi perangkat sentuh, Android mengandalkan sejumlah besar properti konfigurasi untuk menjelaskan karakteristik dan perilaku yang diinginkan dari setiap perangkat.

Klasifikasi perangkat sentuh

Perangkat input diklasifikasikan sebagai perangkat multi-sentuh jika kedua kondisi berikut terpenuhi:

  • Perangkat input melaporkan keberadaan sumbu absolut ABS_MT_POSITION_X dan ABS_MT_POSITION_Y.
  • Perangkat input tidak memiliki tombol gamepad. Kondisi ini menyelesaikan ambiguitas dengan gamepad tertentu yang melaporkan sumbu dengan kode yang tumpang-tindih dengan sumbu MT.

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

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

Jika perangkat input diklasifikasikan sebagai perangkat sentuh, keberadaan tombol virtual ditentukan dengan mencoba memuat file peta tombol virtual untuk perangkat. Jika peta tombol virtual tersedia, file tata letak tombol untuk perangkat juga dimuat. Lihat [File peta tombol virtual](#virtual-key-map-files) untuk mengetahui informasi tentang lokasi dan format 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 akan memilih konfigurasi default yang sesuai untuk periferal sentuh serbaguna seperti layar sentuh atau touchpad HID USB atau Bluetooth eksternal. Setelan default ini tidak dirancang untuk layar sentuh bawaan dan dapat menyebabkan perilaku yang salah.

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

  • Perangkat layar sentuh digunakan untuk manipulasi langsung objek di layar. Pengguna menyentuh layar secara langsung, sehingga sistem tidak memerlukan afordans tambahan untuk menunjukkan objek yang dimanipulasi.
  • Perangkat touch pad digunakan untuk memberikan informasi pemosisian absolut ke aplikasi tentang sentuhan pada area sensor tertentu. Hal ini dapat berguna untuk tablet digitizer.
  • Perangkat penunjuk digunakan untuk manipulasi tidak langsung objek di layar menggunakan kursor. Jari ditafsirkan sebagai gestur pointer multi-sentuh. Alat lain, seperti stylus, ditafsirkan menggunakan posisi absolut. Lihat Gestur pointer multi-kontrol tidak langsung untuk mengetahui informasi selengkapnya.

Aturan berikut digunakan untuk mengklasifikasikan perangkat input sebagai layar sentuh, touchpad, atau perangkat penunjuk.

  • Jika properti touch.deviceType ditetapkan, jenis perangkat akan ditetapkan seperti yang ditunjukkan.
  • Jika perangkat input melaporkan keberadaan properti input INPUT_PROP_DIRECT (melalui ioctl EVIOCGPROP), maka jenis perangkat ditetapkan ke layar sentuh. Kondisi ini mengasumsikan bahwa perangkat sentuh input langsung terpasang ke layar yang juga terhubung.
  • Jika perangkat input melaporkan keberadaan properti input INPUT_PROP_POINTER (melalui ioctl EVIOCGPROP), maka jenis perangkat disetel ke pointer.
  • Jika perangkat input melaporkan keberadaan sumbu relatif REL_X atau REL_Y, maka jenis perangkat disetel ke touch pad. Kondisi ini menyelesaikan ambiguitas untuk perangkat input yang terdiri dari mouse dan touchpad. Dalam hal ini, panel sentuh tidak digunakan untuk mengontrol kursor karena mouse sudah mengontrolnya.
  • Jika tidak, jenis perangkat akan ditetapkan ke pointer. Setelan default ini memastikan bahwa panel sentuh yang belum ditetapkan untuk tujuan khusus lainnya mengontrol penunjuk.

Tombol

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

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

Alat dan jenis alat

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

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

Jenis alat berikut didukung:

  • BTN_TOOL_FINGER dan MT_TOOL_FINGER: Dipetakan ke MotionEvent.TOOL_TYPE_FINGER.
  • BTN_TOOL_PEN dan MT_TOOL_PEN: Dipetakan ke MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_RUBBER: Dipetakan ke MotionEvent.TOOL_TYPE_ERASER.
  • BTN_TOOL_BRUSH: Dipetakan ke MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_PENCIL: Dipetakan ke MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_AIRBRUSH: Dipetakan ke MotionEvent.TOOL_TYPE_STYLUS.
  • BTN_TOOL_MOUSE: Dipetakan ke MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_LENS: Dipetakan ke MotionEvent.TOOL_TYPE_MOUSE.
  • BTN_TOOL_DOUBLETAP, BTN_TOOL_TRIPLETAP, dan BTN_TOOL_QUADTAP: Dipetakan ke MotionEvent.TOOL_TYPE_FINGER.

Mengarahkan kursor versus menyentuh alat

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

Komponen InputReader membedakan alat sentuh dari alat mengarahkan kursor. Demikian pula, alat sentuh dan alat mengarahkan kursor dilaporkan ke aplikasi dengan cara yang berbeda.

Alat sentuh dilaporkan ke aplikasi sebagai peristiwa sentuh menggunakan MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE, MotionEvent.ACTION_DOWN, MotionEvent.ACTION_POINTER_DOWN, dan MotionEvent.ACTION_POINTER_UP.

Alat melayang dilaporkan ke aplikasi sebagai peristiwa gerakan generik menggunakan MotionEvent.ACTION_HOVER_ENTER, MotionEvent.ACTION_HOVER_MOVE, dan MotionEvent.ACTION_HOVER_EXIT.

Persyaratan driver perangkat sentuh

  • Driver perangkat sentuh hanya boleh mendaftarkan sumbu dan kode tombol untuk sumbu dan tombol yang didukungnya. Mendaftarkan sumbu atau kode tombol yang tidak didukung dapat membingungkan algoritma klasifikasi perangkat atau menyebabkan sistem salah mendeteksi kemampuan perangkat. Misalnya, jika perangkat melaporkan kode tombol BTN_TOUCH, sistem mengasumsikan bahwa BTN_TOUCH selalu digunakan untuk menunjukkan apakah alat menyentuh layar. Oleh karena itu, BTN_TOUCH tidak boleh digunakan untuk menunjukkan bahwa alat hanya berada dalam rentang dan mengarahkan kursor.
  • Perangkat sentuhan tunggal menggunakan peristiwa input Linux berikut:
    • ABS_X: (WAJIB) Melaporkan koordinat X alat.
    • ABS_Y: (WAJIB) Melaporkan koordinat Y alat.
    • ABS_PRESSURE: (opsional) Melaporkan tekanan fisik yang diterapkan pada ujung alat atau kekuatan sinyal kontak sentuh.
    • ABS_TOOL_WIDTH: (opsional) Melaporkan area penampang atau lebar kontak sentuh atau alat itu sendiri.
    • ABS_DISTANCE: (opsional) Melaporkan jarak alat dari permukaan perangkat sentuh.
    • ABS_TILT_X: (opsional) Melaporkan kemiringan alat dari permukaan perangkat sentuh di sepanjang sumbu X.
    • ABS_TILT_Y: (opsional) Melaporkan kemiringan alat dari permukaan perangkat sentuh di sepanjang sumbu Y.
    • BTN_TOUCH: (WAJIB) Menunjukkan apakah alat menyentuh perangkat.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (opsional) 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 input Linux berikut:
    • ABS_MT_POSITION_X: (WAJIB) Melaporkan koordinat X alat.
    • ABS_MT_POSITION_Y: (WAJIB) Melaporkan koordinat Y alat.
    • ABS_MT_PRESSURE: (opsional) Melaporkan tekanan fisik yang diterapkan pada ujung alat atau kekuatan sinyal kontak sentuh.
    • ABS_MT_TOUCH_MAJOR: (opsional) Melaporkan area penampang sentuhan, atau panjang dimensi sentuhan yang lebih panjang.
    • ABS_MT_TOUCH_MINOR: (opsional) Melaporkan panjang dimensi yang lebih pendek dari kontak sentuh. Sumbu ini tidak boleh digunakan jika ABS_MT_TOUCH_MAJOR melaporkan pengukuran area.
    • ABS_MT_WIDTH_MAJOR: (opsional) Melaporkan area penampang alat itu sendiri, atau panjang dimensi alat yang lebih panjang. Jangan gunakan sumbu ini kecuali jika Anda mengetahui dimensi alat itu sendiri.
    • ABS_MT_WIDTH_MINOR: (opsional) Melaporkan panjang dimensi yang lebih pendek dari alat itu sendiri. Sumbu ini tidak boleh digunakan 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 arbitrer yang digunakan untuk mengidentifikasi dan melacak setiap alat secara independen saat beberapa alat aktif. Misalnya, saat beberapa jari menyentuh perangkat, setiap jari harus diberi ID pelacakan yang berbeda yang digunakan selama jari tetap bersentuhan. ID Pelacakan dapat digunakan kembali saat alat terkaitnya berada di luar jangkauan.
    • ABS_MT_SLOT: (opsional) Melaporkan ID slot alat, saat menggunakan protokol multi-sentuh Linux 'B'. Lihat dokumentasi protokol multi-sentuh Linux untuk mengetahui detail selengkapnya.
    • BTN_TOUCH: (WAJIB) Menunjukkan apakah alat menyentuh perangkat.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (opsional) 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 multi-sentuh ditentukan, maka hanya sumbu multi-sentuh 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 platform khusus perangkat. Dalam kasus layar sentuh, area aktif mendeskripsikan bagian perangkat sentuh yang benar-benar menutupi layar.

    Untuk layar sentuh, sistem secara otomatis menginterpolasi posisi sentuhan yang dilaporkan dalam unit permukaan untuk mendapatkan posisi sentuhan dalam piksel layar sesuai dengan perhitungan berikut:

        displayX = (x - minX) * displayWidth / (maxX - minX + 1)
        displayY = (y - minY) * displayHeight / (maxY - minY + 1)
        

    Layar sentuh dapat melaporkan sentuhan di luar area aktif yang dilaporkan.

    Sentuhan yang dimulai di luar area aktif tidak dikirimkan ke aplikasi, tetapi dapat digunakan untuk tombol virtual.

    Sentuhan yang dimulai di dalam area aktif, atau yang masuk dan keluar dari area tampilan dikirimkan ke aplikasi. Akibatnya, jika sentuhan dimulai dalam batas aplikasi, lalu bergerak ke luar area aktif, aplikasi dapat menerima peristiwa sentuhan dengan koordinat tampilan yang negatif atau di luar batas tampilan. Hal ini adalah perilaku yang diharapkan.

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

    Misalnya, jika jari pengguna menyentuh di dekat sudut kiri atas layar sentuh, koordinat yang dilaporkan mungkin (minX, minY). Jika jari terus bergerak lebih jauh di luar area aktif, layar sentuh harus mulai melaporkan koordinat dengan komponen yang kurang dari minX dan minY, seperti (minX - 2, minY - 3), atau harus berhenti melaporkan sentuhan sama sekali. Dengan kata lain, layar sentuh tidak boleh melaporkan (minX, minY) saat jari pengguna benar-benar menyentuh di luar area aktif.

    Mengepaskan koordinat sentuh ke tepi layar akan menciptakan batas keras buatan di sekitar tepi layar yang mencegah sistem melacak gerakan yang masuk atau keluar dari batas area tampilan dengan lancar.

  • Nilai yang dilaporkan oleh ABS_PRESSURE atau ABS_MT_PRESSURE, jika dilaporkan, harus bukan nol saat alat menyentuh perangkat dan nol jika tidak untuk menunjukkan bahwa alat melayang.

    Pelaporan informasi tekanan bersifat opsional, tetapi sangat direkomendasikan. Aplikasi dapat menggunakan informasi tekanan untuk menerapkan gambar yang sensitif terhadap tekanan dan efek lainnya.

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

    Pelaporan informasi ukuran bersifat opsional, tetapi sangat direkomendasikan. Aplikasi dapat menggunakan informasi tekanan untuk menerapkan gambar yang sensitif terhadap ukuran dan efek lainnya.

  • Nilai yang dilaporkan oleh ABS_DISTANCE atau ABS_MT_DISTANCE harus mendekati nol saat alat menyentuh perangkat. Jarak dapat tetap tidak nol bahkan saat alat bersentuhan langsung. Nilai pasti yang dilaporkan bergantung pada cara hardware mengukur jarak.

    Pelaporan informasi jarak bersifat opsional, tetapi direkomendasikan untuk perangkat stylus.

  • Nilai yang dilaporkan oleh ABS_TILT_X dan ABS_TILT_Y harus nol saat alat tegak lurus dengan perangkat. Kemiringan yang tidak nol menunjukkan bahwa alat dipegang dalam posisi miring.

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

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

    Pelaporan informasi kemiringan bersifat opsional, tetapi direkomendasikan untuk perangkat stylus.

  • Jika jenis alat dilaporkan oleh ABS_MT_TOOL_TYPE, jenis alat tersebut menggantikan informasi jenis alat yang dilaporkan oleh BTN_TOOL_*. Jika tidak ada informasi jenis alat sama sekali, jenis alat akan ditetapkan secara default ke MotionEvent.TOOL_TYPE_FINGER.

  • Alat ditentukan 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 harus memiliki setidaknya beberapa informasi tentang sifat alat, baik apakah alat menyentuh, atau setidaknya jenis alatnya. Jika tidak ada informasi yang tersedia, maka alat dianggap tidak aktif (di luar rentang).

    • Saat menggunakan protokol multi-sentuh 'A', alat ini aktif setiap kali muncul dalam laporan sinkronisasi terbaru. Jika alat berhenti muncul di laporan sinkronisasi, alat tersebut tidak ada lagi.
    • Saat menggunakan protokol multi-sentuh 'B', alat ini aktif selama memiliki slot aktif. Saat slot dihapus, alat tidak akan ada lagi.
  • Alat ditentukan melayang berdasarkan kondisi berikut:
    • Jika alatnya BTN_TOOL_MOUSE atau BTN_TOOL_LENS, maka alat tidak melayang, meskipun salah satu kondisi berikut terpenuhi.
    • Jika alat aktif dan pengemudi melaporkan informasi tekanan, dan tekanan yang dilaporkan adalah nol, maka alat melayang.
    • Jika alat aktif dan pengemudi mendukung kode tombol BTN_TOUCH dan BTN_TOUCH memiliki nilai nol, alat akan melayang.
  • InputReader mendukung protokol multi-sentuh 'A' dan 'B'. Driver baru harus menggunakan protokol 'B', tetapi keduanya dapat berfungsi.
  • Mulai Android 4.0, driver layar sentuh mungkin perlu diubah agar mematuhi spesifikasi protokol input Linux.

    Perubahan berikut mungkin diperlukan:

    • Saat alat menjadi tidak aktif (jari "naik"), alat tersebut akan berhenti muncul dalam laporan sinkronisasi multi-sentuh berikutnya. Saat semua alat menjadi tidak aktif (semua jari "naik"), driver harus mengirim paket laporan sinkronisasi kosong, seperti SYN_MT_REPORT diikuti dengan SYN_REPORT.

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

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

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

Operasi perangkat sentuh

Berikut adalah ringkasan singkat pengoperasian perangkat sentuh di Android.

  1. EventHub membaca peristiwa mentah dari driver evdev.
  2. InputReader menggunakan peristiwa mentah dan memperbarui status internal tentang posisi dan karakteristik setiap alat. Tombol ini juga melacak status tombol.
  3. Jika BACK atau FORWARD ditekan atau dilepaskan, InputReader memberi tahu InputDispatcher tentang peristiwa tombol.
  4. InputReader menentukan apakah penekanan tombol virtual terjadi. Jika demikian, notifikasi InputDispatcher tentang peristiwa utama akan dikirim.
  5. InputReader menentukan apakah sentuhan dimulai dalam batas tampilan. Jika ya, InputDispatcher akan memberi tahu tentang peristiwa sentuh.
  6. Jika tidak ada alat sentuh, tetapi ada setidaknya satu alat mengambang, InputReader memberi tahu InputDispatcher tentang peristiwa mengambang.
  7. Jika jenis perangkat sentuh adalah pointer, InputReader melakukan deteksi gestur pointer, memindahkan pointer dan titik sesuai dengan itu, serta memberi tahu InputDispatcher tentang peristiwa pointer.
  8. InputDispatcher menggunakan WindowManagerPolicy untuk menentukan apakah peristiwa harus dikirim dan apakah peristiwa harus mengaktifkan perangkat. Kemudian, InputDispatcher mengirimkan peristiwa ke aplikasi yang sesuai.

Konfigurasi perangkat sentuh

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

Lihat bagian berikut untuk mengetahui detail selengkapnya tentang file yang berpartisipasi dalam konfigurasi keyboard:

Properti

Sistem mengandalkan banyak properti konfigurasi perangkat input untuk mengonfigurasi dan mengalibrasi perilaku perangkat sentuh.

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

Misalnya, 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 aplikasi perlu mengetahui ukuran fisik dan karakteristik lain dari node sensor perangkat sentuh.

Sistem menggunakan parameter kalibrasi yang dienkode dalam file konfigurasi perangkat input untuk mendekode, mengubah, dan menormalisasi nilai yang dilaporkan oleh perangkat sentuh menjadi representasi standar yang lebih sederhana yang dapat dipahami 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. Nilai ini diperoleh dengan memanggil ioctl EVIOCGABS untuk setiap sumbu.

raw.*.min
Nilai minimum inklusif sumbu mentah.
raw.*.max
Nilai maksimum inklusif dari sumbu mentah.
raw.*.range
Setara dengan raw.*.max - raw.*.min.
raw.*.fuzz
Akurasi sumbu mentah. Misalnya, fuzz = 1 berarti nilai akurat hingga +/- 1 unit.
raw.width
Lebar inklusif area sentuh, setara dengan raw.x.range + 1.
raw.height
Tinggi inklusif area sentuh, setara dengan raw.y.range + 1.

Rentang output

Ekspresi berikut menunjukkan karakteristik sistem koordinat output. Sistem menggunakan interpolasi linear untuk menerjemahkan informasi posisi sentuhan 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 layar dalam piksel. Untuk panel sentuh (tidak terkait dengan layar), lebar output sama dengan raw.width, yang menunjukkan bahwa tidak ada interpolasi yang dilakukan.
output.height
Tinggi output. Untuk layar sentuh (terkait dengan layar), ini adalah tinggi layar dalam piksel. Untuk panel sentuh (tidak terkait dengan layar), tinggi output sama dengan raw.height, yang menunjukkan bahwa tidak ada interpolasi yang dilakukan.
output.diag
Panjang diagonal sistem koordinat output, setara dengan sqrt(output.width ^2 + output.height ^2).

Konfigurasi dasar

Pemeta input sentuh menggunakan banyak properti konfigurasi dalam file konfigurasi perangkat input untuk menentukan nilai kalibrasi. Tabel berikut menjelaskan beberapa properti konfigurasi tujuan umum. Semua properti lainnya dijelaskan di bagian berikut bersama dengan kolom yang digunakan untuk mengalibrasi.

touch.deviceType

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

Menentukan jenis perangkat sentuh.

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

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

  • Jika nilainya adalah pointer, perangkat sentuh adalah pad sentuh yang tidak terkait dengan layar, dan gerakannya digunakan untuk gestur penunjuk multi-sentuh tidak langsung.

  • Jika nilainya adalah default, sistem akan otomatis mendeteksi jenis perangkat sesuai dengan algoritma klasifikasi.

Lihat bagian Klasifikasi untuk mengetahui detail selengkapnya tentang pengaruh jenis perangkat terhadap perilaku perangkat sentuh.

Di Android 3 dan yang lebih lama, semua perangkat sentuh dianggap sebagai layar sentuh.

touch.orientationAware

Definisi: touch.orientationAware = 0 | 1

Menentukan apakah perangkat sentuh harus bereaksi terhadap perubahan orientasi layar.

  • Jika nilainya 1, posisi sentuh yang dilaporkan oleh perangkat sentuh akan dirotasi setiap kali orientasi layar berubah.

  • Jika nilainya 0, posisi sentuhan yang dilaporkan oleh perangkat sentuh tidak terpengaruh oleh perubahan orientasi tampilan.

Nilai defaultnya adalah 1 jika perangkat adalah layar sentuh, 0 jika tidak.

Sistem membedakan antara layar sentuh dan layar internal dan eksternal. Layar sentuh internal yang mengetahui orientasi diputar berdasarkan orientasi tampilan internal. Layar sentuh eksternal yang mengetahui orientasi diputar berdasarkan orientasi layar eksternal.

Deteksi orientasi digunakan untuk mendukung rotasi layar sentuh di perangkat seperti Nexus One. Misalnya, saat perangkat diputar 90 derajat searah jarum jam dari orientasi alaminya, posisi sentuhan absolut dipetakan ulang sehingga sentuhan di sudut kiri atas sistem koordinat absolut layar sentuh dilaporkan sebagai sentuhan di sudut kiri atas sistem koordinat layar yang diputar. Hal ini dilakukan agar sentuhan dilaporkan dengan sistem koordinat yang sama dengan yang digunakan aplikasi untuk menggambar elemen visualnya.

Sebelum Honeycomb, semua perangkat sentuh dianggap memiliki kemampuan mendeteksi orientasi.

touch.gestureMode

Definisi: touch.gestureMode = pointer | spots | default

Menentukan mode presentasi untuk gestur penunjuk. Properti konfigurasi ini hanya relevan jika perangkat sentuh berjenis pointer.

  • Jika nilainya adalah pointer, gestur panel sentuh akan ditampilkan melalui kursor yang mirip dengan pointer mouse.

  • Jika nilainya adalah spots, gestur panel sentuh akan ditampilkan oleh penanda yang merepresentasikan centroid gestur dan sekumpulan titik melingkar yang merepresentasikan posisi setiap jari.

Nilai defaultnya adalah pointer jika properti input INPUT_PROP_SEMI_MT ditetapkan, atau spots jika tidak.

Kolom X dan Y

Kolom X dan Y memberikan informasi posisi untuk bagian tengah area kontak.

Perhitungan

Perhitungannya mudah: informasi posisi dari driver sentuh diinterpolasi secara linear ke sistem koordinat output.

xScale = output.width / raw.width
yScale = output.height / raw.height

If not orientation aware or screen rotation is 0 degrees:
output.x = (raw.x - raw.x.min) * xScale
output.y = (raw.y - raw.y.min) * yScale
Else If rotation is 90 degrees:
    output.x = (raw.y - raw.y.min) * yScale
    output.y = (raw.x.max - raw.x) * xScale
Else If rotation is 180 degrees:
    output.x = (raw.x.max - raw.x) * xScale
    output.y = (raw.y.max - raw.y) * yScale
Else If rotation is 270 degrees:
    output.x = (raw.y.max - raw.y) * yScale
    output.y = (raw.x - raw.x.min) * xScale
End If

Kolom touchMajor, touchMinor, toolMajor, toolMinor, size

Kolom touchMajor dan touchMinor menjelaskan perkiraan dimensi area kontak dalam unit output (piksel).

Kolom toolMajor dan toolMinor menjelaskan perkiraan dimensi alat itu sendiri dalam satuan output (piksel).

Kolom size menjelaskan ukuran sentuhan yang dinormalisasi relatif terhadap sentuhan terbesar yang dapat dirasakan oleh perangkat sentuh. Ukuran yang dinormalisasi terkecil yang mungkin adalah 0,0 (tidak ada kontak, atau tidak dapat diukur), dan ukuran yang dinormalisasi terbesar yang mungkin adalah 1,0 (area sensor jenuh).

Jika panjang dan lebar perkiraan dapat diukur, maka kolom touchMajor menentukan dimensi yang lebih panjang dan kolom touchMinor menentukan dimensi yang lebih pendek dari area kontak. Jika hanya diameter perkiraan area kontak yang dapat diukur, maka kolom touchMajor dan touchMinor sama.

Demikian pula, kolom toolMajor menentukan dimensi yang lebih panjang dan kolom toolMinor menentukan dimensi yang lebih pendek dari area penampang alat.

Jika ukuran sentuh tidak tersedia, tetapi ukuran alat tersedia, maka ukuran alat disetel sama dengan ukuran sentuh. Sebaliknya, jika ukuran alat tidak tersedia tetapi ukuran sentuh tersedia, maka ukuran sentuh ditetapkan sama dengan ukuran alat.

Perangkat sentuh mengukur atau melaporkan ukuran sentuhan dan ukuran alat dengan berbagai cara. Implementasi saat ini mendukung tiga jenis pengukuran yang berbeda: diameter, area, 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 alat.

  • Jika nilainya adalah none, ukuran ditetapkan ke nol.

  • Jika nilainya adalah geometric, ukuran diasumsikan ditentukan dalam unit permukaan yang sama dengan posisi, sehingga diskalakan dengan cara yang sama.

  • Jika nilainya adalah diameter, ukuran diasumsikan sebanding dengan diameter (lebar) sentuhan atau alat.

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

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

touch.size.scale

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

Menentukan faktor skala konstan yang digunakan dalam kalibrasi.

Nilai default-nya adalah 1.0.

touch.size.bias

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

Menentukan nilai bias konstan yang digunakan dalam kalibrasi.

Nilai default-nya adalah 0.0.

touch.size.isSummed

Definisi: touch.size.isSummed = 0 | 1

Menentukan apakah ukuran dilaporkan sebagai jumlah ukuran semua kontak aktif, atau dilaporkan satu per satu untuk setiap kontak.

  • Jika nilainya adalah 1, ukuran yang dilaporkan dibagi dengan jumlah kontak sebelum digunakan.

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

Nilai default-nya adalah 0.

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

Perhitungan

Penghitungan kolom touchMajor, touchMinor, toolMajor, toolMinor, dan size bergantung pada parameter kalibrasi yang ditentukan.

If raw.touchMajor and raw.toolMajor are available:
    touchMajor = raw.touchMajor
    touchMinor = raw.touchMinor
    toolMajor = raw.toolMajor
    toolMinor = raw.toolMinor
Else If raw.touchMajor is available:
    toolMajor = touchMajor = raw.touchMajor
    toolMinor = touchMinor = raw.touchMinor
Else If raw.toolMajor is available:
    touchMajor = toolMajor = raw.toolMajor
    touchMinor = toolMinor = raw.toolMinor
Else
    touchMajor = toolMajor = 0
    touchMinor = toolMinor = 0
    size = 0
End If

size = avg(touchMajor, touchMinor)

If touch.size.isSummed == 1:
    touchMajor = touchMajor / numberOfActiveContacts
    touchMinor = touchMinor / numberOfActiveContacts
    toolMajor = toolMajor / numberOfActiveContacts
    toolMinor = toolMinor / numberOfActiveContacts
    size = size / numberOfActiveContacts
End If

If touch.size.calibration == "none":
    touchMajor = toolMajor = 0
    touchMinor = toolMinor = 0
    size = 0
Else If touch.size.calibration == "geometric":
    outputScale = average(output.width / raw.width, output.height / raw.height)
    touchMajor = touchMajor * outputScale
    touchMinor = touchMinor * outputScale
    toolMajor = toolMajor * outputScale
    toolMinor = toolMinor * outputScale
Else If touch.size.calibration == "area":
    touchMajor = sqrt(touchMajor)
    touchMinor = touchMajor
    toolMajor = sqrt(toolMajor)
    toolMinor = toolMajor
Else If touch.size.calibration == "diameter":
    touchMinor = touchMajor
    toolMinor = toolMajor
End If

If touchMajor != 0:
    output.touchMajor = touchMajor * touch.size.scale + touch.size.bias
Else
    output.touchMajor = 0
End If

If touchMinor != 0:
    output.touchMinor = touchMinor * touch.size.scale + touch.size.bias
Else
    output.touchMinor = 0
End If

If toolMajor != 0:
    output.toolMajor = toolMajor * touch.size.scale + touch.size.bias
Else
    output.toolMajor = 0
End If

If toolMinor != 0:
    output.toolMinor = toolMinor * touch.size.scale + touch.size.bias
Else
    output.toolMinor = 0
End If

output.size = size

kolom tekanan

Kolom pressure menjelaskan perkiraan tekanan fisik yang diterapkan pada perangkat sentuh sebagai nilai yang dinormalisasi antara 0,0 (tanpa sentuhan) dan 1,0 (tekanan normal).

Tekanan nol menunjukkan bahwa alat sedang mengambang.

touch.pressure.calibration

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

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

  • Jika nilainya none, tekanan tidak diketahui sehingga ditetapkan ke 1,0 saat menyentuh dan 0,0 saat mengarahkan kursor.

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

  • Jika nilainya adalah amplitude, sumbu tekanan diasumsikan mengukur amplitudo sinyal, yang terkait dengan ukuran kontak dan tekanan yang diterapkan.

  • Jika nilainya adalah default, sistem akan menggunakan kalibrasi physical jika sumbu tekanan tersedia, atau menggunakan none.

touch.pressure.scale

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

Menentukan faktor skala konstan yang digunakan dalam kalibrasi.

Nilai default-nya adalah 1.0 / raw.pressure.max.

Perhitungan

Penghitungan kolom pressure bergantung pada parameter kalibrasi yang ditentukan.

If touch.pressure.calibration == "physical" or "amplitude":
    output.pressure = raw.pressure * touch.pressure.scale
Else
    If hovering:
        output.pressure = 0
    Else
        output.pressure = 1
    End If
End If

bidang orientasi dan kemiringan

Kolom orientation menjelaskan orientasi sentuhan dan alat sebagai pengukuran sudut. Orientasi 0 menunjukkan bahwa sumbu utama berorientasi secara vertikal, -PI/2 menunjukkan bahwa sumbu utama berorientasi ke kiri, PI/2 menunjukkan bahwa sumbu utama berorientasi ke kanan. Jika ada alat stylus, rentang orientasi dapat dijelaskan dalam rentang lingkaran penuh dari -PI atau PI.

Kolom tilt menjelaskan kemiringan alat sebagai pengukuran sudut. Kemiringan 0 menunjukkan bahwa alat tegak lurus terhadap permukaan. Kemiringan PI/2 menunjukkan bahwa alat berada di permukaan yang rata.

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 disetel ke 0.
  • Jika nilainya adalah interpolated, orientasi diinterpolasi secara linear sehingga nilai mentah raw.orientation.min dipetakan ke -PI/2 dan nilai mentah raw.orientation.max dipetakan ke PI/2. Nilai tengah (raw.orientation.min + raw.orientation.max) / 2 dipetakan ke 0.
  • Jika nilainya vector, orientasi ditafsirkan sebagai vektor yang dikemas yang terdiri dari dua kolom 4-bit bertanda. Representasi ini digunakan pada komponen Atmel Object Based Protocol. Saat didekode, vektor akan menghasilkan sudut orientasi dan magnitudo tingkat keyakinan. Besarnya keyakinan digunakan untuk menskalakan informasi ukuran, kecuali jika bersifat geometris.
  • Jika nilainya adalah default, sistem akan menggunakan kalibrasi interpolated jika sumbu orientasi tersedia, atau menggunakan none.

Perhitungan

Penghitungan kolom orientation dan tilt bergantung pada parameter kalibrasi yang ditentukan dan input yang tersedia.

If touch.tiltX and touch.tiltY are available:
    tiltXCenter = average(raw.tiltX.min, raw.tiltX.max)
    tiltYCenter = average(raw.tiltY.min, raw.tiltY.max)
    tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180
    tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180
    output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle))
    output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle))
Else If touch.orientation.calibration == "interpolated":
    center = average(raw.orientation.min, raw.orientation.max)
    output.orientation = PI / (raw.orientation.max - raw.orientation.min)
    output.tilt = 0
Else If touch.orientation.calibration == "vector":
    c1 = (raw.orientation & 0xF0) >> 4
    c2 = raw.orientation & 0x0F

    If c1 != 0 or c2 != 0:
        If c1 >= 8 Then c1 = c1 - 16
        If c2 >= 8 Then c2 = c2 - 16
        angle = atan2(c1, c2) / 2
        confidence = sqrt(c1*c1 + c2*c2)

        output.orientation = angle

        If touch.size.calibration == "diameter" or "area":
            scale = 1.0 + confidence / 16
            output.touchMajor *= scale
            output.touchMinor /= scale
            output.toolMajor *= scale
            output.toolMinor /= scale
        End If
    Else
        output.orientation = 0
    End If
    output.tilt = 0
Else
    output.orientation = 0
    output.tilt = 0
End If

If orientation aware:
    If screen rotation is 90 degrees:
        output.orientation = output.orientation - PI / 2
    Else If screen rotation is 270 degrees:
        output.orientation = output.orientation + PI / 2
    End If
End If

bidang jarak

Kolom distance menjelaskan 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, jarak tidak diketahui sehingga ditetapkan ke 0.

  • Jika nilainya adalah scaled, jarak yang dilaporkan dikalikan dengan faktor skala konstan.

  • Jika nilainya adalah default, sistem akan menggunakan kalibrasi scaled jika sumbu jarak tersedia, atau menggunakan none.

touch.distance.scale

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

Menentukan faktor skala konstan yang digunakan dalam kalibrasi.

Nilai default-nya adalah 1.0.

Perhitungan

Penghitungan kolom distance bergantung pada parameter kalibrasi yang ditentukan.

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

Contoh

# Input device configuration file for a touch screen that supports pressure,
# size and orientation. The pressure and size scale factors were obtained
# by measuring the characteristics of the device itself and deriving
# useful approximations based on the resolution of the touch sensor and the
# display.
#
# Note that these parameters are specific to a particular device model.
# Different parameters need to be used for other devices.

# Basic Parameters
touch.deviceType = touchScreen
touch.orientationAware = 1

# Size
# Based on empirical measurements, we estimate the size of the contact
# using size = sqrt(area) * 28 + 0.
touch.size.calibration = area
touch.size.scale = 28
touch.size.bias = 0
touch.size.isSummed = 0

# Pressure
# Driver reports signal strength as pressure.
#
# A normal index finger touch typically registers about 80 signal strength
# units although we don't expect these values to be accurate.
touch.pressure.calibration = amplitude
touch.pressure.scale = 0.0125

# Orientation
touch.orientation.calibration = vector

Catatan kompatibilitas

Properti konfigurasi untuk perangkat sentuh berubah secara signifikan di Android Ice Cream Sandwich 4.0. Semua file konfigurasi perangkat input untuk perangkat sentuh harus diupdate untuk menggunakan properti konfigurasi baru.

Driver perangkat sentuh lama juga mungkin perlu diupdate.

File peta tombol virtual

Perangkat sentuh dapat digunakan untuk menerapkan tombol virtual.

Ada beberapa cara untuk melakukannya, bergantung pada kemampuan pengontrol sentuh. Beberapa pengontrol sentuh dapat dikonfigurasi secara langsung untuk menerapkan tombol virtual dengan menyetel register firmware. Terkadang, pemetaan dari koordinat sentuh ke kode tombol di software lebih diinginkan.

Saat tombol virtual diimplementasikan dalam software, kernel harus mengekspor file peta tombol virtual bernama virtualkeys.<devicename> sebagai properti papan. Misalnya, jika driver perangkat layar sentuh melaporkan namanya sebagai "touchyfeely", maka file peta tombol virtual harus memiliki jalur /sys/board_properties/virtualkeys.touchyfeely.

File peta tombol virtual menjelaskan koordinat dan kode tombol Linux dari tombol virtual di layar sentuh.

Selain file peta tombol virtual, harus ada file tata letak tombol dan file peta karakter tombol yang sesuai untuk memetakan kode tombol Linux ke kode tombol Android dan untuk menentukan jenis perangkat keyboard (biasanya SPECIAL_FUNCTION).

Sintaksis

File peta tombol virtual adalah file teks biasa yang terdiri dari urutan deskripsi tata letak tombol virtual yang dipisahkan oleh baris baru atau titik dua.

Baris komentar dimulai dengan '#' dan berlanjut hingga akhir baris.

Setiap kunci virtual dijelaskan oleh 6 komponen yang dibatasi titik dua:

  • 0x01: Kode versi. Harus selalu 0x01.
  • <Linux key code>: Kode tombol Linux dari tombol virtual.
  • <centerX>: Koordinat piksel X dari pusat tombol virtual.
  • <centerY>: Koordinat piksel Y dari pusat tombol virtual.
  • <width>: Lebar tombol virtual dalam piksel.
  • <height>: Tinggi tombol virtual dalam piksel.

Semua koordinat dan ukuran ditentukan dalam hal sistem koordinat tampilan.

Berikut adalah file peta tombol virtual yang semuanya ditulis dalam satu baris.

# All on one line
0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55

File peta tombol virtual yang sama juga dapat ditulis di beberapa baris.

# One key per line
0x01:158:55:835:90:55
0x01:139:172:835:125:55
0x01:102:298:835:115:55
0x01:217:412:835:95:55

Dalam contoh di atas, layar sentuh memiliki resolusi 480x800. Oleh karena itu, semua tombol virtual memiliki koordinat <centerY> 835, yang sedikit di bawah area layar sentuh yang terlihat.

Kunci pertama memiliki kode pemindaian Linux 158 (KEY_BACK), centerX 55, centerY 835, lebar 90, dan tinggi 55.

Contoh

File peta tombol virtual: /sys/board_properties/virtualkeys.touchyfeely.

0x01:158:55:835:90:55
0x01:139:172:835:125:55
0x01:102:298:835:115:55
0x01:217:412:835:95:55

File tata letak tombol: /system/usr/keylayout/touchyfeely.kl.

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

File peta karakter kunci: /system/usr/keychars/touchyfeely.kcm.

type SPECIAL_FUNCTION

Gestur penunjuk multi-sentuh tidak langsung

Dalam mode penunjuk, sistem menafsirkan gestur berikut:

  • Ketuk satu jari: klik.
  • Gerakan satu jari: menggerakkan kursor.
  • Gerakan satu jari plus penekanan tombol: tarik pointer.
  • Gerakan dua jari dengan kedua jari bergerak ke arah yang sama: tarik area di bawah pointer ke arah tersebut. Pointer itu sendiri tidak bergerak.
  • Gerakan dua jari, kedua jari bergerak saling mendekat atau menjauh dalam arah yang berbeda: menggeser/menskalakan/memutar area di sekitar penunjuk. Pointer itu sendiri tidak bergerak.
  • Gerakan beberapa jari: gestur bentuk bebas.

Penolakan telapak tangan

Mulai Android 13, sistem dapat otomatis menolak input dari telapak tangan saat framework bawaan diaktifkan. Solusi buatan khusus internal masih didukung, meskipun mungkin perlu dimodifikasi untuk menampilkan tanda TOOL_TYPE_PALM saat telapak tangan terdeteksi. Framework bawaan juga berfungsi bersama dengan solusi kustom.

Model sebenarnya melihat 90 md pertama data gestur, pada penunjuk saat ini, dan pada penunjuk di sekitarnya, lalu mempertimbangkan seberapa jauh sentuhan dari tepi layar. Kemudian, berdasarkan per penunjuk, sistem akan menentukan penunjuk mana yang merupakan telapak tangan. Metrik ini juga memperhitungkan ukuran setiap kontak, seperti yang dilaporkan oleh touchMajor dan touchMinor. Framework Android kemudian menghapus penunjuk yang ditandai sebagai telapak tangan dari aliran sentuhan.

Jika pointer sudah dikirim ke aplikasi, sistem akan:

  • (Jika ada pointer aktif lainnya) Membatalkan pointer dengan ACTION_POINTER_UP dan FLAG_CANCELED yang ditetapkan.
  • (Jika ini adalah satu-satunya pointer) Membatalkan pointer dengan ACTION_CANCEL.

API publik, MotionEvent.FLAG_CANCELED, menunjukkan bahwa peristiwa saat ini tidak boleh memicu tindakan pengguna. Flag ini ditetapkan untuk ACTION_CANCEL dan ACTION_POINTER_UP.

Jika pointer telapak tangan tidak dikirim ke aplikasi, sistem akan menghapus pointer tersebut.

Mengaktifkan penolakan telapak tangan

  1. Di driver sentuh, gunakan makro input_abs_set_res untuk menyetel resolusi untuk kolom berikut (satuannya 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 bersifat opsional. Namun, jika perangkat Anda mendukungnya, pastikan resolusi disetel dengan benar.

  2. Untuk mengonfirmasi bahwa kolom telah ditetapkan 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. Pastikan adb shell dumpsys input menunjukkan bahwa ada penolak telapak tangan di dalam UnwantedInteractionBlocker. Jika tidak, periksa log terkait input untuk menemukan petunjuk tentang apa yang mungkin salah dikonfigurasi.

    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