อุปกรณ์สัมผัส

Android รองรับหน้าจอสัมผัสและทัชแพดที่หลากหลาย รวมถึงแท็บเล็ต digitizer ที่ใช้สไตลัส

หน้าจอสัมผัสเป็นอุปกรณ์สัมผัสที่เชื่อมโยงกับจอแสดงผลในลักษณะที่ผู้ใช้มีความรู้สึกว่าจัดการรายการบนหน้าจอโดยตรง

ทัชแพดคืออุปกรณ์สัมผัสที่ไม่เกี่ยวข้องกับจอแสดงผล เช่น แท็บเล็ตดิจิไทเซอร์ โดยทั่วไปจะใช้ทัชแพดสำหรับการชี้ตำแหน่งหรือการวางตำแหน่งโดยอ้อมหรือการควบคุมส่วนต่อประสานกับผู้ใช้ด้วยท่าทาง

อุปกรณ์ระบบสัมผัสอาจมีปุ่มที่ทำหน้าที่คล้ายกับปุ่มเมาส์

บางครั้งอุปกรณ์ระบบสัมผัสสามารถจัดการได้โดยใช้เครื่องมือต่างๆ มากมาย เช่น นิ้วหรือปากกาสไตลัส ขึ้นอยู่กับเทคโนโลยีเซ็นเซอร์สัมผัสพื้นฐาน

บางครั้งใช้อุปกรณ์สัมผัสเพื่อใช้งานคีย์เสมือน ตัวอย่างเช่น ในอุปกรณ์ Android บางรุ่น พื้นที่เซ็นเซอร์หน้าจอสัมผัสจะขยายเลยขอบของจอแสดงผลและทำหน้าที่สองอย่างโดยเป็นส่วนหนึ่งของแป้นกดที่ไวต่อการสัมผัส

เนื่องจากอุปกรณ์ระบบสัมผัสมีความหลากหลายมาก Android จึงอาศัยคุณสมบัติการกำหนดค่าจำนวนมากเพื่ออธิบายคุณลักษณะและลักษณะการทำงานที่ต้องการของอุปกรณ์แต่ละชิ้น

แตะการจัดประเภทอุปกรณ์

อุปกรณ์อินพุตถูกจัดประเภทเป็น อุปกรณ์มัลติทัช หากเป็นไปตามเงื่อนไขทั้งสองข้อต่อไปนี้:

  • อุปกรณ์อินพุตรายงานการมีอยู่ของแกนสัมบูรณ์ ABS_MT_POSITION_X และ ABS_MT_POSITION_Y

  • อุปกรณ์อินพุตไม่มีปุ่มเกมแพดใดๆ เงื่อนไขนี้จะแก้ไขความกำกวมกับเกมแพดบางเกมที่รายงานแกนด้วยรหัสที่ทับซ้อนกับแกน MT

อุปกรณ์อินพุตถูกจัดประเภทเป็นอุปกรณ์ แบบสัมผัสเดียว หากทั้งสองเงื่อนไขต่อไปนี้มีอยู่:

  • อุปกรณ์อินพุตไม่จัดอยู่ในประเภทอุปกรณ์มัลติทัช อุปกรณ์อินพุตจัดอยู่ในประเภทอุปกรณ์สัมผัสเดียวหรืออุปกรณ์มัลติทัช ไม่จัดทั้งสองอย่าง

  • อุปกรณ์อินพุตรายงานการมีอยู่ของแกนสัมบูรณ์ ABS_X และ ABS_Y และการมีอยู่ของรหัสคีย์ BTN_TOUCH

เมื่ออุปกรณ์อินพุตได้รับการจัดประเภทเป็นอุปกรณ์สัมผัสแล้ว การมีอยู่ของคีย์เสมือนจะถูกกำหนดโดยการพยายามโหลดไฟล์แผนที่คีย์เสมือนสำหรับอุปกรณ์ หากมีแมปคีย์เสมือน ไฟล์เค้าโครงคีย์สำหรับอุปกรณ์จะถูกโหลดด้วย

โปรดดูส่วนด้านล่างเกี่ยวกับตำแหน่งและรูปแบบของไฟล์แผนที่คีย์เสมือน

จากนั้น ระบบจะโหลดไฟล์การกำหนดค่าอุปกรณ์อินพุตสำหรับอุปกรณ์สัมผัส

อุปกรณ์สัมผัสในตัวทั้งหมดควรมีไฟล์การกำหนดค่าอุปกรณ์อินพุต หากไม่มีไฟล์การกำหนดค่าอุปกรณ์อินพุต ระบบจะเลือกการกำหนดค่าเริ่มต้นที่เหมาะสมสำหรับอุปกรณ์ต่อพ่วงแบบสัมผัสที่ใช้งานทั่วไปทั่วไป เช่น หน้าจอสัมผัสหรือทัชแพด USB หรือ Bluetooth HID ภายนอก ค่าเริ่มต้นเหล่านี้ไม่ได้ออกแบบมาสำหรับหน้าจอสัมผัสในตัว และมักจะส่งผลให้เกิดพฤติกรรมที่ไม่ถูกต้อง

หลังจากโหลดการกำหนดค่าอุปกรณ์อินพุตแล้ว ระบบจะจัดประเภทอุปกรณ์อินพุตเป็น หน้าจอ สัมผัส ทัชแพด หรืออุปกรณ์ ตัวชี้

  • อุปกรณ์ หน้าจอสัมผัส ใช้สำหรับจัดการวัตถุบนหน้าจอโดยตรง เนื่องจากผู้ใช้สัมผัสหน้าจอโดยตรง ระบบจึงไม่ต้องการความช่วยเหลือเพิ่มเติมใดๆ เพื่อระบุวัตถุที่ถูกจัดการ

  • อุปกรณ์ ทัชแพด ใช้เพื่อให้ข้อมูลตำแหน่งที่แน่นอนแก่แอปพลิเคชันเกี่ยวกับการสัมผัสบนพื้นที่เซ็นเซอร์ที่กำหนด อาจมีประโยชน์สำหรับแท็บเล็ต digitizer

  • อุปกรณ์ ตัวชี้ ใช้สำหรับจัดการวัตถุบนหน้าจอทางอ้อมโดยใช้เคอร์เซอร์ นิ้วถูกตีความว่าเป็นท่าทางสัมผัสของตัวชี้แบบมัลติทัช เครื่องมืออื่นๆ เช่น สไตลัส ถูกตีความโดยใช้ตำแหน่งสัมบูรณ์

    ดู ท่าทางสัมผัสตัวชี้มัลติทัชทางอ้อม สำหรับข้อมูลเพิ่มเติม

กฎต่อไปนี้ใช้เพื่อจัดประเภทอุปกรณ์อินพุตเป็น หน้าจอ สัมผัส ทัชแพด หรืออุปกรณ์ ตัวชี้

  • หากมีการตั้งค่าคุณสมบัติ touch.deviceType ประเภทอุปกรณ์จะถูกตั้งค่าตามที่ระบุ

  • หากอุปกรณ์อินพุตรายงานการมีอยู่ของคุณสมบัติอินพุต INPUT_PROP_DIRECT (ผ่าน EVIOCGPROP ioctl) ประเภทอุปกรณ์จะถูกตั้งค่าเป็น หน้าจอสัมผัส เงื่อนไขนี้ถือว่าอุปกรณ์สัมผัสอินพุตโดยตรงต่ออยู่กับจอแสดงผลที่เชื่อมต่อด้วย

  • หากอุปกรณ์อินพุตรายงานการมีอยู่ของคุณสมบัติอินพุต INPUT_PROP_POINTER (ผ่าน EVIOCGPROP ioctl) ประเภทอุปกรณ์จะถูกตั้งค่าเป็น pointer

  • หากอุปกรณ์อินพุตรายงานการมีอยู่ของแกนสัมพัทธ์ REL_X หรือ REL_Y ประเภทอุปกรณ์จะถูกตั้งค่าเป็น ทัชแพด เงื่อนไขนี้จะแก้ไขความกำกวมสำหรับอุปกรณ์อินพุตที่มีทั้งเมาส์และทัชแพด ในกรณีนี้ ทัชแพดจะไม่ถูกใช้เพื่อควบคุมตัวชี้เนื่องจากเมาส์ควบคุมอยู่แล้ว

  • มิฉะนั้น ประเภทอุปกรณ์จะถูกตั้งค่าเป็น ตัวชี้ ค่าเริ่มต้นนี้ช่วยให้แน่ใจว่าทัชแพดที่ไม่ได้กำหนดวัตถุประสงค์พิเศษอื่นใดจะทำหน้าที่ควบคุมตัวชี้

ปุ่ม

ปุ่มเป็น ตัว ควบคุมเสริมที่แอปพลิเคชันอาจใช้เพื่อทำหน้าที่เพิ่มเติม ปุ่มบนอุปกรณ์ระบบสัมผัสทำงานคล้ายกับปุ่มเมาส์ และส่วนใหญ่จะใช้กับอุปกรณ์ระบบสัมผัสประเภทพ อย เตอร์หรือสไตลัส

รองรับปุ่มต่อไปนี้:

  • BTN_LEFT : แมปกับ MotionEvent.BUTTON_PRIMARY

  • BTN_RIGHT : แมปกับ MotionEvent.BUTTON_SECONDARY

  • BTN_MIDDLE : แมปกับ MotionEvent.BUTTON_MIDDLE

  • BTN_BACK และ BTN_SIDE : แมปกับ MotionEvent.BUTTON_BACK การกดปุ่มนี้ยังสังเคราะห์การกดปุ่มด้วยรหัสคีย์ KeyEvent.KEYCODE_BACK

  • BTN_FORWARD และ BTN_EXTRA : แมปกับ MotionEvent.BUTTON_FORWARD การกดปุ่มนี้ยังสังเคราะห์การกดปุ่มด้วยรหัสคีย์ KeyEvent.KEYCODE_FORWARD

  • BTN_STYLUS : แมปกับ MotionEvent.BUTTON_SECONDARY

  • BTN_STYLUS2 : แมปกับ MotionEvent.BUTTON_TERTIARY

เครื่องมือและประเภทของเครื่องมือ

เครื่องมือ คือนิ้ว สไตลัส หรือเครื่องมืออื่นๆ ที่ใช้เพื่อโต้ตอบกับอุปกรณ์สัมผัส อุปกรณ์สัมผัสบางชนิดสามารถแยกความแตกต่างระหว่างเครื่องมือประเภทต่างๆ

ที่อื่นใน Android เช่นเดียวกับใน MotionEvent API เครื่องมือ มักจะเรียกว่า ตัวชี้

รองรับประเภทเครื่องมือต่อไปนี้:

  • BTN_TOOL_FINGER และ MT_TOOL_FINGER : แมปกับ MotionEvent.TOOL_TYPE_FINGER

  • BTN_TOOL_PEN และ MT_TOOL_PEN : แมปกับ MotionEvent.TOOL_TYPE_STYLUS

  • BTN_TOOL_RUBBER : แมปกับ MotionEvent.TOOL_TYPE_ERASER

  • BTN_TOOL_BRUSH : แมปกับ MotionEvent.TOOL_TYPE_STYLUS

  • BTN_TOOL_PENCIL : แมปกับ MotionEvent.TOOL_TYPE_STYLUS

  • BTN_TOOL_AIRBRUSH : แมปกับ MotionEvent.TOOL_TYPE_STYLUS

  • BTN_TOOL_MOUSE : แมปกับ MotionEvent.TOOL_TYPE_MOUSE

  • BTN_TOOL_LENS : แมปกับ MotionEvent.TOOL_TYPE_MOUSE

  • BTN_TOOL_DOUBLETAP , BTN_TOOL_TRIPLETAP และ BTN_TOOL_QUADTAP : แมปกับ MotionEvent.TOOL_TYPE_FINGER

โฮเวอร์เทียบกับเครื่องมือสัมผัส

เครื่องมือสามารถสัมผัสกับอุปกรณ์สัมผัสหรืออยู่ในระยะและลอยอยู่เหนืออุปกรณ์นั้น อุปกรณ์ระบบสัมผัสบางรุ่นไม่สามารถรับรู้ว่ามีเครื่องมืออยู่เหนืออุปกรณ์ระบบสัมผัส เครื่องมือดังกล่าว เช่น ดิจิไทเซอร์สไตลัสที่ใช้ RF มักจะตรวจจับได้เมื่อเครื่องมืออยู่ในช่วงจำกัดของดิจิไทเซอร์

คอมโพเนนต์ InputReader ดูแลเพื่อแยกแยะเครื่องมือสัมผัสออกจากเครื่องมือที่ลอยอยู่ ในทำนองเดียวกัน เครื่องมือสัมผัสและเครื่องมือโฮเวอร์จะรายงานไปยังแอปพลิเคชันในลักษณะต่างๆ กัน

เครื่องมือสัมผัสจะถูกรายงานไปยังแอปพลิเคชันเป็นกิจกรรมการสัมผัสโดยใช้ MotionEvent.ACTION_DOWN , MotionEvent.ACTION_MOVE , MotionEvent.ACTION_DOWN , MotionEvent.ACTION_POINTER_DOWN และ MotionEvent.ACTION_POINTER_UP

เครื่องมือโฮเวอร์จะรายงานไปยังแอปพลิเคชันเป็นเหตุการณ์การเคลื่อนไหวทั่วไปโดยใช้ MotionEvent.ACTION_HOVER_ENTER , MotionEvent.ACTION_HOVER_MOVE และ MotionEvent.ACTION_HOVER_EXIT

แตะข้อกำหนดไดรเวอร์อุปกรณ์

  1. ไดรเวอร์อุปกรณ์ระบบสัมผัสควรลงทะเบียนเฉพาะแกนและรหัสคีย์สำหรับแกนและปุ่มที่รองรับจริงเท่านั้น การลงทะเบียนแกนหรือรหัสคีย์เกินอาจทำให้อัลกอริทึมการจัดประเภทอุปกรณ์สับสนหรือทำให้ระบบตรวจหาความสามารถของอุปกรณ์ไม่ถูกต้อง

    ตัวอย่างเช่น หากอุปกรณ์รายงานรหัสคีย์ BTN_TOUCH ระบบจะถือว่า BTN_TOUCH จะถูกใช้เพื่อระบุว่าเครื่องมือสัมผัสหน้าจอจริงหรือไม่ ดังนั้นจึงไม่ควรใช้ BTN_TOUCH เพื่อระบุว่าเครื่องมืออยู่ในระยะและลอยอยู่เท่านั้น

  2. อุปกรณ์สัมผัสเดียวใช้เหตุการณ์อินพุต Linux ต่อไปนี้:

    • ABS_X : (ต้องระบุ) รายงานพิกัด X ของเครื่องมือ

    • ABS_Y : (ต้องระบุ) รายงานพิกัด Y ของเครื่องมือ

    • ABS_PRESSURE : (เลือกได้) รายงานแรงกดทางกายภาพที่ใช้กับส่วนปลายของเครื่องมือหรือความแรงของสัญญาณของหน้าสัมผัสแบบสัมผัส

    • ABS_TOOL_WIDTH : (เป็นทางเลือก) รายงานพื้นที่หน้าตัดหรือความกว้างของหน้าสัมผัสแบบสัมผัสหรือของตัวเครื่องมือเอง

    • ABS_DISTANCE : (เป็นทางเลือก) รายงานระยะห่างของเครื่องมือจากพื้นผิวของอุปกรณ์สัมผัส

    • ABS_TILT_X : (เป็นทางเลือก) รายงานการเอียงของเครื่องมือจากพื้นผิวของอุปกรณ์สัมผัสตามแนวแกน X

    • ABS_TILT_Y : (เป็นทางเลือก) รายงานการเอียงของเครื่องมือจากพื้นผิวของอุปกรณ์สัมผัสตามแนวแกน Y

    • BTN_TOUCH : (ต้องระบุ) ระบุว่าเครื่องมือสัมผัสกับอุปกรณ์หรือไม่

    • BTN_LEFT , BTN_RIGHT , BTN_MIDDLE , BTN_BACK , BTN_SIDE , BTN_FORWARD , BTN_EXTRA , BTN_STYLUS , BTN_STYLUS2 : (ทางเลือก) สถานะ ปุ่ม รายงาน

    • 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 : (ตัวเลือก) รายงาน ประเภทเครื่องมือ

  3. อุปกรณ์มัลติทัชใช้เหตุการณ์อินพุต Linux ต่อไปนี้:

    • ABS_MT_POSITION_X : (ต้องระบุ) รายงานพิกัด X ของเครื่องมือ

    • ABS_MT_POSITION_Y : (ต้องระบุ) รายงานพิกัด Y ของเครื่องมือ

    • ABS_MT_PRESSURE : (ไม่บังคับ) รายงานแรงกดทางกายภาพที่ใช้กับปลายเครื่องมือหรือความแรงของสัญญาณของหน้าสัมผัสแบบสัมผัส

    • ABS_MT_TOUCH_MAJOR : (ตัวเลือก) รายงานพื้นที่หน้าสัมผัสสัมผัส หรือความยาวของมิติที่ยาวกว่าของหน้าสัมผัสสัมผัส

    • ABS_MT_TOUCH_MINOR : (ทางเลือก) รายงานความยาวของมิติที่สั้นกว่าของหน้าสัมผัสแบบสัมผัส ไม่ควรใช้แกนนี้หาก ABS_MT_TOUCH_MAJOR กำลังรายงานการวัดพื้นที่

    • ABS_MT_WIDTH_MAJOR : (ตัวเลือก) รายงานพื้นที่หน้าตัดของตัวเครื่องมือเอง หรือความยาวของมิติที่ยาวกว่าของตัวเครื่องมือเอง ไม่ควรใช้แกนนี้หากไม่ทราบขนาดของเครื่องมือ

    • ABS_MT_WIDTH_MINOR : (ตัวเลือก) รายงานความยาวของมิติที่สั้นกว่าของเครื่องมือ ไม่ควรใช้แกนนี้หาก ABS_MT_WIDTH_MAJOR กำลังรายงานการวัดพื้นที่ หรือหากไม่ทราบขนาดของเครื่องมือ

    • ABS_MT_ORIENTATION : (ไม่บังคับ) รายงานการวางแนวของเครื่องมือ

    • ABS_MT_DISTANCE : (เป็นทางเลือก) รายงานระยะห่างของเครื่องมือจากพื้นผิวของอุปกรณ์สัมผัส

    • ABS_MT_TOOL_TYPE : (เป็นทางเลือก) รายงาน ประเภทเครื่องมือ เป็น MT_TOOL_FINGER หรือ MT_TOOL_PEN

    • ABS_MT_TRACKING_ID : (ไม่บังคับ) รายงานรหัสการติดตามของเครื่องมือ รหัสการติดตามเป็นจำนวนเต็มที่ไม่ใช่ค่าลบตามอำเภอใจ ซึ่งใช้ในการระบุและติดตามเครื่องมือแต่ละรายการแยกกันเมื่อเครื่องมือหลายตัวทำงาน ตัวอย่างเช่น เมื่อนิ้วหลายนิ้วสัมผัสอุปกรณ์ แต่ละนิ้วควรได้รับการกำหนดรหัสการติดตามที่แตกต่างกัน ซึ่งจะใช้ตราบเท่าที่นิ้วยังคงสัมผัสกัน รหัสการติดตามอาจถูกนำมาใช้ซ้ำเมื่อเครื่องมือที่เกี่ยวข้องย้ายออกจากช่วง

    • ABS_MT_SLOT : (เป็นทางเลือก) รายงาน ID สล็อตของเครื่องมือ เมื่อใช้โปรโตคอล Linux แบบมัลติทัช 'B' โปรดดูเอกสารประกอบของโปรโตคอล Linux มัลติทัชสำหรับรายละเอียดเพิ่มเติม

    • BTN_TOUCH : (ต้องระบุ) ระบุว่าเครื่องมือสัมผัสกับอุปกรณ์หรือไม่

    • BTN_LEFT , BTN_RIGHT , BTN_MIDDLE , BTN_BACK , BTN_SIDE , BTN_FORWARD , BTN_EXTRA , BTN_STYLUS , BTN_STYLUS2 : (ทางเลือก) สถานะ ปุ่ม รายงาน

    • 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 : (ตัวเลือก) รายงาน ประเภทเครื่องมือ

  4. หากมีการกำหนดแกนสำหรับทั้งโปรโตคอลแบบสัมผัสเดียวและแบบมัลติทัช ระบบจะใช้เฉพาะแกนแบบมัลติทัชและแกนแบบสัมผัสเดียวจะถูกละเว้น

  5. ค่าต่ำสุดและค่าสูงสุดของ ABS_X , ABS_Y , ABS_MT_POSITION_X และ ABS_MT_POSITION_Y กำหนดขอบเขตของพื้นที่ใช้งานของอุปกรณ์ในหน่วยพื้นผิวเฉพาะของอุปกรณ์ ในกรณีของหน้าจอสัมผัส พื้นที่ใช้งานจะอธิบายถึงส่วนของอุปกรณ์สัมผัสที่ครอบคลุมจอแสดงผลจริง

    สำหรับหน้าจอสัมผัส ระบบจะสอดแทรกตำแหน่งสัมผัสที่รายงานโดยอัตโนมัติในหน่วยพื้นผิวเพื่อให้ได้ตำแหน่งสัมผัสในพิกเซลแสดงผลตามการคำนวณต่อไปนี้:

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

    หน้าจอสัมผัสอาจรายงานการสัมผัสนอกพื้นที่ใช้งานที่รายงาน

    การสัมผัสที่เริ่มต้นนอกพื้นที่ใช้งานจะไม่ส่งไปยังแอปพลิเคชัน แต่อาจใช้สำหรับคีย์เสมือน

    การสัมผัสที่เริ่มต้นภายในพื้นที่ใช้งานหรือเข้าและออกจากพื้นที่แสดงผลจะถูกส่งไปยังแอปพลิเคชัน ดังนั้น หากการสัมผัสเริ่มต้นขึ้นภายในขอบเขตของแอปพลิเคชัน แล้วเคลื่อนออกนอกพื้นที่ที่ใช้งานอยู่ แอปพลิเคชันอาจได้รับเหตุการณ์การสัมผัสพร้อมพิกัดการแสดงผลที่เป็นค่าลบหรือเกินขอบเขตของจอแสดงผล นี่เป็นพฤติกรรมที่คาดหวัง

    อุปกรณ์สัมผัสไม่ควรหนีบพิกัดการสัมผัสไว้ที่ขอบเขตของพื้นที่ใช้งาน หากสัมผัสออกจากพื้นที่ใช้งาน ควรรายงานว่าอยู่นอกพื้นที่ใช้งาน หรือไม่ควรรายงานเลย

    ตัวอย่างเช่น หากนิ้วของผู้ใช้สัมผัสใกล้กับมุมบนซ้ายของหน้าจอสัมผัส ก็อาจรายงานพิกัดเป็น (minX, minY) หากนิ้วยังเคลื่อนที่ต่อไปนอกพื้นที่ใช้งาน หน้าจอสัมผัสควรเริ่มรายงานพิกัดด้วยส่วนประกอบที่น้อยกว่า minX และ minY เช่น (minX - 2, minY - 3) หรือควรหยุดการรายงานการสัมผัสไปเลย กล่าวอีกนัยหนึ่ง หน้าจอสัมผัส ไม่ ควรรายงาน (minX, minY) เมื่อนิ้วของผู้ใช้สัมผัสจริงๆ นอกพื้นที่ใช้งาน

    การยึดพิกัดการสัมผัสเข้ากับขอบจอแสดงผลจะสร้างขอบแข็งประดิษฐ์ขึ้นรอบๆ ขอบของหน้าจอ ซึ่งทำให้ระบบไม่สามารถติดตามการเคลื่อนไหวที่เข้าหรือออกจากขอบของพื้นที่แสดงผลได้อย่างราบรื่น

  6. ค่าที่รายงานโดย ABS_PRESSURE หรือ ABS_MT_PRESSURE หากเป็นค่าที่รายงานทั้งหมด จะต้องไม่เป็นศูนย์เมื่อเครื่องมือแตะกับอุปกรณ์ และมิฉะนั้นจะเป็นศูนย์เพื่อระบุว่าเครื่องมือกำลังลอยอยู่

    การรายงานข้อมูลความกดดันเป็น ทางเลือก แต่แนะนำเป็นอย่างยิ่ง แอปพลิเคชันสามารถใช้ข้อมูลแรงกดเพื่อใช้การวาดภาพที่ไวต่อแรงกดและเอฟเฟกต์อื่นๆ

  7. ค่าที่รายงานโดย ABS_TOOL_WIDTH , ABS_MT_TOUCH_MAJOR , ABS_MT_TOUCH_MINOR , ABS_MT_WIDTH_MAJOR หรือ ABS_MT_WIDTH_MINOR ควรไม่เป็นศูนย์เมื่อเครื่องมือสัมผัสกับอุปกรณ์ และมิฉะนั้นจะเป็นศูนย์ แต่ไม่จำเป็น ตัวอย่างเช่น อุปกรณ์ระบบสัมผัสอาจวัดขนาดของหน้าสัมผัสแบบสัมผัสด้วยนิ้วได้ แต่ไม่สามารถวัดขนาดหน้าสัมผัสแบบสัมผัสด้วยสไตลัสได้

    ข้อมูลขนาดการรายงานเป็น ทางเลือก แต่แนะนำเป็นอย่างยิ่ง แอปพลิเคชันสามารถใช้ข้อมูลแรงกดเพื่อใช้งานการวาดภาพตามขนาดและเอฟเฟกต์อื่นๆ

  8. ค่าที่รายงานโดย ABS_DISTANCE หรือ ABS_MT_DISTANCE ควรเข้าใกล้ศูนย์เมื่อเครื่องมือสัมผัสกับอุปกรณ์ ระยะห่างอาจไม่เป็นศูนย์แม้ว่าเครื่องมือจะสัมผัสโดยตรงก็ตาม ค่าที่แน่นอนที่รายงานขึ้นอยู่กับวิธีที่ฮาร์ดแวร์วัดระยะทาง

    ข้อมูลระยะการรายงานเป็น ทางเลือก แต่แนะนำสำหรับอุปกรณ์สไตลัส

  9. ค่าที่รายงานโดย ABS_TILT_X และ ABS_TILT_Y ควรเป็นศูนย์เมื่อเครื่องมือตั้งฉากกับอุปกรณ์ การเอียงที่ไม่เป็นศูนย์ถือเป็นข้อบ่งชี้ว่าถือเครื่องมือที่มุมเอียง

    มุมเอียงตามแกน X และ Y จะถือว่าระบุเป็นองศาจากแนวตั้งฉาก จุดศูนย์กลาง (ตั้งฉากอย่างสมบูรณ์) กำหนดโดย (max + min) / 2 สำหรับแต่ละแกน ค่าที่น้อยกว่าจุดศูนย์กลางแสดงถึงการเอียงขึ้นหรือไปทางซ้าย ค่าที่มากกว่าจุดกึ่งกลางแสดงถึงการเอียงลงหรือไปทางขวา

    InputReader แปลงส่วนประกอบการเอียง X และ Y ให้เป็นมุมเอียงตั้งฉากตั้งแต่ 0 ถึง PI / 2 เรเดียน และมุมการวางแนวระนาบตั้งแต่ -PI ถึง PI เรเดียน การเป็นตัวแทนนี้ส่งผลให้เกิดคำอธิบายของการวางแนวที่เข้ากันได้กับสิ่งที่ใช้เพื่ออธิบายการสัมผัสด้วยนิ้ว

    การรายงานข้อมูลการเอียงเป็น ทางเลือก แต่แนะนำสำหรับอุปกรณ์สไตลัส

  10. หากมีการรายงานประเภทเครื่องมือโดย ABS_MT_TOOL_TYPE นั้นจะแทนที่ข้อมูลประเภทเครื่องมือใดๆ ที่รายงานโดย BTN_TOOL_* หากไม่มีข้อมูลประเภทเครื่องมือเลย ประเภทเครื่องมือจะมีค่าเริ่มต้นเป็น MotionEvent.TOOL_TYPE_FINGER

  11. เครื่องมือถูกกำหนดให้ทำงานตามเงื่อนไขต่อไปนี้:

    • เมื่อใช้โปรโตคอลสัมผัสเดียว เครื่องมือจะทำงานหาก BTN_TOUCH หรือ BTN_TOOL_* เป็น 1

      เงื่อนไขนี้บอกเป็นนัยว่า InputReader จำเป็นต้องมีข้อมูลบางอย่างเกี่ยวกับลักษณะของเครื่องมือเป็นอย่างน้อย ไม่ว่าจะเป็นแบบสัมผัสหรืออย่างน้อยก็เป็นประเภทเครื่องมือ หากไม่มีข้อมูล จะถือว่าเครื่องมือไม่ได้ใช้งาน (อยู่นอกช่วง)

    • เมื่อใช้โปรโตคอลมัลติทัช 'A' เครื่องมือจะทำงานเมื่อใดก็ตามที่ปรากฏในรายงานการซิงค์ล่าสุด เมื่อเครื่องมือหยุดปรากฏในรายงานการซิงค์ แสดงว่าเครื่องมือนั้นไม่มีอยู่จริง

    • เมื่อใช้โปรโตคอลมัลติทัช 'B' เครื่องมือจะทำงานตราบเท่าที่มีช่องเสียบที่ใช้งานอยู่ เมื่อช่องถูกล้าง เครื่องมือจะหยุดอยู่

  12. เครื่องมือถูกกำหนดให้ลอยอยู่ตามเงื่อนไขต่อไปนี้:

    • หากเครื่องมือคือ BTN_TOOL_MOUSE หรือ BTN_TOOL_LENS เครื่องมือจะไม่ลอยอยู่ แม้ว่าเงื่อนไขข้อใดข้อหนึ่งต่อไปนี้จะเป็นจริงก็ตาม

    • หากเครื่องมือทำงานอยู่และไดรเวอร์รายงานข้อมูลความดัน และความดันที่รายงานเป็นศูนย์ แสดงว่าเครื่องมือลอยอยู่

    • หากเครื่องมือทำงานอยู่และไดรเวอร์รองรับรหัสคีย์ BTN_TOUCH และ BTN_TOUCH มีค่าเป็นศูนย์ แสดงว่าเครื่องมือนั้นลอยอยู่

  13. InputReader รองรับทั้งโปรโตคอลมัลติทัช 'A' และ 'B' ไดรเวอร์ใหม่ควรใช้โปรโตคอล 'B' แต่จะใช้งานได้

  14. สำหรับ Android Ice Cream Sandwich 4.0 อาจต้องเปลี่ยนไดรเวอร์หน้าจอสัมผัสเพื่อให้สอดคล้องกับข้อกำหนดโปรโตคอลอินพุตของ Linux

    อาจต้องมีการเปลี่ยนแปลงต่อไปนี้:

    • เมื่อเครื่องมือไม่ทำงาน (นิ้วชี้ "ขึ้น") เครื่องมือควรหยุดปรากฏในรายงานการซิงค์แบบมัลติทัชที่ตามมา เมื่อเครื่องมือทั้งหมดไม่ทำงาน (ยกนิ้วทั้งหมดขึ้น "ขึ้น") ไดรเวอร์ควรส่งแพ็กเก็ตรายงานการซิงค์ที่ว่างเปล่า เช่น SYN_MT_REPORT ตามด้วย SYN_REPORT

      Android เวอร์ชันก่อนหน้าคาดว่าจะรายงานเหตุการณ์ "ขึ้น" โดยส่งค่าความดันเป็น 0 ลักษณะการทำงานแบบเก่าเข้ากันไม่ได้กับข้อมูลจำเพาะโปรโตคอลอินพุตของ Linux และไม่รองรับอีกต่อไป

    • ควรรายงานข้อมูลความดันทางกายภาพหรือความแรงของสัญญาณโดยใช้ ABS_MT_PRESSURE

      Android เวอร์ชันก่อนหน้าดึงข้อมูลแรงกดจาก ABS_MT_TOUCH_MAJOR ลักษณะการทำงานแบบเก่าเข้ากันไม่ได้กับข้อมูลจำเพาะโปรโตคอลอินพุตของ Linux และไม่รองรับอีกต่อไป

    • ควรรายงานข้อมูลขนาดสัมผัสโดยใช้ ABS_MT_TOUCH_MAJOR

      Android เวอร์ชันก่อนหน้าดึงข้อมูลขนาดจาก ABS_MT_TOOL_MAJOR ลักษณะการทำงานแบบเก่าเข้ากันไม่ได้กับข้อมูลจำเพาะโปรโตคอลอินพุตของ Linux และไม่รองรับอีกต่อไป

    ไดรเวอร์อุปกรณ์สัมผัสไม่จำเป็นต้องปรับแต่งเฉพาะ Android อีกต่อไป โดยอาศัยโปรโตคอลอินพุตมาตรฐานของ Linux ทำให้ Android สามารถรองรับอุปกรณ์ต่อพ่วงแบบสัมผัสได้หลากหลายมากขึ้น เช่น หน้าจอสัมผัสแบบมัลติทัช HID ภายนอก โดยใช้ไดรเวอร์ที่ไม่ได้แก้ไข

แตะการทำงานของอุปกรณ์

ต่อไปนี้เป็นข้อมูลสรุปโดยย่อเกี่ยวกับการทำงานของอุปกรณ์สัมผัสบน Android

  1. EventHub อ่านเหตุการณ์ดิบจากไดรเวอร์ evdev

  2. InputReader ใช้เหตุการณ์ดิบและอัปเดตสถานะภายในเกี่ยวกับตำแหน่งและคุณลักษณะอื่น ๆ ของแต่ละเครื่องมือ นอกจากนี้ยังติดตามสถานะของปุ่ม

  3. หากมีการกดหรือปล่อยปุ่ม BACK หรือ FORWARD InputReader จะแจ้ง InputDispatcher เกี่ยวกับเหตุการณ์สำคัญ

  4. InputReader กำหนดว่ามีการกดคีย์เสมือนหรือไม่ หากเป็นเช่นนั้น ระบบจะแจ้ง InputDispatcher เกี่ยวกับเหตุการณ์สำคัญ

  5. InputReader กำหนดว่าการสัมผัสเริ่มต้นภายในขอบเขตของจอแสดงผลหรือไม่ หากเป็นเช่นนั้น ระบบจะแจ้ง InputDispatcher เกี่ยวกับเหตุการณ์การสัมผัส

  6. หากไม่มีเครื่องมือสัมผัส แต่มีเครื่องมือโฮเวอร์อย่างน้อยหนึ่งเครื่องมือ InputReader จะแจ้ง InputDispatcher เกี่ยวกับเหตุการณ์โฮเวอร์

  7. หากประเภทอุปกรณ์สัมผัสเป็น ตัวชี้ InputReader ทำการตรวจจับท่าทางของตัวชี้ ย้ายตัวชี้และจุดตามนั้น และแจ้ง InputDispatcher เกี่ยวกับเหตุการณ์ตัวชี้

  8. InputDispatcher ใช้ WindowManagerPolicy เพื่อกำหนดว่าควรส่งเหตุการณ์หรือไม่ และควรปลุกอุปกรณ์หรือไม่ จากนั้น InputDispatcher จะส่งเหตุการณ์ไปยังแอปพลิเคชันที่เหมาะสม

แตะการกำหนดค่าอุปกรณ์

ลักษณะการทำงานของอุปกรณ์สัมผัสถูกกำหนดโดยแกนของอุปกรณ์, ปุ่ม, คุณสมบัติอินพุต, การกำหนดค่าอุปกรณ์อินพุต, แผนที่คีย์เสมือน และเค้าโครงคีย์

โปรดดูส่วนต่อไปนี้สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับไฟล์ที่เข้าร่วมในการกำหนดค่าแป้นพิมพ์:

คุณสมบัติ

ระบบอาศัยคุณสมบัติการกำหนดค่าอุปกรณ์อินพุตจำนวนมากเพื่อกำหนดค่าและปรับเทียบลักษณะการทำงานของอุปกรณ์สัมผัส

เหตุผลประการหนึ่งคือไดรเวอร์อุปกรณ์สำหรับอุปกรณ์สัมผัสมักจะรายงานลักษณะของการสัมผัสโดยใช้หน่วยเฉพาะของอุปกรณ์

ตัวอย่างเช่น อุปกรณ์สัมผัสจำนวนมากวัดพื้นที่สัมผัสสัมผัสโดยใช้มาตราส่วนเฉพาะภายในอุปกรณ์ เช่น จำนวนโหนดเซ็นเซอร์ทั้งหมดที่ถูกกระตุ้นโดยการสัมผัส ค่าขนาดดิบนี้จะไม่มีความหมายสำหรับแอปพลิเคชัน เนื่องจากแอปพลิเคชันจำเป็นต้องรู้เกี่ยวกับขนาดทางกายภาพและคุณลักษณะอื่นๆ ของโหนดเซ็นเซอร์อุปกรณ์สัมผัส

ระบบใช้พารามิเตอร์การสอบเทียบที่เข้ารหัสในไฟล์กำหนดค่าอุปกรณ์อินพุตเพื่อถอดรหัส แปลง และปรับค่าที่รายงานโดยอุปกรณ์สัมผัสให้เป็นมาตรฐานที่ง่ายกว่าซึ่งแอปพลิเคชันสามารถเข้าใจได้

อนุสัญญาเอกสาร

สำหรับจุดประสงค์ด้านเอกสาร เราจะใช้ข้อตกลงต่อไปนี้เพื่ออธิบายค่าที่ระบบใช้ในระหว่างกระบวนการสอบเทียบ

ค่าแกนดิบ

นิพจน์ต่อไปนี้แสดงถึงค่าดิบที่รายงานโดยไดรเวอร์อุปกรณ์สัมผัสเป็นเหตุการณ์ EV_ABS

raw.x
ค่าของแกน ABS_X หรือ ABS_MT_POSITION_X
raw.y
ค่าของแกน ABS_Y หรือ ABS_MT_POSITION_Y
raw.pressure
ค่าของแกน ABS_PRESSURE หรือ ABS_MT_PRESSURE หรือ 0 หากไม่มี
raw.touchMajor
ค่าของแกน ABS_MT_TOUCH_MAJOR หรือ 0 หากไม่มี
raw.touchMinor
ค่าของแกน ABS_MT_TOUCH_MINOR หรือ raw.touchMajor หากไม่มี
raw.toolMajor
ค่าของแกน ABS_TOOL_WIDTH หรือ ABS_MT_WIDTH_MAJOR หรือ 0 หากไม่มี
raw.toolMinor
ค่าของแกน ABS_MT_WIDTH_MINOR หรือ raw.toolMajor หากไม่มี
raw.orientation
ค่าของแกน ABS_MT_ORIENTATION หรือ 0 หากไม่มี
raw.distance
ค่าของแกน ABS_DISTANCE หรือ ABS_MT_DISTANCE หรือ 0 หากไม่มี
raw.tiltX
ค่าของแกน ABS_TILT_X หรือ 0 หากไม่มี
raw.tiltY
ค่าของแกน ABS_TILT_Y หรือ 0 หากไม่มี

ช่วงแกนดิบ

นิพจน์ต่อไปนี้แสดงถึงขอบเขตของค่าดิบ ได้มาจากการเรียก EVIOCGABS ioctl สำหรับแต่ละแกน

raw.*.min
รวมค่าต่ำสุดของแกนดิบ
raw.*.max
ค่ารวมสูงสุดของแกนดิบ
raw.*.range
เทียบเท่ากับ raw.*.max - raw.*.min
raw.*.fuzz
ความแม่นยำของแกนดิบ เช่น. fuzz = 1 แสดงว่าค่าถูกต้องถึง +/- 1 หน่วย
raw.width
ความกว้างโดยรวมของพื้นที่สัมผัส เทียบเท่ากับ raw.x.range + 1
raw.height
ความสูงโดยรวมของพื้นที่สัมผัส เทียบเท่ากับ raw.y.range + 1

ช่วงเอาต์พุต

นิพจน์ต่อไปนี้แสดงถึงคุณลักษณะของระบบพิกัดเอาต์พุต ระบบใช้การแก้ไขเชิงเส้นเพื่อแปลข้อมูลตำแหน่งการสัมผัสจากหน่วยพื้นผิวที่ใช้โดยอุปกรณ์สัมผัสไปยังหน่วยเอาต์พุตที่จะรายงานไปยังแอปพลิเคชัน เช่น พิกเซลแสดงผล

output.width
ความกว้างเอาต์พุต สำหรับหน้าจอสัมผัส (ที่เกี่ยวข้องกับจอแสดงผล) นี่คือความกว้างของจอแสดงผลเป็นพิกเซล สำหรับทัชแพด (ไม่เกี่ยวข้องกับจอแสดงผล) ความกว้างเอาต์พุตจะเท่ากับ raw.width ซึ่งบ่งชี้ว่าจะไม่มีการแก้ไข
output.height
ความสูงของเอาต์พุต สำหรับหน้าจอสัมผัส (ที่เกี่ยวข้องกับจอแสดงผล) นี่คือความสูงของจอแสดงผลเป็นพิกเซล สำหรับทัชแพด (ไม่เกี่ยวข้องกับจอแสดงผล) ความสูงของเอาต์พุตจะเท่ากับ raw.height ซึ่งระบุว่าจะไม่มีการแก้ไขใดๆ
output.diag
ความยาวเส้นทแยงมุมของระบบพิกัดเอาต์พุต เทียบเท่ากับ sqrt(output.width ^2 + output.height ^2)

การกำหนดค่าพื้นฐาน

ตัวแมปอินพุตแบบสัมผัสใช้คุณสมบัติการกำหนดค่าหลายอย่างในไฟล์การกำหนดค่าอุปกรณ์อินพุตเพื่อระบุค่าการปรับเทียบ ตารางต่อไปนี้อธิบายคุณสมบัติคอนฟิกูเรชันทั่วไปบางประการ คุณสมบัติอื่นๆ ทั้งหมดจะอธิบายไว้ในส่วนต่อไปนี้พร้อมกับฟิลด์ที่ใช้ในการปรับเทียบ

touch.deviceType

คำจำกัดความ: touch.deviceType = touchScreen | touchPad | pointer | default

ระบุประเภทอุปกรณ์สัมผัส

  • หากค่าเป็น touchScreen อุปกรณ์ระบบสัมผัสจะเป็นหน้าจอสัมผัสที่เกี่ยวข้องกับจอแสดงผล

  • หากค่าเป็น touchPad แพด แสดงว่าอุปกรณ์สัมผัสนั้นเป็นทัชแพดที่ไม่เกี่ยวข้องกับจอแสดงผล

  • หากค่าเป็น pointer แสดงว่าอุปกรณ์สัมผัสนั้นเป็นทัชแพดที่ไม่เกี่ยวข้องกับจอแสดงผล และการเคลื่อนไหวของอุปกรณ์นั้นจะใช้สำหรับท่าทางสัมผัสของ ตัวชี้มัลติทัชทางอ้อม

  • หากค่า default ระบบจะตรวจจับประเภทอุปกรณ์โดยอัตโนมัติตามอัลกอริทึมการจำแนกประเภท

โปรดดูส่วน การจัดประเภท สำหรับรายละเอียดเพิ่มเติมว่าประเภทอุปกรณ์มีอิทธิพลต่อลักษณะการทำงานของอุปกรณ์สัมผัสอย่างไร

ก่อนที่จะมี Honeycomb อุปกรณ์ระบบสัมผัสทั้งหมดจะถือว่าเป็นหน้าจอสัมผัส

touch.orientationAware

ความหมาย: touch.orientationAware = 0 | 1

ระบุว่าอุปกรณ์สัมผัสควรตอบสนองต่อการเปลี่ยนแปลงการวางแนวการแสดงผลหรือไม่

  • ถ้าค่าเป็น 1 ตำแหน่งการสัมผัสที่รายงานโดยอุปกรณ์สัมผัสจะถูกหมุนเมื่อใดก็ตามที่การวางแนวการแสดงผลเปลี่ยนไป

  • หากค่าเป็น 0 ตำแหน่งการสัมผัสที่รายงานโดยอุปกรณ์สัมผัสจะไม่แสดงการเปลี่ยนแปลงการวางแนว

ค่าเริ่มต้นคือ 1 หากอุปกรณ์เป็นหน้าจอสัมผัส หากเป็นอย่างอื่นจะเป็น 0

ระบบจะแยกความแตกต่างระหว่างหน้าจอสัมผัสและจอแสดงผลภายในและภายนอก หน้าจอสัมผัสภายในที่ทราบการวางแนวจะหมุนตามการวางแนวของจอแสดงผลภายใน หน้าจอสัมผัสภายนอกที่ทราบการวางแนวจะหมุนตามการวางแนวของจอแสดงผลภายนอก

การรับรู้การวางแนวใช้เพื่อสนับสนุนการหมุนหน้าจอสัมผัสบนอุปกรณ์เช่น Nexus One ตัวอย่างเช่น เมื่อหมุนอุปกรณ์ตามเข็มนาฬิกา 90 องศาจากแนวธรรมชาติ ตำแหน่งสัมบูรณ์ของการสัมผัสจะถูกแมปใหม่ เพื่อให้การสัมผัสที่มุมบนซ้ายของระบบพิกัดสัมบูรณ์ของหน้าจอสัมผัสถูกรายงานเป็นการสัมผัสที่มุมบนซ้าย มุมของระบบพิกัดแบบหมุนของจอแสดงผล สิ่งนี้ทำเพื่อให้มีการรายงานการสัมผัสด้วยระบบพิกัดเดียวกันกับที่แอปพลิเคชันใช้ในการวาดองค์ประกอบภาพ

ก่อนหน้าที่จะมี Honeycomb อุปกรณ์ระบบสัมผัสทั้งหมดจะรับรู้ถึงการวางแนว

touch.gestureMode

คำจำกัดความ: touch.gestureMode = pointer | spots | default

ระบุโหมดการนำเสนอสำหรับท่าทางของตัวชี้ คุณสมบัติการกำหนดค่านี้เกี่ยวข้องเฉพาะเมื่ออุปกรณ์สัมผัสเป็นประเภทพ อย น์เตอร์

  • ถ้าค่าเป็น pointer รูปแบบการสัมผัสของทัชแพดจะแสดงโดยใช้เคอร์เซอร์คล้ายกับตัวชี้เมาส์

  • ถ้าค่าเป็น spots รูปแบบการสัมผัสของทัชแพดจะแสดงโดยจุดยึดที่แสดงถึงศูนย์กลางของรูปแบบลายเส้นและชุดของจุดวงกลมที่แสดงถึงตำแหน่งของนิ้วแต่ละนิ้ว

ค่าเริ่มต้นคือ pointer เมื่อตั้งค่าคุณสมบัติอินพุต INPUT_PROP_SEMI_MT หรือ spots อย่างอื่น

ฟิลด์ X และ Y

ช่อง X และ Y ให้ข้อมูลตำแหน่งสำหรับศูนย์กลางของพื้นที่ติดต่อ

การคำนวณ

การคำนวณนั้นตรงไปตรงมา: ข้อมูลตำแหน่งจากไดรเวอร์แบบสัมผัสจะถูกแก้ไขเชิงเส้นกับระบบพิกัดเอาต์พุต

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

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

TouchMajor , TouchMinor , ToolMajor , ToolMinor , ฟิลด์ Size

TouchMajor และ TouchMinor อธิบายขนาดโดยประมาณของพื้นที่สัมผัสในหน่วยเอาต์พุต (พิกเซล)

ToolMajor และ ToolMinor อธิบายขนาดโดยประมาณของ เครื่องมือ ในหน่วยเอาต์พุต (พิกเซล)

ช่อง Size จะอธิบายขนาดปกติของการสัมผัสที่สัมพันธ์กับการสัมผัสที่ใหญ่ที่สุดเท่าที่อุปกรณ์สัมผัสจะรับรู้ได้ ขนาดนอร์มัลไลซ์ที่เล็กที่สุดเท่าที่จะเป็นไปได้คือ 0.0 (ไม่มีการสัมผัส หรือวัดไม่ได้) และขนาดนอร์มัลไลซ์ที่ใหญ่ที่สุดที่เป็นไปได้คือ 1.0 (พื้นที่เซ็นเซอร์อิ่มตัว)

เมื่อสามารถวัดทั้งความยาวและความกว้างโดยประมาณได้ ฟิลด์ TouchMajor จะระบุมิติที่ยาวกว่า และฟิลด์ TouchMinor จะระบุมิติที่สั้นกว่าของพื้นที่สัมผัส เมื่อวัดได้เฉพาะเส้นผ่านศูนย์กลางโดยประมาณของพื้นที่สัมผัสเท่านั้น ฟิลด์ TouchMajor และ TouchMinor จะเท่ากัน

ในทำนองเดียวกัน ฟิลด์ ToolMajor จะระบุมิติที่ยาวกว่า และฟิลด์ ToolMinor จะระบุมิติที่สั้นกว่าของพื้นที่หน้าตัดของเครื่องมือ

หากไม่มีขนาดสัมผัสแต่มีขนาดเครื่องมืออยู่ ขนาดเครื่องมือจะถูกตั้งค่าให้เท่ากับขนาดสัมผัส ในทางกลับกัน หากขนาดเครื่องมือไม่พร้อมใช้งาน แต่ขนาดสัมผัสใช้ได้ ขนาดสัมผัสจะถูกตั้งค่าเท่ากับขนาดเครื่องมือ

อุปกรณ์สัมผัสวัดหรือรายงานขนาดสัมผัสและขนาดเครื่องมือด้วยวิธีต่างๆ การใช้งานปัจจุบันรองรับการวัดที่แตกต่างกันสามประเภท: เส้นผ่านศูนย์กลาง พื้นที่ และกล่องขอบเขตทางเรขาคณิตในหน่วยพื้นผิว

touch.size.calibration

คำจำกัดความ: touch.size.calibration = none | geometric | diameter | area | default

ระบุชนิดของการวัดที่ใช้โดยโปรแกรมควบคุมการสัมผัสเพื่อรายงานขนาดการสัมผัสและขนาดเครื่องมือ

  • ถ้า none ค่า ขนาดจะถูกตั้งค่าเป็นศูนย์

  • ถ้าค่าเป็น geometric จะถือว่าขนาดระบุในหน่วยพื้นผิวเดียวกับตำแหน่ง ดังนั้นจึงปรับขนาดด้วยวิธีเดียวกัน

  • หากค่าเป็น diameter ขนาดจะถือว่าได้สัดส่วนกับเส้นผ่านศูนย์กลาง (ความกว้าง) ของหน้าสัมผัสหรือเครื่องมือ

  • ถ้าค่าเป็น area ขนาดจะถือว่าได้สัดส่วนกับพื้นที่สัมผัสหรือเครื่องมือ

  • หากค่า default ระบบจะใช้การปรับเทียบ geometric หากมีแกน raw.touchMajor หรือ raw.toolMajor มิฉะนั้นจะใช้การปรับเทียบแบบ none

touch.size.scale

คำนิยาม: touch.size.scale = <เลขทศนิยมที่ไม่เป็นลบ>

ระบุสเกลแฟกเตอร์คงที่ที่ใช้ในการสอบเทียบ

ค่าเริ่มต้นคือ 1.0

touch.size.bias

คำนิยาม: touch.size.bias = <เลขทศนิยมที่ไม่เป็นลบ>

ระบุค่าอคติคงที่ที่ใช้ในการสอบเทียบ

ค่าเริ่มต้นคือ 0.0

touch.size.isSummed

คำจำกัดความ: touch.size.isSummed = 0 | 1

ระบุว่าขนาดจะถูกรายงานเป็นผลรวมของขนาดของผู้ติดต่อที่ใช้งานอยู่ทั้งหมด หรือรายงานทีละรายการสำหรับผู้ติดต่อแต่ละราย

  • ถ้าค่าเป็น 1 ขนาดที่รายงานจะถูกหารด้วยจำนวนผู้ติดต่อก่อนใช้งาน

  • ถ้าค่าเป็น 0 ขนาดที่รายงานจะถูกใช้ตามที่เป็น

ค่าเริ่มต้นคือ 0

อุปกรณ์สัมผัสบางชนิด โดยเฉพาะอุปกรณ์ "Semi-MT" ไม่สามารถแยกความแตกต่างของมิติข้อมูลแต่ละรายการของหน้าสัมผัสหลายรายการได้ ดังนั้นอุปกรณ์ดังกล่าวจึงรายงานการวัดขนาดที่แสดงถึงพื้นที่หรือความกว้างทั้งหมด ควรตั้งค่าคุณสมบัตินี้เป็น 1 สำหรับอุปกรณ์ดังกล่าวเท่านั้น หากมีข้อสงสัย ให้ตั้งค่านี้เป็น 0

การคำนวณ

การคำนวณ TouchMajor , TouchMinor , ToolMajor , ToolMinor และ Size ขึ้นอยู่กับพารามิเตอร์การสอบเทียบที่ระบุ

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

size = avg(touchMajor, touchMinor)

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

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

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

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

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

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

output.size = size

สนาม Pressure

ฟิลด์ Pressure อธิบายถึงแรงกดทางกายภาพโดยประมาณที่ใช้กับอุปกรณ์สัมผัสเป็นค่าปกติระหว่าง 0.0 (ไม่สัมผัส) ถึง 1.0 (แรงเต็มที่)

แรงดันเป็นศูนย์แสดงว่าเครื่องมือลอยอยู่

touch.pressure.calibration

คำจำกัดความ: touch.pressure.calibration = none | physical | amplitude | default

ระบุชนิดของการวัดที่ใช้โดยไดรเวอร์ระบบสัมผัสเพื่อรายงานความดัน

  • ถ้าค่าเป็น none แสดงว่าไม่ทราบความดัน ดังนั้นให้ตั้งค่าเป็น 1.0 เมื่อแตะและ 0.0 เมื่อวางเมาส์เหนือ

  • หากเป็นค่า physical จะถือว่าแกนแรงกดเป็นการวัดความเข้มจริงของแรงกดที่กระทำต่อทัชแพด

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

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

touch.pressure.scale

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

Specifies a constant scale factor used in the calibration.

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

Calculation

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

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

Orientation and Tilt Fields

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

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

touch.orientation.calibration

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

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

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

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

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

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

Calculation

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

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

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

        output.orientation = angle

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

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

Distance Field

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

touch.distance.calibration

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

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

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

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

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

touch.distance.scale

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

Specifies a constant scale factor used in the calibration.

The default value is 1.0 .

Calculation

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

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

Example

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

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

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

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

# Orientation
touch.orientation.calibration = vector

Compatibility Notes

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

Older touch device drivers may also need to be updated.

Virtual Key Map Files

Touch devices are often used to implement virtual keys.

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

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

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

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

Syntax

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

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

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

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

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

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

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

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

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

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

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

Example

Virtual key map file: /sys/board_properties/virtualkeys.touchyfeely .

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

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

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

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

type SPECIAL_FUNCTION

Indirect Multi-touch Pointer Gestures

In pointer mode, the system interprets the following gestures:

  1. Single finger tap: click.

  2. Single finger motion: move the pointer.

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

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

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

  6. Multiple finger motion: freeform gesture.

Palm rejection

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

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

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

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

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

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

Enable palm rejection

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

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

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

    See the following example for reference:

    UnwantedInteractionBlocker:
      mEnablePalmRejection: true
      isPalmRejectionEnabled (flag value): true
      mPalmRejectors:
        deviceId = 3:
          mDeviceInfo:
            max_x = 
            max_y = 
            x_res = 11.00
            y_res = 11.00
            major_radius_res = 1.00
            minor_radius_res = 1.00
            minor_radius_supported = true
            touch_major_res = 1
            touch_minor_res = 1
          mSlotState:
            mSlotsByPointerId:
    
            mPointerIdsBySlot:
    
          mSuppressedPointerIds: {}
    
  6. To permanently enable the feature, add the corresponding sysprop command in your init**rc file:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

Further Reading

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