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

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

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

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

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

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

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

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

การจำแนกประเภทอุปกรณ์สัมผัส

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

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

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

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

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

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

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

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

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

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

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

ปุ่ม

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

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

  • BTN_LEFT : แมปกับ MotionEvent.BUTTON_PRIMARY
  • BTN_RIGHT : แมปกับ MotionEvent.BUTTON_SECONDARY
  • BTN_MIDDLE : แมปกับ MotionEvent.BUTTON_MIDDLE
  • BTN_BACK และ BTN_SIDE : แมปกับ MotionEvent.BUTTON_BACK การกดปุ่มนี้จะสังเคราะห์การกดปุ่มด้วยรหัสคีย์ KeyEvent.KEYCODE_BACK
  • BTN_FORWARD และ BTN_EXTRA : แมปกับ MotionEvent.BUTTON_FORWARD การกดปุ่มนี้จะสังเคราะห์การกดปุ่มด้วยรหัสคีย์ KeyEvent.KEYCODE_FORWARD
  • BTN_STYLUS : แมปกับ MotionEvent.BUTTON_SECONDARY
  • BTN_STYLUS2 : แมปกับ MotionEvent.BUTTON_TERTIARY

เครื่องมือและประเภทของเครื่องมือ

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

ที่อื่นๆ ใน Android เช่นเดียวกับใน MotionEvent API เครื่องมือมักเรียกว่า ตัวชี้

รองรับประเภทเครื่องมือต่อไปนี้:

  • BTN_TOOL_FINGER และ MT_TOOL_FINGER : แมปกับ MotionEvent.TOOL_TYPE_FINGER
  • BTN_TOOL_PEN และ MT_TOOL_PEN : แมปกับ MotionEvent.TOOL_TYPE_STYLUS
  • BTN_TOOL_RUBBER : แมปกับ MotionEvent.TOOL_TYPE_ERASER
  • BTN_TOOL_BRUSH : แมปกับ MotionEvent.TOOL_TYPE_STYLUS
  • BTN_TOOL_PENCIL : แมปกับ MotionEvent.TOOL_TYPE_STYLUS
  • BTN_TOOL_AIRBRUSH : แมปกับ MotionEvent.TOOL_TYPE_STYLUS
  • BTN_TOOL_MOUSE : แมปกับ MotionEvent.TOOL_TYPE_MOUSE
  • BTN_TOOL_LENS : แมปกับ MotionEvent.TOOL_TYPE_MOUSE
  • BTN_TOOL_DOUBLETAP , BTN_TOOL_TRIPLETAP และ BTN_TOOL_QUADTAP : แมปกับ MotionEvent.TOOL_TYPE_FINGER

เครื่องมือโฉบกับการสัมผัส

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

ส่วนประกอบ InputReader จะแยกความแตกต่างระหว่างเครื่องมือสัมผัสจากเครื่องมือที่วางเมาส์เหนือ ในทำนองเดียวกัน เครื่องมือการสัมผัสและเครื่องมือโฮเวอร์จะถูกรายงานไปยังแอปในรูปแบบที่แตกต่างกัน

เครื่องมือการสัมผัสจะถูกรายงานไปยังแอปต่างๆ ในรูปแบบเหตุการณ์การสัมผัสโดยใช้ MotionEvent.ACTION_DOWN , MotionEvent.ACTION_MOVE , MotionEvent.ACTION_DOWN , MotionEvent.ACTION_POINTER_DOWN และ MotionEvent.ACTION_POINTER_UP

เครื่องมือการวางเมาส์เหนือจะถูกรายงานไปยังแอปเป็นเหตุการณ์การเคลื่อนไหวทั่วไปโดยใช้ MotionEvent.ACTION_HOVER_ENTER , MotionEvent.ACTION_HOVER_MOVE และ MotionEvent.ACTION_HOVER_EXIT

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

  • ไดรเวอร์อุปกรณ์ระบบสัมผัสควรลงทะเบียนเฉพาะแกนและรหัสกุญแจสำหรับแกนและปุ่มที่รองรับ การลงทะเบียนแกนหรือรหัสคีย์ที่ไม่รองรับอาจทำให้อัลกอริธึมการจัดประเภทอุปกรณ์สับสน หรือทำให้ระบบตรวจจับความสามารถของอุปกรณ์ไม่ถูกต้อง ตัวอย่างเช่น หากอุปกรณ์รายงานรหัสคีย์ BTN_TOUCH ระบบจะถือว่า BTN_TOUCH ถูกใช้เสมอเพื่อระบุว่าเครื่องมือกำลังสัมผัสหน้าจอหรือไม่ ดังนั้นจึงไม่ควรใช้ BTN_TOUCH เพื่อระบุว่าเครื่องมือนั้นอยู่ในช่วงและลอยอยู่เท่านั้น
  • อุปกรณ์แบบสัมผัสเดียวใช้เหตุการณ์อินพุต Linux ต่อไปนี้:
    • ABS_X : (จำเป็น) รายงานพิกัด X ของเครื่องมือ
    • ABS_Y : (REQUIRED) รายงานพิกัด 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 : (REQUIRED) รายงานพิกัด X ของเครื่องมือ
    • ABS_MT_POSITION_Y : (REQUIRED) รายงานพิกัด 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 : (เป็นทางเลือก) รายงาน ID สล็อตของเครื่องมือ เมื่อใช้โปรโตคอลมัลติทัช Linux 'B' โปรดดูเอกสารประกอบโปรโตคอล Linux multi-touch สำหรับรายละเอียดเพิ่มเติม
    • 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 หากมีการรายงานเลย จะต้องไม่เป็นศูนย์เมื่อเครื่องมือสัมผัสกับอุปกรณ์ และเป็นศูนย์ มิฉะนั้น เพื่อระบุว่าเครื่องมือกำลังลอยอยู่

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

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

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

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

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

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

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

    อาจจำเป็นต้องมีการเปลี่ยนแปลงต่อไปนี้:

    • เมื่อเครื่องมือไม่ทำงาน (นิ้ว "ขึ้น") ควรหยุดปรากฏในรายงานการซิงค์มัลติทัชที่ตามมา เมื่อเครื่องมือทั้งหมดไม่ทำงาน (นิ้วทั้งหมด "ขึ้น") ไดรเวอร์ควรส่งแพ็คเก็ตรายงานการซิงค์ที่ว่างเปล่า เช่น SYN_MT_REPORT ตามด้วย SYN_REPORT

      Android เวอร์ชันก่อนหน้าคาดว่าจะรายงานเหตุการณ์ "up" โดยการส่งค่าความดันเป็น 0 ลักษณะการทำงานแบบเก่าเข้ากันไม่ได้กับข้อกำหนดโปรโตคอลอินพุตของ Linux และไม่ได้รับการสนับสนุนอีกต่อไป

    • ควรรายงานข้อมูลความดันทางกายภาพหรือความแรงของสัญญาณโดยใช้ ABS_MT_PRESSURE

      Android เวอร์ชันก่อนหน้าดึงข้อมูลแรงกดดันจาก ABS_MT_TOUCH_MAJOR ลักษณะการทำงานแบบเก่าเข้ากันไม่ได้กับข้อกำหนดเฉพาะโปรโตคอลอินพุตของ Linux และไม่ได้รับการสนับสนุนอีกต่อไป

    • ควรรายงานข้อมูลขนาดการสัมผัสโดยใช้ ABS_MT_TOUCH_MAJOR

      Android เวอร์ชันก่อนหน้าดึงข้อมูลขนาดมาจาก ABS_MT_TOOL_MAJOR ลักษณะการทำงานแบบเก่าเข้ากันไม่ได้กับข้อกำหนดเฉพาะโปรโตคอลอินพุตของ Linux และไม่ได้รับการสนับสนุนอีกต่อไป

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

การทำงานของอุปกรณ์สัมผัส

ต่อไปนี้เป็นข้อมูลสรุปโดยย่อเกี่ยวกับการทำงานของอุปกรณ์ระบบสัมผัสบน Android

  1. EventHub อ่านเหตุการณ์ดิบจากไดรเวอร์ evdev
  2. InputReader ใช้เหตุการณ์ดิบและอัปเดตสถานะภายในเกี่ยวกับตำแหน่งและคุณลักษณะอื่นๆ ของแต่ละเครื่องมือ นอกจากนี้ยังติดตามสถานะของปุ่ม
  3. ถ้ากดหรือปล่อย BACK หรือ FORWARD InputReader จะแจ้ง InputDispatcher เกี่ยวกับเหตุการณ์สำคัญ
  4. InputReader กำหนดว่ามีการกดปุ่มเสมือนเกิดขึ้นหรือไม่ หากเป็นเช่นนั้น ระบบจะแจ้ง InputDispatcher เกี่ยวกับเหตุการณ์สำคัญ
  5. InputReader กำหนดว่าการสัมผัสเริ่มต้นภายในขอบเขตของจอแสดงผลหรือไม่ หากเป็นเช่นนั้น ระบบจะแจ้ง InputDispatcher เกี่ยวกับเหตุการณ์การสัมผัส
  6. หากไม่มีเครื่องมือสัมผัส แต่มีเครื่องมือโฮเวอร์อย่างน้อยหนึ่ง 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 ระบุมิติที่สั้นกว่าของพื้นที่หน้าตัดของเครื่องมือ

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

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

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

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

  • หากค่าเป็น none ขนาดจะถูกตั้งค่าเป็นศูนย์

  • หากค่าเป็น geometric จะถือว่าขนาดระบุในหน่วยพื้นผิวเดียวกันกับตำแหน่ง ดังนั้นจึงปรับขนาดในลักษณะเดียวกัน

  • หากค่าคือ diameter ขนาดจะถือว่าเป็นสัดส่วนกับเส้นผ่านศูนย์กลาง (ความกว้าง) ของการสัมผัสหรือเครื่องมือ

  • หากค่าคือ area ขนาดจะถือว่าเป็นสัดส่วนกับพื้นที่ของการสัมผัสหรือเครื่องมือ

  • หากค่าเป็นค่า default ระบบจะใช้การสอบเทียบ geometric หากแกน raw.touchMajor หรือ raw.toolMajor พร้อมใช้งาน มิฉะนั้นจะใช้การสอบเทียบ none

สัมผัสขนาดสเกล

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

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

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

touch.size.อคติ

คำจำกัดความ: 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 = none | physical | amplitude | default

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

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

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

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

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

สัมผัส ความดัน สเกล

คำจำกัดความ: touch.pressure.scale = <a หมายเลขจุดลอยตัวที่ไม่ใช่เชิงลบ>

ระบุปัจจัยสเกลคงที่ที่ใช้ในการสอบเทียบ

ค่าเริ่มต้นคือ 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 บิตที่ลงนาม การเป็นตัวแทนนี้ใช้กับชิ้นส่วนโปรโตคอลที่ใช้วัตถุ 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 หมายเลขจุดลอยตัวที่ไม่ใช่เชิงลบ>

ระบุปัจจัยสเกลคงที่ที่ใช้ในการสอบเทียบ

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

ไดรเวอร์ อุปกรณ์สัมผัสที่เก่ากว่าอาจต้องได้รับการปรับปรุง

ไฟล์แผนที่คีย์เสมือนจริง

อุปกรณ์สัมผัสมักใช้เพื่อใช้คีย์เสมือนจริง

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

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

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

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

ไวยากรณ์

ไฟล์แผนที่คีย์เสมือนเป็นไฟล์ข้อความธรรมดาที่ประกอบด้วยลำดับของคำอธิบายเค้าโครงคีย์เสมือนจริงทั้งคั่นด้วย newLines หรือโดย colons

บรรทัดความคิดเห็นเริ่มต้นด้วย '#' และดำเนินการต่อไปยังจุดสิ้นสุดของบรรทัด

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

  • 0x01 : รหัสเวอร์ชัน ต้องเป็น 0x01 เสมอ
  • <รหัสคีย์ Linux>: รหัสคีย์ Linux ของคีย์เสมือน
  • <Centerx>: พิกเซล X พิกัดของศูนย์กลางของคีย์เสมือนจริง
  • <Centery>: พิกเซล y พิกัดของศูนย์กลางของคีย์เสมือนจริง
  • <Vidth>: ความกว้างของคีย์เสมือนจริงในพิกเซล
  • <ความสูง>: ความสูงของคีย์เสมือนจริงในพิกเซล

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

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

# 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 , ศูนย์กลางของ 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

ท่าทางตัวชี้แบบมัลติทัชทางอ้อม

ในโหมดตัวชี้ระบบจะตีความท่าทางต่อไปนี้:

  • แตะนิ้วเดียว: คลิก
  • การเคลื่อนไหวนิ้วเดี่ยว: เลื่อนตัวชี้
  • ปุ่ม Motion Plus Single Plus กด: ลากตัวชี้
  • การเคลื่อนไหวสองนิ้วทั้งสองนิ้วเคลื่อนที่ไปในทิศทางเดียวกัน: ลากพื้นที่ใต้ตัวชี้ไปในทิศทางนั้น ตัวชี้นั้นไม่เคลื่อนไหว
  • การเคลื่อนไหวสองนิ้วทั้งสองนิ้วเคลื่อนที่เข้าหากันหรือแยกออกจากกันในทิศทางที่แตกต่างกัน: แพน/สเกล/หมุนบริเวณรอบตัวชี้ ตัวชี้นั้นไม่เคลื่อนไหว
  • การเคลื่อนไหวหลายนิ้ว: ท่าทางฟรีฟอร์ม

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

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

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