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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • หากตั้งค่าพร็อพเพอร์ตี้ touch.deviceType ระบบจะตั้งค่าประเภทอุปกรณ์ตามที่ระบุไว้
  • หากอุปกรณ์อินพุตรายงานว่ามีพร็อพเพอร์ตี้อินพุต INPUT_PROP_DIRECT (ผ่าน EVIOCGPROP ioctl) ระบบจะตั้งค่าประเภทอุปกรณ์เป็นหน้าจอสัมผัส เงื่อนไขนี้จะถือว่าอุปกรณ์ระบบสัมผัสแบบอินพุตโดยตรงเชื่อมต่อกับจอแสดงผลที่เชื่อมต่ออยู่ด้วย
  • หากอุปกรณ์อินพุตรายงานว่ามีพร็อพเพอร์ตี้อินพุต INPUT_PROP_POINTER (ผ่าน EVIOCGPROP ioctl) ระบบจะตั้งค่าประเภทอุปกรณ์เป็น pointer
  • หากอุปกรณ์อินพุตรายงานว่ามีแกนสัมพัทธ์ REL_X หรือ REL_Y ระบบจะตั้งค่าประเภทอุปกรณ์เป็นทัชแพด เงื่อนไขนี้จะช่วยแก้ปัญหาความกำกวมสำหรับอุปกรณ์อินพุตที่ประกอบด้วยทั้งเมาส์และทัชแพด ในกรณีนี้ ระบบจะไม่ใช้ทัชแพดเพื่อควบคุมตัวชี้เนื่องจากเมาส์ควบคุมตัวชี้อยู่แล้ว
  • ไม่เช่นนั้น ประเภทอุปกรณ์จะตั้งค่าเป็น pointer ค่าเริ่มต้นนี้ช่วยให้มั่นใจว่าทัชแพดที่ไม่ได้กำหนดวัตถุประสงค์พิเศษอื่นๆ จะควบคุมเคอร์เซอร์

ปุ่ม

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

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

  • 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 ในกรณีอื่นๆ เพื่อระบุว่าเครื่องมือกำลังลอยอยู่เหนืออุปกรณ์

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

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

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

  • ค่าที่รายงานโดย ABS_TILT_X และ ABS_TILT_Y ควรเป็น 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 แสดงว่าเครื่องมือไม่ได้วางเมาส์เหนือองค์ประกอบ แม้ว่าเงื่อนไขข้อใดข้อหนึ่งต่อไปนี้จะเป็นจริงก็ตาม
    • หากเครื่องมือทำงานอยู่และไดรเวอร์รายงานข้อมูลแรงกด และแรงกดที่รายงานเป็นศูนย์ แสดงว่าเครื่องมือกำลังลอยอยู่
    • หากเครื่องมือทำงานอยู่และไดรเวอร์รองรับรหัสคีย์ 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 เท่านั้น

  • หากค่าเป็น 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, size

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

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

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

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

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

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

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

<touch.size.calibration< h4=""></touch.size.calibration<>

คำจำกัดความ: 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 (แรงกดปกติ)

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

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 เมื่อถอดรหัสแล้ว เวกเตอร์จะแสดงมุมการวางแนวและขนาดความเชื่อมั่น ขนาดความเชื่อมั่นจะใช้เพื่อปรับขนาดข้อมูลขนาด เว้นแต่จะเป็นเรขาคณิต
  • หากค่าเป็น 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 key code>: รหัสคีย์ 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, ความกว้างเป็น 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 เมื่อตรวจพบฝ่ามือ นอกจากนี้ เฟรมเวิร์กในตัวยังทำงานร่วมกับโซลูชันที่กำหนดเองได้ด้วย

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

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