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

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

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

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

อุปกรณ์ระบบสัมผัสสามารถมีปุ่มที่มีฟังก์ชั่นคล้ายกับปุ่มเมาส์ได้

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

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

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

การจำแนกประเภทอุปกรณ์สัมผัส

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

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

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

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

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

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

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

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

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

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

  • หากตั้งค่าคุณสมบัติ touch.deviceType ประเภทอุปกรณ์จะถูกตั้งค่าตามที่ระบุ
  • หากอุปกรณ์อินพุตรายงานการมีอยู่ของคุณสมบัติอินพุต INPUT_PROP_DIRECT (ผ่าน EVIOCGPROP ioctl) แสดงว่าประเภทอุปกรณ์จะถูกตั้งค่าเป็น หน้าจอสัมผัส เงื่อนไขนี้ถือว่าอุปกรณ์สัมผัสอินพุตโดยตรงเชื่อมต่อกับจอแสดงผลที่เชื่อมต่อด้วย
  • หากอุปกรณ์อินพุตรายงานการมีอยู่ของคุณสมบัติอินพุต INPUT_PROP_POINTER (ผ่าน EVIOCGPROP ioctl) ดังนั้นประเภทอุปกรณ์จะตั้งค่าเป็น ตัวชี้
  • หากอุปกรณ์อินพุตรายงานการมีอยู่ของแกนสัมพัทธ์ 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

ข้อกำหนดไดรเวอร์อุปกรณ์สัมผัส

  • ไดรเวอร์อุปกรณ์ระบบสัมผัสควรลงทะเบียนเฉพาะแกนและรหัสกุญแจสำหรับแกนและปุ่มที่รองรับ การลงทะเบียนแกนหรือรหัสคีย์ที่ไม่รองรับอาจทำให้อัลกอริธึมการจัดประเภทอุปกรณ์สับสน หรือทำให้ระบบตรวจจับความสามารถของอุปกรณ์ไม่ถูกต้อง ตัวอย่างเช่น หากอุปกรณ์รายงานรหัสคีย์ BTN_TOUCH ระบบจะถือว่า BTN_TOUCH ถูกใช้เสมอเพื่อระบุว่าเครื่องมือกำลังสัมผัสหน้าจอหรือไม่ ดังนั้นจึงไม่ควรใช้ BTN_TOUCH เพื่อระบุว่าเครื่องมือนั้นอยู่ในช่วงและลอยอยู่เท่านั้น
  • อุปกรณ์แบบสัมผัสเดียวใช้เหตุการณ์อินพุต Linux ต่อไปนี้:
    • ABS_X : (จำเป็น) รายงานพิกัด X ของเครื่องมือ
    • ABS_Y : (REQUIRED) รายงานพิกัด 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 : (เป็นทางเลือก) รายงาน ประเภทเครื่องมือ .
  • อุปกรณ์มัลติทัชใช้เหตุการณ์อินพุต Linux ต่อไปนี้:
    • ABS_MT_POSITION_X : (REQUIRED) รายงานพิกัด X ของเครื่องมือ
    • ABS_MT_POSITION_Y : (REQUIRED) รายงานพิกัด 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 multi-touch สำหรับรายละเอียดเพิ่มเติม
    • 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 : (เป็นทางเลือก) รายงาน ประเภทเครื่องมือ .
  • หากมีการกำหนดแกนสำหรับทั้งโปรโตคอลซิงเกิลทัชและมัลติทัช ระบบจะใช้เฉพาะแกนมัลติทัชเท่านั้น และแกนซิงเกิลทัชจะถูกละเว้น
  • ค่าต่ำสุดและสูงสุดของแกน 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) เมื่อนิ้วของผู้ใช้สัมผัสกันจริงๆ นอกพื้นที่ใช้งาน

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • เมื่อใช้โปรโตคอลมัลติทัช 'A' เครื่องมือจะทำงานทุกครั้งที่ปรากฏในรายงานการซิงค์ล่าสุด เมื่อเครื่องมือหยุดปรากฏในรายงานการซิงค์ เครื่องมือนั้นก็จะสิ้นสุดลง
    • เมื่อใช้โปรโตคอลมัลติทัช 'B' เครื่องมือจะทำงานตราบใดที่ยังมีช่องที่ใช้งานอยู่ เมื่อเคลียร์ช่องแล้ว เครื่องมือก็หยุดอยู่
  • เครื่องมือถูกกำหนดให้วางเมาส์ตามเงื่อนไขต่อไปนี้:
    • หากเครื่องมือเป็น BTN_TOOL_MOUSE หรือ BTN_TOOL_LENS แสดงว่าเครื่องมือไม่โฮเวอร์ แม้ว่าเงื่อนไขข้อใดข้อหนึ่งต่อไปนี้จะเป็นจริงก็ตาม
    • หากเครื่องมือทำงานอยู่และคนขับรายงานข้อมูลความดัน และความดันที่รายงานเป็นศูนย์ แสดงว่าเครื่องมือลอยอยู่
    • หากเครื่องมือทำงานอยู่และไดรเวอร์รองรับรหัสคีย์ BTN_TOUCH และ BTN_TOUCH มีค่าเป็นศูนย์ แสดงว่าเครื่องมือกำลังโฮเวอร์
  • InputReader รองรับทั้งโปรโตคอลมัลติทัช 'A' และ 'B' ไดรเวอร์ใหม่ควรใช้โปรโตคอล 'B' แต่ใช้งานได้
  • สำหรับ Android 4.0 อาจจำเป็นต้องเปลี่ยนไดรเวอร์หน้าจอสัมผัสเพื่อให้สอดคล้องกับข้อกำหนดโปรโตคอลอินพุตของ Linux

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

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

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

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

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

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

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

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

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

ใน Android 3 และต่ำกว่า อุปกรณ์สัมผัสทั้งหมดจะถือว่าเป็นหน้าจอสัมผัส

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, ฟิลด์ขนาด

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

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

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

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

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

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

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

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

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

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

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

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

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

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

สัมผัสขนาดสเกล

คำจำกัดความ: touch.size.scale = <จำนวนจุดลอยตัวที่ไม่เป็นลบ>

ระบุตัวคูณสเกลคงที่ที่ใช้ในการสอบเทียบ

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

touch.size.อคติ

คำจำกัดความ: 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 อธิบายความดันทางกายภาพโดยประมาณที่ใช้กับอุปกรณ์สัมผัสเป็นค่าปกติระหว่าง 0.0 (ไม่มีการสัมผัส) ถึง 1.0 (ความดันปกติ)

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

สัมผัส ความดัน การสอบเทียบ

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

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

  • หากค่าเป็น none แสดงว่าไม่ทราบความดัน ดังนั้นจึงตั้งค่าเป็น 1.0 เมื่อสัมผัส และ 0.0 เมื่อโฮเวอร์

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

  • หากค่าเป็น amplitude แกนความดันจะถูกถือว่าเพื่อวัดแอมพลิจูดของสัญญาณ ซึ่งสัมพันธ์กับขนาดของหน้าสัมผัสและแรงกดที่ใช้

  • หากค่าเป็น default ระบบจะใช้การสอบเทียบ physical หากมีแกนความดันพร้อมใช้งาน มิฉะนั้นจะ none ใช้เลย

สัมผัส ความดัน สเกล

คำจำกัดความ: touch.pressure.scale = <a หมายเลขจุดลอยตัวที่ไม่ใช่เชิงลบ>

ระบุปัจจัยสเกลคงที่ที่ใช้ในการสอบเทียบ

ค่าเริ่มต้นคือ 1.0 / raw.pressure.max

การคำนวณ

การคำนวณฟิลด์ pressure ขึ้นอยู่กับพารามิเตอร์การสอบเทียบที่ระบุ

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 อธิบายการวางแนวของการสัมผัสและเครื่องมือเป็นการวัดเชิงมุม การวางแนวของ 0 บ่งชี้ว่าแกนหลักอยู่ในแนวตั้ง -PI/2 บ่งชี้ว่าแกนหลักนั้นมุ่งเน้นไปทางซ้าย PI/2 บ่งชี้ว่าแกนหลักนั้นมุ่งเน้นไปทางขวา เมื่อมีเครื่องมือสไตลัสช่วงการวางแนวสามารถอธิบายได้ในช่วงวงกลมเต็มรูปแบบตั้งแต่ -PI หรือ PI

สนาม tilt อธิบายถึงความโน้มเอียงของเครื่องมือเป็นการวัดเชิงมุม ความเอียงของ 0 บ่งชี้ว่าเครื่องมือตั้งฉากกับพื้นผิว ความเอียงของ PI/2 บ่งชี้ว่าเครื่องมือนั้นแบนบนพื้นผิว

touch.orientation.calibration

คำจำกัดความ: touch.orientation.calibration = none | interpolated | vector | default

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

  • หาก none ค่าการวางแนวจะไม่เป็นที่รู้จักดังนั้นจึงถูกตั้งค่าเป็น 0
  • หากค่าถูก interpolated การวางแนวจะถูกแก้ไขเชิงเส้นเพื่อให้ค่าดิบของ raw.orientation.min แผนที่ไปที่ -PI/2 และค่าดิบของ raw.orientation.max แผนที่ไปยัง PI/2 ค่ากลางของ (raw.orientation.min + raw.orientation.max) / 2 แผนที่ถึง 0
  • หากค่าเป็น vector การวางแนวจะถูกตีความว่าเป็นเวกเตอร์บรรจุโดยพิจารณาจากสองฟิลด์ 4 บิตที่ลงนาม การเป็นตัวแทนนี้ใช้กับชิ้นส่วนโปรโตคอลที่ใช้วัตถุ ATMEL เมื่อถอดรหัสเวกเตอร์จะให้มุมการวางแนวและขนาดความมั่นใจ ขนาดความเชื่อมั่นใช้ในการปรับขนาดข้อมูลขนาดเว้นแต่จะเป็นเรขาคณิต
  • หากค่าเป็น default ระบบจะใช้การสอบเทียบ interpolated หากแกนการวางทิศทางที่มีอยู่มิฉะนั้นจะใช้ none

การคำนวณ

การคำนวณฟิลด์ orientation และ tilt ขึ้นอยู่กับพารามิเตอร์การสอบเทียบที่ระบุและอินพุตที่มีอยู่

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 อธิบายระยะห่างระหว่างเครื่องมือและพื้นผิวอุปกรณ์สัมผัส ค่า 0.0 หมายถึงการสัมผัสโดยตรงและค่าที่ใหญ่กว่าบ่งบอกถึงระยะทางที่เพิ่มขึ้นจากพื้นผิว

touch.distance.calibration

คำจำกัดความ: touch.distance.calibration = none | scaled ขนาด default

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

  • หาก none ค่าไม่ทราบระยะทางดังนั้นจึงถูกตั้งค่าเป็น 0

  • หากค่าถูก scaled ระยะที่รายงานจะถูกคูณด้วยปัจจัยสเกลคงที่

  • หากค่าเป็น default ระบบจะใช้การสอบเทียบ scaled หากแกนระยะทางที่มีอยู่มิฉะนั้นจะใช้ none

touch.distance.scale

คำจำกัดความ: touch.distance.scale = <a หมายเลขจุดลอยตัวที่ไม่ใช่เชิงลบ>

ระบุปัจจัยสเกลคงที่ที่ใช้ในการสอบเทียบ

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

การคำนวณ

การคำนวณของฟิลด์ distance ขึ้นอยู่กับพารามิเตอร์การสอบเทียบที่ระบุ

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

ตัวอย่าง

# 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

หมายเหตุความเข้ากันได้

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

ไดรเวอร์ อุปกรณ์สัมผัสที่เก่ากว่าอาจต้องได้รับการปรับปรุง

ไฟล์แผนที่คีย์เสมือนจริง

อุปกรณ์สัมผัสสามารถใช้ในการใช้คีย์เสมือนจริง

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

เมื่อมีการใช้คีย์เสมือนจริงในซอฟต์แวร์เคอร์เนลจะต้องส่งออกไฟล์แผนที่คีย์เสมือนจริงที่เรียกว่า virtualkeys.<devicename> เป็นคุณสมบัติบอร์ด ตัวอย่างเช่นหากไดรเวอร์อุปกรณ์หน้าจอสัมผัสรายงานชื่อเป็น "touchyfeely" ไฟล์แผนที่คีย์เสมือนต้องมี path /sys/board_properties/virtualkeys.touchyfeely

ไฟล์แผนที่คีย์เสมือนจริงอธิบายถึงพิกัดและรหัสคีย์ Linux ของปุ่มเสมือนจริงบนหน้าจอสัมผัส

นอกเหนือจากไฟล์แผนที่คีย์เสมือนต้องมีไฟล์เค้าโครงคีย์ที่สอดคล้องกันและไฟล์แผนที่อักขระคีย์เพื่อแมปรหัสคีย์ Linux กับรหัสคีย์ Android และเพื่อระบุประเภทของอุปกรณ์แป้นพิมพ์ (โดยปกติ SPECIAL_FUNCTION )

ไวยากรณ์

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

บรรทัดความคิดเห็นเริ่มต้นด้วย '#' และดำเนินการต่อไปยังจุดสิ้นสุดของบรรทัด

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

  • 0x01 : รหัสเวอร์ชัน ต้องเป็น 0x01 เสมอ
  • <รหัสคีย์ Linux>: รหัสคีย์ Linux ของคีย์เสมือน
  • <Centerx>: พิกเซล X พิกัดของศูนย์กลางของคีย์เสมือนจริง
  • <Centery>: พิกเซล y พิกัดของศูนย์กลางของคีย์เสมือนจริง
  • <Vidth>: ความกว้างของคีย์เสมือนจริงในพิกเซล
  • <ความสูง>: ความสูงของคีย์เสมือนจริงในพิกเซล

มีการระบุพิกัดและขนาดทั้งหมดในแง่ของระบบพิกัดการแสดงผล

นี่คือไฟล์แผนที่คีย์เสมือนทั้งหมดที่เขียนในบรรทัดเดียว

# 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

ไฟล์แผนที่คีย์เสมือนเดียวกันสามารถเขียนได้หลายบรรทัด

# 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

ในตัวอย่างด้านบนหน้าจอสัมผัสมีความละเอียด 480x800 ดังนั้นคีย์เสมือนทั้งหมดทั้งหมดมี <Centery> พิกัด 835 ซึ่งต่ำกว่าพื้นที่ที่มองเห็นได้เล็กน้อยของหน้าจอสัมผัส

คีย์แรกมีรหัสสแกน Linux ที่ 158 ( KEY_BACK ), centerx จาก 55 , ศูนย์กลางของ 835 , ความกว้าง 90 , และความสูง 55

ตัวอย่าง

ไฟล์แผนที่คีย์เสมือนจริง: /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

ไฟล์เค้าโครงคีย์: /system/usr/keylayout/touchyfeely.kl

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

ไฟล์แผนที่อักขระคีย์: /system/usr/keychars/touchyfeely.kcm

type SPECIAL_FUNCTION

ท่าทางตัวชี้แบบมัลติทัชทางอ้อม

ในโหมดตัวชี้ระบบจะตีความท่าทางต่อไปนี้:

  • แตะนิ้วเดียว: คลิก
  • การเคลื่อนไหวนิ้วเดี่ยว: เลื่อนตัวชี้
  • ปุ่ม Motion Plus Single Plus กด: ลากตัวชี้
  • การเคลื่อนไหวสองนิ้วทั้งสองนิ้วเคลื่อนที่ไปในทิศทางเดียวกัน: ลากพื้นที่ใต้ตัวชี้ไปในทิศทางนั้น ตัวชี้นั้นไม่เคลื่อนไหว
  • การเคลื่อนไหวสองนิ้วทั้งสองนิ้วเคลื่อนที่เข้าหากันหรือแยกออกจากกันในทิศทางที่แตกต่างกัน: แพน/สเกล/หมุนบริเวณรอบตัวชี้ ตัวชี้นั้นไม่เคลื่อนไหว
  • การเคลื่อนไหวหลายนิ้ว: ท่าทางฟรีฟอร์ม

การปฏิเสธปาล์ม

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

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

หากตัวชี้ถูกส่งไปยังแอพแล้วระบบก็เช่นกัน:

  • (หากมีพอยน์เตอร์ที่ใช้งานอยู่อื่น ๆ ) ยกเลิกตัวชี้ด้วย ACTION_POINTER_UP และชุด FLAG_CANCELED
  • (ถ้านี่เป็นตัวชี้เดียว) ยกเลิกตัวชี้ด้วย ACTION_CANCEL

API สาธารณะ, MotionEvent.FLAG_CANCELED ระบุว่าเหตุการณ์ปัจจุบันไม่ควรกระตุ้นการกระทำของผู้ใช้ ตั้งค่าสถานะนี้สำหรับทั้ง ACTION_CANCEL และ ACTION_POINTER_UP

หากตัวชี้ปาล์มไม่ได้ส่งไปยังแอพแล้วระบบก็จะลดลงตัวชี้

เปิดใช้งานการปฏิเสธปาล์ม

  1. ในไดรเวอร์แบบสัมผัสของคุณใช้ แมโคร input_abs_set_res เพื่อตั้งค่าความละเอียดสำหรับฟิลด์ต่อไปนี้ (หน่วยเป็น พิกเซลต่อมม. ):
    • ABS_MT_POSITION_X
    • ABS_MT_POSITION_Y
    • ABS_MT_TOUCH_MAJOR
    • ABS_MT_TOUCH_MINOR

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

  2. เพื่อยืนยันว่าฟิลด์ถูกตั้งค่าอย่างถูกต้องให้เรียกใช้:
        $ adb shell getevent -li
    
  3. หากต้องการเปิดใช้งานคุณสมบัติในระหว่างการรันไทม์ Run:
        $ adb shell device_config put input_native_boot palm_rejection_enabled 1
    
  4. รีสตาร์ทกระบวนการ system_server
         $ adb shell stop && adb shell start
        
  5. ยืนยันว่า adb shell dumpsys input แสดงให้เห็นว่ามีการปฏิเสธของ Palm ภายใน UnwantedInteractionBlocker หากไม่ได้ตรวจสอบบันทึกที่เกี่ยวข้องกับอินพุตเพื่อค้นหาเบาะแสเกี่ยวกับสิ่งที่อาจถูกกำหนดค่าผิดพลาด

    ดูตัวอย่างต่อไปนี้สำหรับการอ้างอิง:

    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. หากต้องการเปิดใช้งานคุณสมบัติอย่างถาวรให้เพิ่มคำสั่ง sysprop ที่เกี่ยวข้องในไฟล์ init**rc ของคุณ:

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

อ่านเพิ่มเติม

-

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

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

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

อุปกรณ์สัมผัสสามารถมีปุ่มที่มีฟังก์ชั่นคล้ายกับปุ่มเมาส์

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

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

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

การจำแนกอุปกรณ์สัมผัส

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

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

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

  • อุปกรณ์อินพุตไม่ได้จัดเป็นอุปกรณ์มัลติทัช อุปกรณ์อินพุตถูกจัดประเภทเป็นอุปกรณ์สัมผัสเดี่ยวหรือเป็นอุปกรณ์มัลติทัชไม่เคยทั้งคู่
  • อุปกรณ์อินพุตรายงานการปรากฏตัวของแกน ABS_X และ ABS_Y Absolute และการปรากฏตัวของรหัสคีย์ BTN_TOUCH

เมื่ออุปกรณ์อินพุตถูกจัดประเภทเป็นอุปกรณ์สัมผัสการมีอยู่ของปุ่มเสมือนจะถูกกำหนดโดยพยายามโหลดไฟล์แผนที่คีย์เสมือนสำหรับอุปกรณ์ หากมีแผนที่คีย์เสมือนพร้อมใช้งานไฟล์เค้าโครงคีย์สำหรับอุปกรณ์จะถูกโหลดด้วย อ้างถึง [ไฟล์แผนที่ Virtual Key] (#Virtual-Key-Map-Files) สำหรับข้อมูลเกี่ยวกับตำแหน่งและรูปแบบของไฟล์เหล่านี้

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

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

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

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

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

  • หากตั้งค่าคุณสมบัติ touch.deviceType แล้วประเภทอุปกรณ์จะถูกตั้งค่าตามที่ระบุไว้
  • หากอุปกรณ์อินพุตรายงานการปรากฏตัวของคุณสมบัติอินพุต INPUT_PROP_DIRECT (ผ่าน EVIOCGPROP ioCTL) ดังนั้นประเภทอุปกรณ์จะถูกตั้งค่าเป็น หน้าจอสัมผัส เงื่อนไขนี้สันนิษฐานว่าอุปกรณ์สัมผัสอินพุตโดยตรงนั้นติดอยู่กับจอแสดงผลที่เชื่อมต่อด้วย
  • หากอุปกรณ์อินพุตรายงานการปรากฏตัวของคุณสมบัติอินพุต INPUT_PROP_POINTER (ผ่าน EVIOCGPROP ioCTL) ดังนั้นประเภทอุปกรณ์จะตั้งค่าเป็น ตัวชี้
  • หากอุปกรณ์อินพุตรายงานการมีอยู่ของแกนสัมพัทธ์ 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 เช่นเดียวกับใน API MotionEvent เครื่องมือมักถูกเรียกว่าเป็น ตัวชี้

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

  • 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

การโฉบเมื่อเทียบกับเครื่องมือสัมผัส

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

ส่วนประกอบของ 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

ต้องการความต้องการไดรเวอร์อุปกรณ์อุปกรณ์

  • ไดรเวอร์อุปกรณ์สัมผัสควรลงทะเบียนเฉพาะแกนและรหัสคีย์สำหรับแกนและปุ่มที่รองรับ การลงทะเบียนแกนที่ไม่ได้รับการสนับสนุนหรือรหัสคีย์อาจทำให้อัลกอริทึมการจำแนกอุปกรณ์สับสนหรือทำให้ระบบตรวจจับความสามารถของอุปกรณ์ไม่ถูกต้องไม่ถูกต้อง ตัวอย่างเช่นหากอุปกรณ์รายงานรหัสคีย์ BTN_TOUCH ระบบจะถือว่า BTN_TOUCH ใช้เสมอเพื่อระบุว่าเครื่องมือนั้นสัมผัสกับหน้าจอหรือไม่ ดังนั้นจึงไม่ควรใช้ BTN_TOUCH เพื่อระบุว่าเครื่องมือนั้นอยู่ในช่วงและโฉบ
  • อุปกรณ์สัมผัสเดี่ยวใช้เหตุการณ์อินพุต 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_MOUSE BTN_TOOL_BRUSH BTN_TOOL_TRIPLETAP BTN_TOOL_PENCIL , BTN_TOOL_RUBBER , BTN_TOOL_DOUBLETAP BTN_TOOL_LENS BTN_TOOL_QUADTAP BTN_TOOL_AIRBRUSH ประเภท เครื่องมือ
  • อุปกรณ์มัลติทัชใช้เหตุการณ์อินพุต 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 : (ไม่บังคับ) รายงาน ID การติดตามของเครื่องมือ ID การติดตามเป็นจำนวนเต็มที่ไม่เป็นลบโดยพลการที่ใช้ในการระบุและติดตามเครื่องมือแต่ละตัวอย่างอิสระเมื่อมีการใช้งานเครื่องมือหลายตัว ตัวอย่างเช่นเมื่อนิ้วหลายนิ้วสัมผัสอุปกรณ์แต่ละนิ้วควรได้รับการกำหนดรหัสการติดตามที่แตกต่างกันซึ่งใช้ตราบเท่าที่นิ้วยังคงสัมผัส การติดตาม ID สามารถนำกลับมาใช้ใหม่ได้เมื่อเครื่องมือที่เกี่ยวข้องย้ายออกจากระยะ
    • ABS_MT_SLOT : (ไม่บังคับ) รายงาน Slot ID ของเครื่องมือเมื่อใช้โปรโตคอล Linux Multi-Touch 'B' อ้างถึงเอกสารโปรโตคอล Linux Multi-Touch สำหรับรายละเอียดเพิ่มเติม
    • 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_MOUSE BTN_TOOL_BRUSH BTN_TOOL_TRIPLETAP BTN_TOOL_PENCIL , BTN_TOOL_RUBBER , BTN_TOOL_DOUBLETAP BTN_TOOL_LENS BTN_TOOL_QUADTAP BTN_TOOL_AIRBRUSH ประเภท เครื่องมือ
  • หากมีการกำหนดแกนสำหรับโปรโตคอลแบบสัมผัสเดี่ยวและมัลติทัชนั้นจะใช้เฉพาะแกนมัลติทัชเท่านั้นและแกนสัมผัสเดี่ยวจะถูกละเว้น
  • ค่าต่ำสุดและสูงสุดของ 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) เมื่อนิ้วของผู้ใช้สัมผัสอยู่นอกพื้นที่ที่ใช้งานอยู่จริงๆ

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • เมื่อใช้โปรโตคอลมัลติทัช 'A' เครื่องมือจะทำงานเมื่อใดก็ตามที่ปรากฏในรายงานการซิงค์ล่าสุด เมื่อเครื่องมือหยุดปรากฏในรายงานการซิงค์มันจะสิ้นสุดลง
    • เมื่อใช้โปรโตคอลมัลติทัช 'B' เครื่องมือจะทำงานได้ตราบเท่าที่มันมีสล็อตที่ใช้งานอยู่ เมื่อสล็อตมันล้างเครื่องมือจะหยุดอยู่
  • เครื่องมือถูกกำหนดว่าจะโฉบตามเงื่อนไขต่อไปนี้:
    • หากเครื่องมือคือ BTN_TOOL_MOUSE หรือ BTN_TOOL_LENS เครื่องมือจะไม่โฉบแม้ว่าเงื่อนไขใด ๆ ต่อไปนี้จะเป็นจริง
    • หากเครื่องมือใช้งานอยู่และข้อมูลความดันของผู้ขับขี่และความดันที่รายงานเป็นศูนย์เครื่องมือจะลอยอยู่
    • หากเครื่องมือใช้งานอยู่และไดรเวอร์รองรับรหัสคีย์ BTN_TOUCH และ BTN_TOUCH มีค่าเป็นศูนย์เครื่องมือจะลอยอยู่
  • InputReader รองรับทั้งโปรโตคอลมัลติทัช 'A' และ 'B' ไดรเวอร์ใหม่ควรใช้โปรโตคอล 'B' แต่ทำงานได้อย่างใดอย่างหนึ่ง
  • ในฐานะของ Android 4.0 ไดรเวอร์หน้าจอสัมผัสอาจต้องเปลี่ยนเพื่อให้สอดคล้องกับข้อกำหนดโปรโตคอลอินพุต Linux

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

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

      รุ่นก่อนหน้าของ Android คาดว่าเหตุการณ์ "UP" จะรายงานโดยการส่งค่าความดันเป็น 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. หาก กดกลับ หรือ ส่งต่อ ถูกกดหรือเปิด 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 AXIS หรือ 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

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

นิพจน์ต่อไปนี้แสดงถึงลักษณะของระบบพิกัดเอาต์พุต The system uses linear interpolation to translate touch position information from the surface units used by the touch device into the output units that are reported to apps such as display pixels.

output.width
The output width. For touch screens (associated with a display), this is the display width in pixels. For touch pads (not associated with a display), the output width equals raw.width , indicating that no interpolation is performed.
output.height
The output height. For touch screens (associated with a display), this is the display height in pixels. For touch pads (not associated with a display), the output height equals raw.height , indicating that no interpolation is performed.
output.diag
The diagonal length of the output coordinate system, equivalent to sqrt(output.width ^2 + output.height ^2) .

Basic configuration

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

touch.deviceType

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

Specifies the touch device type.

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

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

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

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

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

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

touch.orientationAware

Definition: touch.orientationAware = 0 | 1

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

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

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

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

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

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

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

touch.gestureMode

Definition: touch.gestureMode = pointer | spots | default

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

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

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

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

X and Y fields

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

การคำนวณ

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

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

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

touchMajor, touchMinor, toolMajor, toolMinor, size fields

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

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

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

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

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

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

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

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

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

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

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

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

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

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

touch.size.scale

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

Specifies a constant scale factor used in the calibration.

The default value is 1.0 .

touch.size.bias

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

Specifies a constant bias value used in the calibration.

The default value is 0.0 .

touch.size.isSummed

Definition: touch.size.isSummed = 0 | 1

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

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

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

The default value is 0 .

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

การคำนวณ

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

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

size = avg(touchMajor, touchMinor)

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

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

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

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

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

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

output.size = size

pressure field

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

A zero pressure indicates that the tool is hovering.

touch.pressure.calibration

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

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

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

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

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

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

touch.pressure.scale

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

Specifies a constant scale factor used in the calibration.

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

การคำนวณ

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

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

orientation and tilt fields

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

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

touch.orientation.calibration

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

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

  • If the value is none , the orientation is unknown so it is set to 0.
  • If the value is interpolated , the orientation is linearly interpolated such that a raw value of raw.orientation.min maps to -PI/2 and a raw value of raw.orientation.max maps to PI/2 . The center value of (raw.orientation.min + raw.orientation.max) / 2 maps to 0 .
  • If the value is vector , the orientation is interpreted as a packed vector consisiting of two signed 4-bit fields. This representation is used on Atmel Object Based Protocol parts. When decoded, the vector yields an orientation angle and confidence magnitude. The confidence magnitude is used to scale the size information, unless it is geometric.
  • If the value is default , the system uses the interpolated calibration if the orientation axis available, otherwise uses none .

การคำนวณ

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 .

การคำนวณ

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

ตัวอย่าง

# 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

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

Virtual key map files

Touch devices can be used to implement virtual keys.

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

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

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

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

ไวยากรณ์

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 .

ตัวอย่าง

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

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

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

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

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

type SPECIAL_FUNCTION

Indirect multi-touch pointer gestures

In pointer mode, the system interprets the following gestures:

  • Single finger tap: click.
  • Single finger motion: move the pointer.
  • Single finger motion plus button presses: drag the pointer.
  • Two finger motion both fingers moving in the same direction: drag the area under the pointer in that direction. The pointer itself does not move.
  • Two finger motion both fingers moving towards each other or apart in different directions: pan/scale/rotate the area surrounding the pointer. The pointer itself does not move.
  • Multiple finger motion: freeform gesture.

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 display edge the touches are. It then determines, on a per-pointer basis, which of the pointers are palms. It also takes into account the size of each contact, as reported by touchMajor and touchMinor . The Android framework then removes the pointers that are marked as palms from the touch stream.

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

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

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

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

Enable palm rejection

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

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

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

    See the following example for reference:

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

    setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
    

อ่านเพิ่มเติม