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

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) เพื่อดูข้อมูลเกี่ยวกับตําแหน่งและรูปแบบของไฟล์เหล่านี้

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

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

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

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

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

  • หากตั้งค่าพร็อพเพอร์ตี้ 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: (ไม่บังคับ) รายงานรหัสช่องของเครื่องมือเมื่อใช้ โปรโตคอลมัลติทัช "B" ของ Linux โปรดดูเอกสารประกอบเกี่ยวกับโปรโตคอลมัลติทัชของ 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 เป็นเลข 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. หากมีการกดหรือปล่อยปุ่ม BACK หรือ FORWARD 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 ท่าทางสัมผัสของทัชแพดจะแสดงโดย Anchor ซึ่งแสดงจุดศูนย์กลางของท่าทางสัมผัสและชุดจุดวงกลม ที่แสดงตำแหน่งของนิ้วมือแต่ละนิ้ว

ค่าเริ่มต้นคือ 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 จะระบุมิติที่สั้นกว่าของพื้นที่ตัดขวางของเครื่องมือ

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

อุปกรณ์ระบบสัมผัสจะวัดหรือรายงานขนาดการสัมผัสและขนาดของเครื่องมือด้วยวิธีต่างๆ การใช้งานในปัจจุบันรองรับการวัดที่ต่างกัน 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 = <จำนวนทศนิยมที่ไม่เป็นลบ>

ระบุค่าการให้น้ำหนักคงที่ที่ใช้ในการปรับเทียบ

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

touch.size.isSummed

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

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

  • หากค่าเป็น 1 ขนาดที่รายงานจะหารด้วยตัวเลข ก่อนใช้งาน

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

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

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

ท่าทางสัมผัสของตัวชี้แบบมัลติทัชโดยอ้อม

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

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

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

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

โมเดลจริงจะพิจารณาข้อมูลท่าทางสัมผัส 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
    

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