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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • หากค่าเป็น pointer ระบบจะแสดงท่าทางสัมผัสบนแท็บเล็ตด้วยการเคอร์เซอร์ซึ่งคล้ายกับเคอร์เซอร์ของเมาส์

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

ค่าเริ่มต้นคือ pointer เมื่อมีการตั้งค่าพร็อพเพอร์ตี้อินพุต INPUT_PROP_SEMI_MT หรือจะเป็น spots ในกรณีอื่นๆ

ฟิลด์ X และ Y

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

การคำนวณ

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

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

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

touchMajor, touchMinor, ToolMajor, ToolMinor, ฟิลด์ขนาด

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

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

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

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

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

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

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

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

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

touch.size.bias

คําจํากัดความ: touch.size.bias = <a non-negative floating point number>

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

ค่าเริ่มต้นคือ 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 = <a non-negative floating point number>

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

ค่าเริ่มต้นคือ 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 = <a non-negative floating point number>

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

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

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

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

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