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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • หากตั้งค่าพร็อพเพอร์ตี้ 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

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

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

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

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

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

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

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

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

    ระบบจะถือว่ามุมเอียงตามแกน 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 แสดงว่าเครื่องมือ ไม่ได้วางเมาส์อยู่ แม้ว่าเงื่อนไขต่อไปนี้จะเป็นจริงก็ตาม
    • หากเครื่องมือทำงานอยู่และคนขับรายงานข้อมูลแรงดัน และแรงดันที่รายงานเป็น 0 แสดงว่าเครื่องมือลอยอยู่
    • หากเครื่องมือทำงานอยู่และไดรเวอร์รองรับรหัสคีย์ BTN_TOUCH และ BTN_TOUCH มีค่าเป็น 0 แสดงว่าเครื่องมือลอยอยู่
  • InputReader รองรับทั้งโปรโตคอลมัลติทัช "A" และ "B" ผู้ขับขี่ใหม่ ควรใช้โปรโตคอล "B" แต่จะใช้โปรโตคอลใดก็ได้
  • ตั้งแต่ Android 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. หากมีการกดหรือปล่อยปุ่มย้อนกลับหรือไปข้างหน้า InputReader จะแจ้งInputDispatcherเกี่ยวกับเหตุการณ์สำคัญ
  4. InputReader จะกำหนดว่ามีการกดแป้นเสมือนหรือไม่ หากเป็นเช่นนั้น ระบบจะแจ้งให้ InputDispatcher ทราบเกี่ยวกับเหตุการณ์สำคัญ
  5. InputReader จะกำหนดว่าการแตะเริ่มต้นภายใน ขอบเขตของจอแสดงผลหรือไม่ หากเป็นเช่นนั้น ระบบจะแจ้งให้ InputDispatcher ทราบเกี่ยวกับ การโต้ตอบแบบสัมผัส
  6. หากไม่มีเครื่องมือสัมผัส แต่มีเครื่องมือโฮเวอร์อย่างน้อย 1 รายการ 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, size

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

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

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

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

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

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

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

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

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

  • หากค่าเป็น none ระบบจะตั้งค่าขนาดเป็น 0

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

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

touch.pressure.calibration

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

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

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

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

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

  • หากค่าเป็น default ระบบจะใช้การปรับเทียบ physical หากมีแกนแรงดัน ไม่เช่นนั้นจะใช้ none

touch.pressure.scale

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

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

ค่าเริ่มต้นคือ 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 บิต 2 ฟิลด์ การแสดงนี้ใช้ในชิ้นส่วนของ Atmel Object Based Protocol เมื่อถอดรหัส เวกเตอร์จะให้มุมการวางแนวและความเชื่อมั่น magnitude ระบบจะใช้ขนาดความเชื่อมั่นเพื่อปรับขนาดข้อมูลขนาด เว้นแต่จะเป็นขนาดทางเรขาคณิต
  • หากค่าเป็น 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 = <ตัวเลขทศนิยมที่ไม่เป็นลบ>

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

ค่าเริ่มต้นคือ 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 Ice Cream Sandwich 4.0 ต้องอัปเดตไฟล์การกำหนดค่าอุปกรณ์อินพุตทั้งหมดสำหรับอุปกรณ์ระบบสัมผัส เพื่อใช้พร็อพเพอร์ตี้การกำหนดค่าใหม่

นอกจากนี้ คุณอาจต้องอัปเดตไดรเวอร์ของอุปกรณ์ระบบสัมผัสรุ่นเก่าด้วย

ไฟล์คีย์แมปเสมือน

คุณใช้อุปกรณ์ระบบสัมผัสเพื่อใช้ปุ่มเสมือนได้

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

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

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

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

ไวยากรณ์

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

บรรทัดความคิดเห็นจะขึ้นต้นด้วย "#" และสิ้นสุดที่ท้ายบรรทัด

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

  • 0x01: รหัสเวอร์ชัน ต้องเป็น 0x01 เสมอ
  • <รหัสคีย์ Linux>: รหัสคีย์ Linux ของคีย์เสมือน
  • <centerX>: พิกัด X ของพิกเซลตรงกลางของปุ่มเสมือน
  • <centerY>: พิกัด Y ของพิกเซลตรงกลางของคีย์เสมือน
  • <width>: ความกว้างของปุ่มเสมือนในหน่วยพิกเซล
  • <height>: ความสูงของปุ่มเสมือนในหน่วยพิกเซล

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

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

# 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, centerY เป็น 835, width เป็น 90 และ height เป็น 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

ท่าทางสัมผัสของเคอร์เซอร์แบบมัลติทัชโดยอ้อม

ในโหมดเคอร์เซอร์ ระบบจะตีความท่าทางสัมผัสต่อไปนี้

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

การปฏิเสธฝ่ามือ

ตั้งแต่ Android 13 เป็นต้นไป ระบบจะปฏิเสธอินพุตจากฝ่ามือโดยอัตโนมัติ เมื่อเปิดใช้เฟรมเวิร์กในตัว ระบบยังคงรองรับโซลูชันที่สร้างขึ้นเองภายในองค์กร แม้ว่าอาจต้องมีการแก้ไขเพื่อส่งคืนแฟล็ก 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. หากต้องการเปิดใช้ฟีเจอร์นี้ในระหว่างรันไทม์ ให้เรียกใช้คำสั่งต่อไปนี้
        $ 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 แสดงว่ามีตัวป้องกันการสัมผัสด้วยฝ่ามืออยู่ภายใน 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
    

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