Perangkat sentuh

Android mendukung berbagai layar sentuh dan touchpad, termasuk tablet digitizer berbasis stilus.

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

Touch pad adalah perangkat sentuh yang tidak terkait dengan layar, seperti tablet digital. {i>Touch pad<i} biasanya digunakan untuk menunjuk atau untuk pemosisian tidak langsung mutlak atau kontrol berbasis gestur dari antarmuka pengguna.

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

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

Perangkat sentuh terkadang digunakan untuk menerapkan tombol virtual. Misalnya, di beberapa perangkat Android, area sensor layar sentuh melampaui tepian layar dan memiliki fungsi ganda sebagai bagian dari key pad yang sensitif terhadap sentuhan.

Karena berbagai macam perangkat sentuh, Android bergantung pada properti konfigurasi untuk menggambarkan karakteristik dan perilaku yang diinginkan setiap perangkat.

Klasifikasi perangkat sentuh

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

  • Perangkat input melaporkan keberadaan ABS_MT_POSITION_X dan ABS_MT_POSITION_Y sumbu absolut.
  • 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 satu-sentuh jika kedua kondisi berikut tetap berlaku:

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

Ketika perangkat input diklasifikasikan sebagai perangkat sentuh, kehadiran kunci virtual ditentukan dengan mencoba memuat file peta kunci virtual untuk perangkat. Jika peta tombol virtual tersedia, tata letak kunci untuk perangkat juga dimuat. Lihat [File peta virtual key](#virtual-key-map-files) untuk mendapatkan informasi 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 aplikasi serbaguna periferal sentuh seperti layar sentuh USB atau Bluetooth HID eksternal atau touchpad. Default ini tidak dirancang untuk layar sentuh bawaan dan dapat mengakibatkan perilaku yang tidak tepat.

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

  • Perangkat layar sentuh digunakan untuk manipulasi langsung objek di layar. Pengguna secara langsung menyentuh layar, sehingga sistem tidak memerlukan {i>affordance<i} 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 bermanfaat untuk tablet digitizer.
  • Perangkat pointer digunakan untuk manipulasi objek tidak langsung di layar menggunakan kursor. Jari ditafsirkan sebagai pointer multi-sentuh {i>gestures.<i} Alat lain, seperti stilus, ditafsirkan menggunakan posisi mutlak. Lihat Pointer multi-sentuh tidak langsung gestur untuk mengetahui informasi selengkapnya.

Aturan berikut digunakan untuk mengklasifikasikan perangkat input sebagai layar sentuh, {i>touch pad<i}, atau perangkat penunjuk.

  • Jika properti touch.deviceType disetel, maka jenis perangkatnya adalah seperti yang ditunjukkan.
  • Jika perangkat input melaporkan keberadaan INPUT_PROP_DIRECT (melalui EVIOCGPROP ioctl), maka jenis perangkatnya adalah setel ke layar sentuh. Kondisi ini mengasumsikan bahwa sentuhan input langsung perangkat terhubung ke layar yang juga terhubung.
  • Jika perangkat input melaporkan keberadaan INPUT_PROP_POINTER properti input (melalui EVIOCGPROP ioctl), lalu jenis perangkat ditetapkan ke pointer.
  • Jika perangkat input melaporkan keberadaan REL_X atau REL_Y sumbu relatif, maka jenis perangkat akan disetel ke touch pad. Kondisi ini mengatasi ambiguitas untuk perangkat input yang terdiri dari {i>mouse<i} dan {i>touch pad<i}. Dalam hal ini, {i>touch pad<i} tidak digunakan untuk mengontrol {i>pointer<i} karena {i>mouse<i} sudah mengontrolnya.
  • Jika tidak, jenis perangkat akan ditetapkan ke pointer. Default ini memastikan bantalan sentuh yang belum dirancang untuk tujuan khusus lainnya mengontrol pointer.

Tombol

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

Tombol-tombol berikut ini telah 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 menggabungkan penekanan tombol dengan kode tombol KeyEvent.KEYCODE_BACK.
  • BTN_FORWARD dan BTN_EXTRA: Dipetakan ke MotionEvent.BUTTON_FORWARD. Menekan tombol ini juga akan menyintesis 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 peralatan lain yang digunakan untuk berinteraksi dengan perangkat sentuh. Beberapa perangkat sentuh dapat membedakan berbagai jenis-jenis alat.

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

Jenis alat berikut didukung:

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

Alat melayang vs. menyentuh alat

Alat dapat bersentuhan dengan perangkat sentuh atau dalam jangkauan dan saat kursor diarahkan di atasnya. Tidak semua perangkat sentuh dapat mendeteksi keberadaan alat yang berada di atas perangkat sentuh. Aplikasi yang menyediakannya, seperti digitizer stilus berbasis RF, sering kali dapat mendeteksi saat alat berada dalam jangkauan terbatas dari digitizer.

Komponen InputReader membedakan alat sentuh dengan pengarahan kursor alat. Demikian juga, alat menyentuh dan 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 pengarahan kursor dilaporkan ke aplikasi sebagai peristiwa gerakan umum menggunakan MotionEvent.ACTION_HOVER_ENTER, MotionEvent.ACTION_HOVER_MOVE, dan MotionEvent.ACTION_HOVER_EXIT.

Persyaratan driver perangkat sentuh

  • Driver perangkat sentuh hanya boleh mendaftarkan sumbu dan kode tombol untuk sumbu dan tombol yang mereka dukung. 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 tersebut menyentuh layar. Oleh karena itu, BTN_TOUCH tidak boleh digunakan untuk menunjukkan bahwa alat tersebut hanya berada di dalam rentang dan melayang di atas.
  • Perangkat satu sentuhan menggunakan peristiwa input Linux berikut:
    • ABS_X: (REQUIRED) Melaporkan koordinat X alat.
    • ABS_Y: (WAJIB) Melaporkan koordinat Y alat.
    • ABS_PRESSURE: (opsional) Melaporkan tekanan fisik yang diterapkan pada tip alat atau kekuatan sinyal kontak sentuh.
    • ABS_TOOL_WIDTH: (opsional) Melaporkan area lintas bagian atau lebar dari kontak sentuh atau alat itu sendiri.
    • ABS_DISTANCE: (opsional) Melaporkan jarak alat dari permukaan dari 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 seluler.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (opsional) Melaporkan tombol status.
    • 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: (REQUIRED) 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 lintas bagian dari kontak sentuh, atau panjang dimensi kontak sentuh yang lebih panjang.
    • ABS_MT_TOUCH_MINOR: (opsional) Melaporkan panjang dimensi yang lebih pendek kontak sentuh. Sumbu ini tidak boleh digunakan jika ABS_MT_TOUCH_MAJOR adalah melaporkan pengukuran area.
    • ABS_MT_WIDTH_MAJOR: (opsional) Melaporkan area lintas bagian dari alat itu sendiri, atau panjang dimensi yang lebih panjang dari alat itu sendiri. Jangan gunakan sumbu ini kecuali Anda mengetahui dimensi alat itu sendiri.
    • ABS_MT_WIDTH_MINOR: (opsional) Melaporkan panjang dimensi yang lebih pendek alat 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, saat beberapa jari menyentuh perangkat, setiap jari harus diberi ID pelacakan yang digunakan selama jari tetap bersentuhan. ID Pelacakan dapat digunakan kembali ketika alat terkaitnya bergerak keluar dari jangkauan.
    • ABS_MT_SLOT: (opsional) Melaporkan ID slot alat, saat menggunakan Protokol multi-sentuh Linux 'B'. Lihat dokumentasi protokol multi-sentuh Linux untuk mengetahui detail selengkapnya.
    • BTN_TOUCH: (WAJIB) Menunjukkan apakah alat menyentuh perangkat seluler.
    • BTN_LEFT, BTN_RIGHT, BTN_MIDDLE, BTN_BACK, BTN_SIDE, BTN_FORWARD, BTN_EXTRA, BTN_STYLUS, BTN_STYLUS2: (opsional) Melaporkan tombol status.
    • 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 satu sentuhan dan multi-sentuh ditentukan, maka hanya sumbu multi-sentuh yang digunakan dan sumbu satu sentuhan akan diabaikan.
  • Nilai minimum dan maksimum ABS_X, ABS_Y, ABS_MT_POSITION_X, dan sumbu ABS_MT_POSITION_Y menentukan batas area aktif perangkat unit permukaan khusus perangkat. Dalam kasus layar sentuh, area aktif menjelaskan bagian dari perangkat sentuh yang benar-benar menutupi layar.

    Untuk layar sentuh, sistem secara otomatis menginterpolasi sentuhan yang dilaporkan posisi di unit permukaan untuk mendapatkan posisi sentuh dalam piksel tampilan sesuai ke kalkulasi berikut:

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

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

    Sentuhan yang dimulai di luar area aktif tidak dikirimkan ke aplikasi tetapi dapat digunakan untuk {i>virtual key<i}.

    Sentuhan yang dimulai di dalam area aktif, atau yang masuk dan keluar dari layar area tertentu dikirimkan ke aplikasi. Akibatnya, jika sentuhan dimulai dalam batas aplikasi dan kemudian bergerak ke luar area aktif, aplikasi mungkin menerima peristiwa sentuh dengan koordinat tampilan yang negatif atau di luar batas tampilan. Ini adalah perilaku yang diharapkan.

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

    Misalnya, jika jari pengguna menyentuh di dekat sudut kiri atas layar sentuh, mungkin melaporkan koordinat (minX, minY). Jika jari berlanjut untuk bergerak lebih jauh ke luar area aktif, layar sentuh harus memulai koordinat pelaporan dengan komponen yang kurang dari minX dan minY, seperti (minX - 2, minY - 3), atau seharusnya 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.

    Menempel koordinat sentuh ke tepi tampilan menghasilkan batas keras di sekitar tepi layar yang mencegah sistem untuk dengan mulus melacak gerakan yang masuk atau keluar dari batasan area tampilan.

  • Nilai yang dilaporkan oleh ABS_PRESSURE atau ABS_MT_PRESSURE, jika nilai tersebut dilaporkan sama sekali, harus bukan nol saat alat menyentuh perangkat dan nol untuk menunjukkan bahwa alat mengarahkan kursor.

    Informasi tekanan pelaporan 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, tetapi hal ini tidak diperlukan. Misalnya, perangkat sentuh mungkin dapat mengukur ukuran sentuhan jari kontak tetapi tidak untuk kontak sentuh stilus.

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

  • Nilai yang dilaporkan oleh ABS_DISTANCE atau ABS_MT_DISTANCE harus mendekati nol ketika alat menyentuh perangkat. Jarak bisa tetap bukan nol bahkan saat alat ini bersentuhan langsung. Nilai tepatnya yang dilaporkan bergantung pada cara perangkat keras mengukur jarak.

    Melaporkan informasi jarak bersifat opsional, tetapi direkomendasikan untuk perangkat stilus.

  • Nilai yang dilaporkan oleh ABS_TILT_X dan ABS_TILT_Y harus nol saat alat tegak lurus terhadap perangkat. Kemiringan bukan nol menunjukkan alat tersebut diletakkan pada posisi miring.

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

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

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

  • Jika jenis alat dilaporkan oleh ABS_MT_TOOL_TYPE, jenis alat tersebut akan menggantikan alat apa pun jenis informasi yang dilaporkan oleh BTN_TOOL_*. Jika tidak ada informasi jenis alat yang tersedia, jenis alat secara default adalah MotionEvent.TOOL_TYPE_FINGER.

  • Alat dianggap aktif berdasarkan kondisi berikut:

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

      Kondisi ini menyiratkan bahwa InputReader harus memiliki setidaknya beberapa informasi tentang sifat alat, baik itu menyentuh, 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 akan aktif setiap kali muncul di laporan sinkronisasi terbaru. Saat alat berhenti muncul di laporan sinkronisasi, maka tidak akan ada lagi.
    • Saat menggunakan protokol multi-sentuh 'B', alat akan aktif selama memiliki slot aktif. Setelah slot dikosongkan, alat akan berhenti ada.
  • Alat ditentukan untuk diarahkan berdasarkan kondisi berikut:
    • Jika alat tersebut adalah BTN_TOOL_MOUSE atau BTN_TOOL_LENS, maka alat tersebut tidak melayang, meskipun salah satu kondisi berikut terpenuhi.
    • Jika alat ini aktif dan pengemudi melaporkan informasi tekanan, dan tekanan yang dilaporkan adalah nol, maka alat akan melayang.
    • Jika alat ini aktif dan driver mendukung kode tombol BTN_TOUCH dan BTN_TOUCH memiliki nilai nol, lalu alat mengarahkan kursor.
  • InputReader mendukung protokol multi-sentuh 'A' dan 'B'. Pembalap baru harus menggunakan 'B' tapi juga keduanya berfungsi.
  • Mulai Android 4.0, driver layar sentuh mungkin perlu diubah untuk mematuhi spesifikasi protokol input Linux.

    Perubahan berikut mungkin diperlukan:

    • Saat alat menjadi tidak aktif (jari "ke atas"), alat akan berhenti muncul dalam laporan sinkronisasi multi-sentuh berikutnya. Saat semua alat menjadi tidak aktif (semua jari ke atas"), {i>driver<i} harus mengirim paket laporan sinkronisasi kosong, seperti SYN_MT_REPORT diikuti dengan SYN_REPORT.

      Versi Android sebelumnya diharapkan "naik" peristiwa yang akan 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 sentuh harus dilaporkan menggunakan ABS_MT_TOUCH_MAJOR.

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

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

Operasi perangkat sentuh

Berikut adalah ringkasan singkat operasi perangkat sentuh di Android.

  1. EventHub membaca peristiwa mentah dari driver evdev.
  2. InputReader menggunakan peristiwa mentah dan memperbarui status internal 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 utama.
  4. InputReader menentukan apakah penekanan tombol virtual terjadi. Jika demikian, fungsi akan memberi tahu InputDispatcher tentang peristiwa utama.
  5. InputReader menentukan apakah sentuhan dimulai dalam batas tampilan. Jika demikian, sistem akan memberi tahu InputDispatcher tentang peristiwa sentuh.
  6. Jika tidak ada alat sentuh, tetapi setidaknya ada satu alat pengarahan kursor, InputReader memberi tahu InputDispatcher tentang peristiwa pengarahan kursor.
  7. Jika jenis perangkat sentuh adalah pointer, InputReader akan menjalankan pointer deteksi {i>gesture, <i}menggerakkan pointer dan menandai sesuai dengan itu dan memberi tahu InputDispatcher tentang peristiwa pointer.
  8. InputDispatcher menggunakan WindowManagerPolicy untuk menentukan apakah kejadian harus dikirim dan apakah peristiwa tersebut harus mengaktifkan perangkat. Selanjutnya, InputDispatcher akan 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.

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

Properti

Sistem mengandalkan banyak properti konfigurasi perangkat input untuk mengkonfigurasi dan melakukan kalibrasi perilaku perangkat sentuh.

Salah satu alasannya adalah {i>driver<i} perangkat untuk perangkat sentuh sering melaporkan karakteristik sentuhan menggunakan unit spesifik per perangkat.

Misalnya, banyak perangkat sentuh mengukur area kontak sentuhan dengan menggunakan skala khusus perangkat internal, seperti jumlah total node sensor yang dipicu oleh sentuhan. Nilai ukuran mentah ini akan tidak berarti bagi aplikasi karena mereka perlu mengetahui tentang ukuran fisik dan karakteristik lain dari simpul sensor perangkat sentuh.

Sistem menggunakan parameter kalibrasi yang dienkode dalam konfigurasi perangkat input untuk mendekode, mentransformasi, dan menormalisasi nilai yang dilaporkan oleh sentuhan perangkat menjadi representasi standar yang lebih sederhana yang dapat dipahami aplikasi.

Konvensi dokumentasi

Untuk tujuan dokumentasi, kami menggunakan konvensi berikut untuk menjelaskan nilai yang digunakan oleh sistem selama proses kalibrasi.

Nilai sumbu mentah

Ekspresi berikut menunjukkan nilai mentah yang dilaporkan oleh sentuhan driver perangkat 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 yang 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. 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
Akurasi sumbu mentah. Misalnya fuzz = 1 menyiratkan bahwa 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 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), kode ini adalah lebar tampilan dalam piksel. Untuk touchpad (tidak terkait dengan layar), lebar output sama dengan raw.width, yang menunjukkan bahwa tidak ada interpolasi dilaksanakan.
output.height
Tinggi output. Untuk layar sentuh (terkait dengan layar), kode ini adalah tinggi tampilan dalam {i>pixel<i}. Untuk touchpad (tidak terkait dengan layar), tinggi output sama dengan raw.height, yang menunjukkan bahwa tidak ada interpolasi yang diselesaikan.
output.diag
Panjang diagonal sistem koordinat output, setara dengan sqrt(output.width ^2 + output.height ^2).

Konfigurasi dasar

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

touch.deviceType

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

Menentukan jenis perangkat sentuh.

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

  • Jika nilainya touchPad, perangkat sentuh adalah touchpad yang tidak dikaitkan dengan layar.

  • Jika nilainya pointer, perangkat sentuh adalah touchpad yang tidak dikaitkan dengan tampilan, dan gerakannya digunakan untuk gestur pointer multi-kontrol tidak langsung.

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

Lihat bagian Klasifikasi untuk detail selengkapnya tentang bagaimana jenis perangkat memengaruhi perilaku perangkat sentuh.

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

touch.OrientationAware

Definisi: touch.orientationAware = 0 | 1

Menentukan apakah perangkat sentuh harus bereaksi terhadap perubahan orientasi tampilan.

  • Jika nilainya 1, posisi sentuh yang dilaporkan oleh perangkat sentuh akan diputar kapan pun orientasi tampilan berubah.

  • Jika nilainya 0, posisi sentuh yang dilaporkan oleh perangkat sentuh akan bersifat kebal untuk menampilkan perubahan orientasi.

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

Sistem membedakan antara layar sentuh dan tampilan internal dan eksternal. Layar sentuh internal yang mendukung orientasi akan diputar berdasarkan orientasi layar internal. Layar sentuh eksternal yang mendukung orientasi akan 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 naturalnya, posisi mutlak sentuhan dipetakan ulang seperti bahwa sentuhan di sudut kiri atas sistem koordinat mutlak layar sentuh dilaporkan sebagai sentuhan di sudut kiri atas sistem koordinat tampilan yang diputar. Hal ini dilakukan sehingga sentuhan dilaporkan dengan sistem koordinat yang sama yang digunakan aplikasi untuk menggambar elemen visualnya.

Sebelum Honeycomb, semua perangkat sentuh diasumsikan mengenali orientasi.

touch.gestureMode

Definisi: touch.gestureMode = pointer | spots | default

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

  • Jika nilainya pointer, gestur touchpad ditampilkan melalui kursor mirip dengan {i>mouse<i}.

  • Jika nilainya spots, gestur touchpad ditampilkan oleh anchor yang merepresentasikan sentroid gestur dan sekumpulan titik lingkaran yang mewakili posisi setiap jari.

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

Kolom X dan Y

Kolom X dan Y memberikan informasi posisi untuk pusat area kontak.

Perhitungan

Perhitungannya mudah: informasi posisi dari driver sentuh diinterpolasikan 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

touchMajor, touchMinor, toolMajor, toolMinor, kolom ukuran

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

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

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

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

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

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

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

  • Jika nilainya none, ukuran ditetapkan ke nol.

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

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

  • Jika nilainya area, ukuran diasumsikan proporsional dengan area sentuhan atau alat.

  • Jika nilainya default, sistem akan menggunakan kalibrasi geometric jika Sumbu raw.touchMajor atau raw.toolMajor tersedia, jika tidak, sumbu ini 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 1, ukuran yang dilaporkan dibagi dengan angka sebelum digunakan.

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

Nilai default-nya adalah 0.

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

Perhitungan

Penghitungan touchMajor, touchMinor, toolMajor, toolMinor, dan kolom 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

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

Tekanan nol menunjukkan bahwa alat melayang.

touch.pressure.kalibrasi

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 disetel ke 1,0 jika menyentuh dan 0,0 ketika mengarahkan kursor.

  • Jika nilainya physical, sumbu tekanan diasumsikan untuk mengukur nilai sebenarnya intensitas tekanan fisik yang diterapkan pada {i>touch pad<i}.

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

  • Jika nilainya default, sistem akan menggunakan kalibrasi physical jika sumbu tekanan tersedia, jika tidak, akan 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. Saat stilus ada, rentang orientasi bisa dijelaskan dalam rentang lingkaran penuh dari -PI atau PI.

Kolom tilt menjelaskan kemiringan alat sebagai pengukuran sudut. Kemiringan 0 menunjukkan bahwa alat tegak lurus dengan permukaan. Kemiringan PI/2 menunjukkan bahwa alat datar di permukaan.

touch.orientasi.kalibrasi

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 interpolated, orientasi akan 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 dari (raw.orientation.min + raw.orientation.max) / 2 dipetakan ke 0.
  • Jika nilainya vector, orientasi akan ditafsirkan sebagai vektor paket yang terdiri dari dua isian 4-bit yang ditandatangani. Representasi ini digunakan pada Atmel Object Based Protocol suku cadang. Saat didekode, vektor akan menghasilkan sudut orientasi dan tingkat keyakinan besarnya. Tingkat kepercayaan digunakan untuk skala informasi ukuran, kecuali jika itu geometris.
  • Jika nilainya default, sistem akan menggunakan kalibrasi interpolated jika sumbu orientasi tersedia, jika tidak, gunakan none.

Perhitungan

Perhitungan 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

isian jarak

Kolom distance menjelaskan jarak antara alat dan perangkat sentuh ditampilkan. Nilai 0.0 menunjukkan kontak langsung dan nilai yang lebih besar menunjukkan meningkatkan 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 scaled, jarak yang dilaporkan dikalikan dengan faktor skala konstan.

  • Jika nilainya default, sistem akan menggunakan kalibrasi scaled jika sumbu jarak tersedia, jika tidak, gunakan 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 kalibrasi yang ditentukan parameter.

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 dalam Android Ice Cream Sandwich 4.0. Semua file konfigurasi perangkat input untuk sentuhan perangkat harus diupdate agar dapat menggunakan properti konfigurasi baru.

Driver perangkat sentuh yang lebih lama mungkin juga perlu diperbarui.

File peta virtual key

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 {i>soft key <i}dengan mengatur register firmware. Pada lain waktu Anda ingin melakukan pemetaan dari koordinat sentuh ke kode tombol dalam perangkat lunak.

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

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

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

Sintaksis

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

Baris komentar dimulai dengan '#' dan terus sampai ke akhir baris.

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

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

Semua koordinat dan ukuran ditetapkan dalam hal sistem koordinat tampilan.

Berikut adalah file peta kunci 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 kunci virtual yang sama juga dapat ditulis dalam beberapa baris.

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

Pada contoh di atas, layar sentuh memiliki resolusi 480x800. Dengan demikian, semua kunci virtual memiliki <centerY> koordinat 835, yang sedikit di bawah area yang terlihat di layar sentuh.

Kunci pertama memiliki kode pemindaian Linux 158 (KEY_BACK), centerX dari 55, bagian tengah 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

Gestur pointer multi-kontrol tidak langsung

Dalam mode pointer, sistem akan menafsirkan gestur berikut:

  • Ketukan satu jari: klik.
  • Gerakan satu jari: menggerakkan kursor.
  • Gerakan satu jari dan penekanan tombol: tarik kursor.
  • Gerakan dua jari dengan kedua jari yang bergerak ke arah yang sama: tarik area di bawah pointer ke arah tersebut. Pointer itu sendiri tidak bergerak.
  • Gerakan dua jari dengan kedua jari bergerak ke satu sama lain atau menjauh satu sama lain berbagai arah: geser/skala/putar area yang mengelilingi pointer. Pointer itu sendiri tidak bergerak.
  • Beberapa gerakan jari: gestur bentuk bebas.

Penolakan telapak tangan

Mulai Android 13, sistem dapat otomatis menolak input dari telapak tangan saat framework bawaan diaktifkan. Solusi internal yang dibuat secara khusus masih didukung, meskipun mungkin perlu dimodifikasi untuk mengembalikan tanda TOOL_TYPE_PALM saat telapak tangan terdeteksi. Kerangka kerja bawaan juga berfungsi bersama dengan solusi khusus.

Model sebenarnya melihat data gestur 90 milidetik pertama, pada pointer saat ini, dan pada {i>pointer<i} di sekitarnya, lalu mempertimbangkan seberapa jauh sentuhan itu dari tepi layar. Kemudian, berdasarkan per pointer, pointer mana yang merupakan telapak tangan. Model ini juga menyertakan memperhitungkan ukuran setiap kontak, seperti yang dilaporkan oleh touchMajor dan touchMinor. Framework Android kemudian menghapus pointer yang ditandai sebagai telapak tangan dari aliran sentuh.

Jika pointer sudah dikirim ke aplikasi, sistem akan:

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

API publik, MotionEvent.FLAG_CANCELED, menunjukkan bahwa tidak akan memicu tindakan pengguna. Tanda ini disetel untuk ACTION_CANCEL dan ACTION_POINTER_UP.

Jika pointer telapak tangan tidak dikirim ke aplikasi, sistem hanya akan menjatuhkan pointer.

Aktifkan penolakan telapak tangan

  1. Di driver sentuh, gunakan Makro input_abs_set_res untuk menetapkan resolusi kolom 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 bersifat opsional. Namun, jika perangkat Anda mendukungnya, pastikan resolusi ditetapkan dengan benar.

  2. Untuk memastikan 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 dalamnya 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 ini secara permanen, tambahkan perintah {i>sysprop<i} yang sesuai di init**rc file:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Bacaan lebih lanjut