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

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

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

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

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

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

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

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

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

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

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

อุปกรณ์อินพุตจัดว่าเป็นอุปกรณ์แตะครั้งเดียว ถ้าอุปกรณ์ทั้ง 2 ตัว ระงับเงื่อนไขต่อไปนี้:

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

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

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

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

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

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

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

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

  • หากค่าเป็น 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 = <จำนวนทศนิยมที่ไม่เป็นลบ>

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

ค่าเริ่มต้นคือ 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

อุปกรณ์ระบบสัมผัสบางรุ่น โดยเฉพาะแบบ "กึ่ง 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) ที่กึ่งกลาง 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

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

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

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

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