Android รองรับหน้าจอสัมผัสและทัชแพดหลากหลายประเภท รวมถึง แท็บเล็ตดิจิทัลไลเซอร์ที่ใช้สไตลัส
หน้าจอสัมผัสคืออุปกรณ์สัมผัสที่เชื่อมโยงกับจอแสดงผลเพื่อให้ ผู้ใช้รู้สึกว่าได้จัดการรายการบนหน้าจอโดยตรง
ทัชแพดคืออุปกรณ์สัมผัสที่ไม่ได้เชื่อมโยงกับจอแสดงผล เช่น แท็บเล็ตดิจิทัล โดยปกติแล้ว ทัชแพดจะใช้สำหรับการชี้หรือ การวางตำแหน่งแบบอ้อมที่แน่นอน หรือการควบคุมอินเทอร์เฟซผู้ใช้ด้วยท่าทางสัมผัส
อุปกรณ์ระบบสัมผัสอาจมีปุ่มที่มีฟังก์ชันคล้ายกับปุ่มเมาส์
บางครั้งอุปกรณ์ระบบสัมผัสอาจถูกดัดแปลงโดยใช้เครื่องมือต่างๆ เช่น นิ้วหรือสไตลัส ทั้งนี้ขึ้นอยู่กับเทคโนโลยีเซ็นเซอร์สัมผัสพื้นฐาน
บางครั้งจะใช้อุปกรณ์ระบบสัมผัสเพื่อใช้ปุ่มเสมือน เช่น ในอุปกรณ์ Android บางรุ่น พื้นที่เซ็นเซอร์หน้าจอสัมผัสจะขยายออกไปนอกขอบของจอแสดงผลและมีจุดประสงค์ 2 อย่างในฐานะที่เป็นส่วนหนึ่งของแป้นพิมพ์ที่ไวต่อการสัมผัส
เนื่องจากอุปกรณ์ระบบสัมผัสมีความหลากหลายมาก Android จึงต้องอาศัยพร็อพเพอร์ตี้การกำหนดค่าจำนวนมากเพื่ออธิบายลักษณะและลักษณะการทำงานที่ต้องการของอุปกรณ์แต่ละเครื่อง
การแยกประเภทอุปกรณ์ระบบสัมผัส
ระบบจะจัดประเภทอุปกรณ์อินพุตเป็นอุปกรณ์มัลติทัชหากเป็นไปตามเงื่อนไขทั้ง 2 ข้อต่อไปนี้
- อุปกรณ์อินพุตรายงานการมีอยู่ของแกนสัมบูรณ์
ABS_MT_POSITION_X
และABS_MT_POSITION_Y
- อุปกรณ์อินพุตไม่มีปุ่มเกมแพด เงื่อนไขนี้ ช่วยแก้ความคลุมเครือเกี่ยวกับเกมแพดบางรุ่นที่รายงานแกนด้วยโค้ด ที่ทับซ้อนกับโค้ดของแกน MT
ระบบจะจัดประเภทอุปกรณ์อินพุตเป็นอุปกรณ์แบบสัมผัสเดียวหากเป็นไปตามเงื่อนไขทั้ง 2 ข้อต่อไปนี้
- อุปกรณ์อินพุตไม่ได้จัดเป็นอุปกรณ์มัลติทัช อุปกรณ์อินพุต จะได้รับการจัดประเภทเป็นอุปกรณ์แบบสัมผัสเดียวหรืออุปกรณ์แบบมัลติทัช ไม่เคยเป็นทั้ง 2 อย่าง
- อุปกรณ์ป้อนข้อมูลจะรายงานการมีอยู่ของแกนสัมบูรณ์
ABS_X
และABS_Y
รวมถึงการมีอยู่ของรหัสคีย์BTN_TOUCH
เมื่อจัดประเภทอุปกรณ์ป้อนข้อมูลเป็นอุปกรณ์สัมผัส ระบบจะพิจารณาการมีอยู่ ของปุ่มเสมือนโดยพยายามโหลดไฟล์แผนที่ปุ่มเสมือน สำหรับอุปกรณ์ หากมีแผนที่คีย์เสมือน ระบบจะโหลดไฟล์เลย์เอาต์คีย์ สำหรับอุปกรณ์ด้วย ดูข้อมูลเกี่ยวกับตำแหน่งและรูปแบบของไฟล์เหล่านี้ได้ที่ [Virtual key map files](#virtual-key-map-files)
จากนั้นระบบจะโหลดไฟล์การกำหนดค่าอุปกรณ์อินพุตสำหรับอุปกรณ์ระบบสัมผัส
อุปกรณ์สัมผัสในตัวทั้งหมดควรมีไฟล์กำหนดค่าอุปกรณ์อินพุต หากไม่มีไฟล์กำหนดค่าอุปกรณ์อินพุต ระบบ จะเลือกการกำหนดค่าเริ่มต้นที่เหมาะสมสำหรับอุปกรณ์ต่อพ่วงแบบสัมผัส อเนกประสงค์ เช่น หน้าจอสัมผัส HID แบบ USB หรือ Bluetooth ภายนอก หรือทัชแพด ค่าเริ่มต้นเหล่านี้ไม่ได้ออกแบบมาสำหรับหน้าจอสัมผัสในตัวและอาจทำให้เกิดลักษณะการทำงานที่ไม่ถูกต้อง
หลังจากโหลดการกำหนดค่าอุปกรณ์อินพุตแล้ว ระบบจะจัดประเภทอุปกรณ์อินพุตเป็นอุปกรณ์หน้าจอสัมผัส ทัชแพด หรือพอยน์เตอร์
- อุปกรณ์หน้าจอสัมผัสใช้สำหรับการจัดการออบเจ็กต์บนหน้าจอโดยตรง ผู้ใช้แตะหน้าจอโดยตรง ดังนั้นระบบจึงไม่ ต้องมีองค์ประกอบเพิ่มเติมเพื่อระบุออบเจ็กต์ที่ กำลังดำเนินการ
- อุปกรณ์ทัชแพดใช้เพื่อระบุข้อมูลการวางตำแหน่งที่แน่นอน ให้กับแอปเกี่ยวกับการแตะในพื้นที่เซ็นเซอร์ที่กำหนด ซึ่งอาจเป็นประโยชน์ สำหรับแท็บเล็ตดิจิทัล
- อุปกรณ์พอยน์เตอร์ใช้สำหรับการจัดการออบเจ็กต์บนหน้าจอโดยอ้อม โดยใช้เคอร์เซอร์ ระบบจะตีความนิ้วเป็นท่าทางสัมผัสแบบมัลติทัช เครื่องมืออื่นๆ เช่น สไตลัส จะได้รับการตีความโดยใช้ ตำแหน่งสัมบูรณ์ ดูข้อมูลเพิ่มเติมได้ที่ ท่าทางสัมผัสแบบมัลติทัชโดยอ้อม
ระบบจะใช้กฎต่อไปนี้เพื่อจัดประเภทอุปกรณ์อินพุตเป็นหน้าจอสัมผัส ทัชแพด หรืออุปกรณ์ชี้
- หากตั้งค่าพร็อพเพอร์ตี้
touch.deviceType
ระบบจะตั้งค่าประเภทอุปกรณ์ตามที่ระบุ - หากอุปกรณ์อินพุตรายงานว่ามีพร็อพเพอร์ตี้อินพุต
INPUT_PROP_DIRECT
(ผ่านEVIOCGPROP
ioctl) ระบบจะตั้งค่าประเภทอุปกรณ์เป็นหน้าจอสัมผัส เงื่อนไขนี้ถือว่าอุปกรณ์สัมผัสอินพุตโดยตรง เชื่อมต่อกับจอแสดงผลที่เชื่อมต่ออยู่ด้วย - หากอุปกรณ์อินพุตรายงานว่ามีพร็อพเพอร์ตี้อินพุต
INPUT_PROP_POINTER
(ผ่านEVIOCGPROP
ioctl) ระบบจะตั้งค่าประเภทอุปกรณ์ เป็น pointer - หากอุปกรณ์อินพุตรายงานว่ามีแกนสัมพัทธ์
REL_X
หรือREL_Y
ระบบจะตั้งค่าประเภทอุปกรณ์เป็นทัชแพด เงื่อนไขนี้ แก้ปัญหาความคลุมเครือสำหรับอุปกรณ์ป้อนข้อมูลที่ประกอบด้วยทั้งเมาส์และ ทัชแพด ในกรณีนี้ จะไม่มีการใช้ทัชแพดเพื่อควบคุม เคอร์เซอร์เนื่องจากเมาส์ควบคุมอยู่แล้ว - มิเช่นนั้น ระบบจะตั้งค่าประเภทอุปกรณ์เป็นพอยน์เตอร์ ค่าเริ่มต้นนี้ช่วยให้มั่นใจได้ว่า ทัชแพดที่ไม่ได้กำหนดวัตถุประสงค์พิเศษอื่นๆ จะควบคุมเคอร์เซอร์
ปุ่ม
ปุ่มเป็นตัวควบคุมที่ไม่บังคับซึ่งแอปสามารถใช้เพื่อดำเนินการ ฟังก์ชันเพิ่มเติมได้ ปุ่มบนอุปกรณ์ระบบสัมผัสจะทำงานคล้ายกับปุ่มเมาส์ และส่วนใหญ่จะใช้กับอุปกรณ์ระบบสัมผัสประเภทเคอร์เซอร์หรือสไตลัส
ปุ่มที่รองรับมีดังนี้
BTN_LEFT
: แมปกับMotionEvent.BUTTON_PRIMARY
BTN_RIGHT
: แมปกับMotionEvent.BUTTON_SECONDARY
BTN_MIDDLE
: แมปกับMotionEvent.BUTTON_MIDDLE
BTN_BACK
และBTN_SIDE
: แมปกับMotionEvent.BUTTON_BACK
การกดปุ่มนี้ยังสังเคราะห์การกดแป้นด้วยรหัสแป้นKeyEvent.KEYCODE_BACK
ด้วยBTN_FORWARD
และBTN_EXTRA
: แมปกับMotionEvent.BUTTON_FORWARD
การกดปุ่มนี้ยังสังเคราะห์การกดแป้น ด้วยรหัสแป้นKeyEvent.KEYCODE_FORWARD
ด้วยBTN_STYLUS
: แมปกับMotionEvent.BUTTON_SECONDARY
BTN_STYLUS2
: แมปกับMotionEvent.BUTTON_TERTIARY
เครื่องมือและประเภทเครื่องมือ
เครื่องมือคือ นิ้ว สไตลัส หรืออุปกรณ์อื่นๆ ที่ใช้โต้ตอบกับ อุปกรณ์ระบบสัมผัส อุปกรณ์ระบบสัมผัสบางรุ่นสามารถแยกความแตกต่างระหว่างเครื่องมือประเภทต่างๆ ได้
ในส่วนอื่นๆ ของ Android เช่น ใน MotionEvent
API มักเรียกเครื่องมือว่าพอยน์เตอร์
ระบบรองรับเครื่องมือประเภทต่อไปนี้
BTN_TOOL_FINGER
และMT_TOOL_FINGER
: แมปกับMotionEvent.TOOL_TYPE_FINGER
BTN_TOOL_PEN
และMT_TOOL_PEN
: แมปกับMotionEvent.TOOL_TYPE_STYLUS
BTN_TOOL_RUBBER
: แมปกับMotionEvent.TOOL_TYPE_ERASER
BTN_TOOL_BRUSH
: แมปกับMotionEvent.TOOL_TYPE_STYLUS
BTN_TOOL_PENCIL
: แมปกับMotionEvent.TOOL_TYPE_STYLUS
BTN_TOOL_AIRBRUSH
: แมปกับMotionEvent.TOOL_TYPE_STYLUS
BTN_TOOL_MOUSE
: แมปกับMotionEvent.TOOL_TYPE_MOUSE
BTN_TOOL_LENS
: แมปกับMotionEvent.TOOL_TYPE_MOUSE
BTN_TOOL_DOUBLETAP
,BTN_TOOL_TRIPLETAP
และBTN_TOOL_QUADTAP
: แมปกับMotionEvent.TOOL_TYPE_FINGER
การโฮเวอร์เทียบกับการแตะเครื่องมือ
เครื่องมืออาจสัมผัสกับอุปกรณ์ระบบสัมผัสหรืออยู่ในระยะและโฉบ เหนืออุปกรณ์ อุปกรณ์ระบบสัมผัสบางรุ่นไม่สามารถตรวจจับการมีอยู่ของเครื่องมือที่ วางเหนืออุปกรณ์ระบบสัมผัสได้ อุปกรณ์ที่ทำได้ เช่น อุปกรณ์แปลงสัญญาณสไตลัสที่ใช้ RF มักจะตรวจจับได้เมื่อเครื่องมืออยู่ในช่วงที่จำกัดของอุปกรณ์แปลงสัญญาณ
InputReader
คอมโพเนนต์จะแยกเครื่องมือสัมผัสออกจากเครื่องมือที่วางเมาส์
ในทำนองเดียวกัน การแตะเครื่องมือและการวางเมาส์เหนือเครื่องมือจะรายงานไปยังแอป
ในลักษณะที่แตกต่างกัน
ระบบจะรายงานเครื่องมือสัมผัสไปยังแอปเป็นเหตุการณ์การสัมผัส
โดยใช้ MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
,
MotionEvent.ACTION_DOWN
,
MotionEvent.ACTION_POINTER_DOWN
และ MotionEvent.ACTION_POINTER_UP
ระบบจะรายงานเครื่องมือที่โฮเวอร์ไปยังแอปเป็นเหตุการณ์การเคลื่อนไหวทั่วไปโดยใช้
MotionEvent.ACTION_HOVER_ENTER
, MotionEvent.ACTION_HOVER_MOVE
และ MotionEvent.ACTION_HOVER_EXIT
ข้อกำหนดของไดรเวอร์อุปกรณ์ระบบสัมผัส
- ไดรเวอร์อุปกรณ์ระบบสัมผัสควรลงทะเบียนเฉพาะแกนและรหัสคีย์สำหรับแกน
และปุ่มที่รองรับ การลงทะเบียนแกนหรือรหัสคีย์ที่ไม่รองรับ
อาจทำให้เกิดความสับสนในอัลกอริทึมการจัดประเภทอุปกรณ์หรือทำให้ระบบตรวจพบความสามารถของอุปกรณ์
อย่างไม่ถูกต้อง เช่น หากอุปกรณ์รายงานรหัสคีย์
BTN_TOUCH
ระบบจะ ถือว่าใช้BTN_TOUCH
เสมอเพื่อระบุว่าเครื่องมือ สัมผัสหน้าจอหรือไม่ ดังนั้นจึงBTN_TOUCH
ไม่ควรใช้เพื่อระบุ ว่าเครื่องมืออยู่ในช่วงและวางเมาส์ - อุปกรณ์แบบสัมผัสเดียวจะใช้เหตุการณ์อินพุตของ Linux ต่อไปนี้
ABS_X
: (ต้องระบุ) รายงานพิกัด X ของเครื่องมือABS_Y
: (ต้องระบุ) รายงานพิกัด Y ของเครื่องมือABS_PRESSURE
: (ไม่บังคับ) รายงานแรงกดทางกายภาพที่ใช้กับปลาย ของเครื่องมือหรือความแรงของสัญญาณของการสัมผัสABS_TOOL_WIDTH
: (ไม่บังคับ) รายงานพื้นที่หน้าตัดหรือความกว้างของ การสัมผัสหรือของเครื่องมือเองABS_DISTANCE
: (ไม่บังคับ) รายงานระยะห่างของเครื่องมือจากพื้นผิว ของอุปกรณ์ระบบสัมผัสABS_TILT_X
: (ไม่บังคับ) รายงานการเอียงของเครื่องมือจากพื้นผิวของ อุปกรณ์ระบบสัมผัสตามแกน XABS_TILT_Y
: (ไม่บังคับ) รายงานการเอียงของเครื่องมือจากพื้นผิวของ อุปกรณ์ระบบสัมผัสตามแกน YBTN_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 ดูรายละเอียดเพิ่มเติมได้ในเอกสารประกอบเกี่ยวกับโปรโตคอลมัลติทัชของ LinuxBTN_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 เมื่อเครื่องมือสัมผัสอุปกรณ์ ระยะทางอาจไม่เป็นศูนย์ แม้ว่าเครื่องมือจะสัมผัสโดยตรงก็ตาม ค่าที่แน่นอนที่รายงานจะขึ้นอยู่กับ วิธีที่ฮาร์ดแวร์วัดระยะทางการรายงานข้อมูลระยะทางเป็นไม่บังคับ แต่แนะนำสำหรับ อุปกรณ์สไตลัส
ค่าที่รายงานโดย
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
EventHub
อ่านเหตุการณ์ดิบจากไดรเวอร์evdev
InputReader
จะใช้เหตุการณ์ดิบและอัปเดตสถานะภายในเกี่ยวกับ ตำแหน่งและลักษณะอื่นๆ ของเครื่องมือแต่ละอย่าง และยังติดตามสถานะปุ่มด้วย- หากมีการกดหรือปล่อยปุ่มย้อนกลับหรือไปข้างหน้า
InputReader
จะแจ้งให้InputDispatcher
ทราบเกี่ยวกับเหตุการณ์สำคัญ InputReader
จะกำหนดว่ามีการกดแป้นเสมือนหรือไม่ หากเป็นเช่นนั้น ระบบจะแจ้งให้InputDispatcher
ทราบเกี่ยวกับเหตุการณ์สำคัญInputReader
จะกำหนดว่าการแตะเริ่มต้นภายในขอบเขตของจอแสดงผลหรือไม่ หากเป็นเช่นนั้น ระบบจะแจ้งให้InputDispatcher
ทราบเกี่ยวกับ เหตุการณ์การแตะ- หากไม่มีเครื่องมือสัมผัส แต่มีเครื่องมือวางเมาส์อย่างน้อย 1 รายการ
InputReader
จะแจ้งให้InputDispatcher
ทราบเกี่ยวกับเหตุการณ์วางเมาส์ - หากประเภทอุปกรณ์สัมผัสเป็นเคอร์เซอร์
InputReader
จะตรวจหาท่าทางสัมผัสของเคอร์เซอร์ ย้ายเคอร์เซอร์และจุดตามนั้น แล้วแจ้งInputDispatcher
เกี่ยวกับเหตุการณ์ของเคอร์เซอร์ InputDispatcher
ใช้WindowManagerPolicy
เพื่อพิจารณาว่า ควรส่งเหตุการณ์หรือไม่ และควรปลุกอุปกรณ์หรือไม่ จากนั้นInputDispatcher
จะส่งเหตุการณ์ไปยังแอปที่เหมาะสม
การกำหนดค่าอุปกรณ์ระบบสัมผัส
ลักษณะการทำงานของอุปกรณ์สัมผัสจะกำหนดโดยแกน ปุ่ม คุณสมบัติอินพุต การกำหนดค่าอุปกรณ์อินพุต แผนที่คีย์เสมือน และเลย์เอาต์แป้น
ดูรายละเอียดเพิ่มเติมเกี่ยวกับไฟล์ที่ ใช้ในการกำหนดค่าแป้นพิมพ์ได้ในส่วนต่อไปนี้
คุณสมบัติ
ระบบใช้พร็อพเพอร์ตี้การกำหนดค่าอุปกรณ์อินพุตหลายอย่างเพื่อกำหนดค่า และปรับเทียบลักษณะการทำงานของอุปกรณ์ระบบสัมผัส
สาเหตุหนึ่งที่ทำให้เกิดปัญหานี้คือไดรเวอร์อุปกรณ์สำหรับอุปกรณ์ระบบสัมผัสมักรายงาน ลักษณะของการสัมผัสโดยใช้หน่วยเฉพาะของอุปกรณ์
ตัวอย่างเช่น อุปกรณ์ระบบสัมผัสจำนวนมากจะวัดพื้นที่สัมผัส โดยใช้มาตราส่วนภายในที่เฉพาะเจาะจงของอุปกรณ์ เช่น จำนวน โหนดเซ็นเซอร์ทั้งหมดที่ทริกเกอร์โดยการสัมผัส ค่าขนาดดิบนี้จะ ไม่มีความหมายต่อแอปเนื่องจากแอปจะต้องทราบเกี่ยวกับ ขนาดทางกายภาพและลักษณะอื่นๆ ของโหนดเซ็นเซอร์อุปกรณ์สัมผัส
ระบบใช้พารามิเตอร์การปรับเทียบที่เข้ารหัสไว้ในการกำหนดค่าอุปกรณ์อินพุต เพื่อถอดรหัส แปลง และทําให้ค่าที่รายงานโดยอุปกรณ์สัมผัส เป็นรูปแบบมาตรฐานที่ง่ายขึ้นซึ่งแอปเข้าใจได้
รูปแบบเอกสารประกอบ
เพื่อวัตถุประสงค์ในการจัดทำเอกสาร เราใช้รูปแบบต่อไปนี้เพื่ออธิบาย ค่าที่ระบบใช้ในกระบวนการปรับเทียบ
ค่าแกนดิบ
นิพจน์ต่อไปนี้แสดงค่าดิบที่รายงานโดยไดรเวอร์อุปกรณ์สัมผัสเป็นเหตุการณ์ EV_ABS
raw.x
- ค่าของแกน
ABS_X
หรือABS_MT_POSITION_X
raw.y
- ค่าของแกน
ABS_Y
หรือABS_MT_POSITION_Y
raw.pressure
- ค่าของแกน
ABS_PRESSURE
หรือABS_MT_PRESSURE
หรือ 0 หาก ไม่พร้อมใช้งาน raw.touchMajor
- ค่าของแกน
ABS_MT_TOUCH_MAJOR
หรือ 0 หากไม่มี raw.touchMinor
- ค่าของแกน
ABS_MT_TOUCH_MINOR
หรือraw.touchMajor
หาก ไม่พร้อมใช้งาน raw.toolMajor
- ค่าของแกน
ABS_TOOL_WIDTH
หรือABS_MT_WIDTH_MAJOR
หรือ 0 หาก ไม่พร้อมใช้งาน raw.toolMinor
- ค่าของแกน
ABS_MT_WIDTH_MINOR
หรือraw.toolMajor
หากไม่มี raw.orientation
- ค่าของแกน
ABS_MT_ORIENTATION
หรือ 0 หากไม่มี raw.distance
- ค่าของแกน
ABS_DISTANCE
หรือABS_MT_DISTANCE
หรือ 0 หาก ไม่พร้อมใช้งาน raw.tiltX
- ค่าของแกน
ABS_TILT_X
หรือ 0 หากไม่มี raw.tiltY
- ค่าของแกน
ABS_TILT_Y
หรือ 0 หากไม่มี
ช่วงแกนดิบ
นิพจน์ต่อไปนี้แสดงขอบเขตของค่าดิบ โดยจะได้รับ
จากการเรียก EVIOCGABS
ioctl สำหรับแต่ละแกน
raw.*.min
- ค่าต่ำสุดแบบรวมของแกนดิบ
raw.*.max
- ค่าสูงสุดแบบรวมของแกนดิบ
raw.*.range
- เทียบเท่ากับ
raw.*.max - raw.*.min
raw.*.fuzz
- ความแม่นยำของแกนดิบ เช่น fuzz = 1 หมายความว่าค่ามีความแม่นยำถึง +/- 1 หน่วย
raw.width
- ความกว้างแบบรวมของพื้นที่สัมผัส ซึ่งเทียบเท่ากับ
raw.x.range + 1
raw.height
- ความสูงแบบรวมของพื้นที่สัมผัส ซึ่งเทียบเท่ากับ
raw.y.range + 1
ช่วงเอาต์พุต
นิพจน์ต่อไปนี้แสดงลักษณะของระบบพิกัดเอาต์พุต ระบบจะใช้การประมาณเชิงเส้นเพื่อแปลข้อมูลตำแหน่งการแตะจาก หน่วยพื้นผิวที่อุปกรณ์สัมผัสใช้เป็นหน่วยเอาต์พุตที่ รายงานไปยังแอป เช่น พิกเซลของจอแสดงผล
output.width
- ความกว้างของเอาต์พุต สำหรับหน้าจอสัมผัส (ที่เชื่อมโยงกับจอแสดงผล) นี่คือความกว้างของจอแสดงผลเป็นพิกเซล สำหรับทัชแพด (ไม่ได้เชื่อมโยงกับจอแสดงผล)
ความกว้างของเอาต์พุตจะเท่ากับ
raw.width
ซึ่งบ่งบอกว่าไม่มีการประมาณค่า output.height
- ความสูงของเอาต์พุต สำหรับหน้าจอสัมผัส (เชื่อมโยงกับจอแสดงผล) ค่านี้
คือความสูงของจอแสดงผลเป็นพิกเซล สำหรับทัชแพด (ไม่ได้เชื่อมโยงกับจอแสดงผล)
ความสูงของเอาต์พุตจะเท่ากับ
raw.height
ซึ่งบ่งบอกว่าไม่มีการ ประมาณค่า output.diag
- ความยาวเส้นทแยงมุมของระบบพิกัดเอาต์พุต ซึ่งเทียบเท่ากับ
sqrt(output.width ^2 + output.height ^2)
การกำหนดค่าพื้นฐาน
โปรแกรมแมปอินพุตแบบสัมผัสใช้พร็อพเพอร์ตี้การกำหนดค่าหลายรายการในไฟล์การกำหนดค่าอุปกรณ์อินพุตเพื่อระบุค่าการปรับเทียบ ตารางต่อไปนี้อธิบาย พร็อพเพอร์ตี้การกำหนดค่าอเนกประสงค์บางอย่าง พร็อพเพอร์ตี้อื่นๆ ทั้งหมดจะอธิบายไว้ ในส่วนต่อไปนี้พร้อมกับฟิลด์ที่ใช้ในการปรับเทียบ
touch.deviceType
คำจำกัดความ: touch.deviceType
= touchScreen
|
touchPad
| pointer
| default
ระบุประเภทอุปกรณ์สัมผัส
-
หากค่าเป็น
touchScreen
แสดงว่าอุปกรณ์สัมผัสเป็นหน้าจอสัมผัสที่เชื่อมโยง กับจอแสดงผล -
หากค่าเป็น
touchPad
แสดงว่าอุปกรณ์สัมผัสเป็นทัชแพดที่ไม่ได้เชื่อมโยง กับจอแสดงผล -
หากค่าเป็น
pointer
แสดงว่าอุปกรณ์สัมผัสเป็นทัชแพดที่ไม่ได้เชื่อมโยง กับจอแสดงผล และจะใช้การเคลื่อนไหวของทัชแพดสำหรับ ท่าทางสัมผัสแบบมัลติทัชแบบอ้อม -
หากค่าเป็น
default
ระบบจะตรวจหาประเภทอุปกรณ์โดยอัตโนมัติ ตามอัลกอริทึมการจัดประเภท
ดูรายละเอียดเพิ่มเติมเกี่ยวกับวิธีที่ประเภทอุปกรณ์มีผลต่อลักษณะการทำงานของอุปกรณ์ระบบสัมผัสได้ที่ส่วนการจัดประเภท
ใน Android 3 และต่ำกว่า ระบบจะถือว่าอุปกรณ์สัมผัสทั้งหมดเป็นหน้าจอสัมผัส
touch.orientationAware
คำจำกัดความ: touch.orientationAware
= 0
| 1
ระบุว่าอุปกรณ์สัมผัสควรตอบสนองต่อการเปลี่ยนแปลงการวางแนวการแสดงผลหรือไม่
-
หากค่าเป็น
1
ระบบจะหมุนตำแหน่งสัมผัสที่อุปกรณ์สัมผัสรายงาน เมื่อใดก็ตามที่การวางแนวของจอแสดงผลเปลี่ยนแปลง -
หากค่าเป็น
0
ตำแหน่งสัมผัสที่อุปกรณ์สัมผัสรายงานจะไม่ได้รับผลกระทบ จากการเปลี่ยนแปลงการวางแนวการแสดงผล
ค่าเริ่มต้นคือ 1
หากอุปกรณ์เป็นหน้าจอสัมผัส หรือ 0
หากไม่ใช่
ระบบจะแยกความแตกต่างระหว่างหน้าจอสัมผัสและจอแสดงผลภายในและภายนอก หน้าจอสัมผัสภายในที่รับรู้การวางแนวจะหมุนตามการวางแนว ของจอแสดงผลภายใน ระบบจะหมุนหน้าจอสัมผัสภายนอกที่รับรู้การวางแนว ตามการวางแนวของจอแสดงผลภายนอก
การรับรู้การวางแนวใช้เพื่อรองรับการหมุนหน้าจอสัมผัสในอุปกรณ์ เช่น Nexus One ตัวอย่างเช่น เมื่อหมุนอุปกรณ์ตามเข็มนาฬิกา 90 องศา จากแนวตั้งปกติ ระบบจะแมปตำแหน่งสัมบูรณ์ของการสัมผัสใหม่ เพื่อให้ระบบรายงานการสัมผัสที่มุมซ้ายบนของระบบพิกัดสัมบูรณ์ของหน้าจอสัมผัส เป็นการสัมผัสที่มุมซ้ายบนของระบบพิกัดที่หมุนของจอแสดงผล การดำเนินการนี้จะช่วยให้ระบบรายงานการแตะด้วยระบบพิกัดเดียวกันกับที่แอปใช้ในการวาดองค์ประกอบภาพ
ก่อน Honeycomb ระบบจะถือว่าอุปกรณ์ระบบสัมผัสทั้งหมดรับรู้การวางแนว
touch.gestureMode
คำจำกัดความ: touch.gestureMode
= pointer
| spots
|
default
ระบุโหมดการนำเสนอสำหรับท่าทางสัมผัสของเคอร์เซอร์ พร็อพเพอร์ตี้การกำหนดค่านี้ จะเกี่ยวข้องเฉพาะเมื่ออุปกรณ์สัมผัสเป็นประเภทพอยน์เตอร์
-
หากค่าเป็น
pointer
ระบบจะแสดงท่าทางสัมผัสบนทัชแพดผ่านเคอร์เซอร์ คล้ายกับเคอร์เซอร์ของเมาส์ -
หากค่าเป็น
spots
ระบบจะแสดงท่าทางสัมผัสบนทัชแพดด้วย Anchor ที่แสดงถึงจุดศูนย์กลางของท่าทางสัมผัสและชุดจุดวงกลม ที่แสดงถึงตำแหน่งของนิ้วแต่ละนิ้ว
ค่าเริ่มต้นคือ pointer
เมื่อตั้งค่าพร็อพเพอร์ตี้อินพุต INPUT_PROP_SEMI_MT
หรือ spots
ในกรณีอื่นๆ
ฟิลด์ X และ Y
ฟิลด์ X และ Y ให้ข้อมูลตำแหน่งสำหรับกึ่งกลางของพื้นที่สัมผัส
การคำนวณ
การคำนวณนั้นตรงไปตรงมา โดยจะมีการประมาณค่าเชิงเส้นของข้อมูลตำแหน่งจากไดรเวอร์การสัมผัสไปยังระบบพิกัดเอาต์พุต
xScale = output.width / raw.width yScale = output.height / raw.height If not orientation aware or screen rotation is 0 degrees: output.x = (raw.x - raw.x.min) * xScale output.y = (raw.y - raw.y.min) * yScale Else If rotation is 90 degrees: output.x = (raw.y - raw.y.min) * yScale output.y = (raw.x.max - raw.x) * xScale Else If rotation is 180 degrees: output.x = (raw.x.max - raw.x) * xScale output.y = (raw.y.max - raw.y) * yScale Else If rotation is 270 degrees: output.x = (raw.y.max - raw.y) * yScale output.y = (raw.x - raw.x.min) * xScale End If
ฟิลด์ touchMajor, touchMinor, toolMajor, toolMinor, size
ฟิลด์ 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
= <ตัวเลขทศนิยมที่ไม่เป็นลบ>
ระบุค่าอคติคงที่ที่ใช้ในการปรับเทียบ
ค่าเริ่มต้นคือ 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
= <ตัวเลขทศนิยมที่ไม่เป็นลบ>
ระบุตัวคูณมาตราส่วนคงที่ที่ใช้ในการปรับเทียบ
ค่าเริ่มต้นคือ 1.0 / raw.pressure.max
การคำนวณ
การคำนวณฟิลด์ pressure
จะขึ้นอยู่กับพารามิเตอร์การปรับเทียบที่ระบุ
If touch.pressure.calibration == "physical" or "amplitude": output.pressure = raw.pressure * touch.pressure.scale Else If hovering: output.pressure = 0 Else output.pressure = 1 End If End If
ฟิลด์การวางแนวและการเอียง
ฟิลด์ orientation
อธิบายการวางแนวของการสัมผัสและเครื่องมือเป็นการวัดเชิงมุม การวางแนว 0
แสดงว่าแกนหลักวางแนวตั้ง
-PI/2
แสดงว่าแกนหลักวางแนวนอนไปทางซ้าย
PI/2
แสดงว่าแกนหลักวางแนวนอนไปทางขวา เมื่อมีเครื่องมือสไตลัส
ช่วงการวางแนวจะอธิบายได้ในวงกลมเต็ม
จาก -PI
หรือ PI
tilt
ฟิลด์จะอธิบายความเอียงของเครื่องมือเป็นการวัดเชิงมุม
การเอียง 0
แสดงว่าเครื่องมือตั้งฉากกับพื้นผิว
การเอียง PI/2
แสดงว่าเครื่องมือวางราบกับพื้นผิว
touch.orientation.calibration
คำจำกัดความ: touch.orientation.calibration
= none
|
interpolated
| vector
| default
ระบุประเภทการวัดที่ใช้โดยไดรเวอร์การสัมผัสเพื่อรายงานการวางแนว
- หากค่าเป็น
none
แสดงว่าไม่ทราบการวางแนว จึงตั้งค่าเป็น 0 - หากค่าเป็น
interpolated
ระบบจะประมาณค่าการวางแนวเชิงเส้นเพื่อให้ค่าดิบraw.orientation.min
แมปกับ-PI/2
และค่าดิบraw.orientation.max
แมปกับPI/2
ค่ากึ่งกลางของ(raw.orientation.min + raw.orientation.max) / 2
จะแมปกับ0
- หากค่าเป็น
vector
ระบบจะตีความการวางแนวเป็นเวกเตอร์แบบแพ็กซึ่งประกอบด้วย ฟิลด์แบบมีเครื่องหมาย 4 บิต 2 ฟิลด์ การแสดงนี้ใช้ในชิ้นส่วนของ Atmel Object Based Protocol เมื่อถอดรหัสแล้ว เวกเตอร์จะให้มุมการวางแนวและความเชื่อมั่น ขนาด ระบบจะใช้ขนาดความเชื่อมั่นเพื่อปรับขนาดข้อมูล เว้นแต่จะเป็นข้อมูลทางเรขาคณิต - หากค่าเป็น
default
ระบบจะใช้การปรับเทียบinterpolated
หากมีแกนการวางแนว ไม่เช่นนั้นจะใช้none
การคำนวณ
การคำนวณฟิลด์ orientation
และ tilt
จะขึ้นอยู่กับ
พารามิเตอร์การปรับเทียบที่ระบุและอินพุตที่มี
If touch.tiltX and touch.tiltY are available: tiltXCenter = average(raw.tiltX.min, raw.tiltX.max) tiltYCenter = average(raw.tiltY.min, raw.tiltY.max) tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180 tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180 output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle)) output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle)) Else If touch.orientation.calibration == "interpolated": center = average(raw.orientation.min, raw.orientation.max) output.orientation = PI / (raw.orientation.max - raw.orientation.min) output.tilt = 0 Else If touch.orientation.calibration == "vector": c1 = (raw.orientation & 0xF0) >> 4 c2 = raw.orientation & 0x0F If c1 != 0 or c2 != 0: If c1 >= 8 Then c1 = c1 - 16 If c2 >= 8 Then c2 = c2 - 16 angle = atan2(c1, c2) / 2 confidence = sqrt(c1*c1 + c2*c2) output.orientation = angle If touch.size.calibration == "diameter" or "area": scale = 1.0 + confidence / 16 output.touchMajor *= scale output.touchMinor /= scale output.toolMajor *= scale output.toolMinor /= scale End If Else output.orientation = 0 End If output.tilt = 0 Else output.orientation = 0 output.tilt = 0 End If If orientation aware: If screen rotation is 90 degrees: output.orientation = output.orientation - PI / 2 Else If screen rotation is 270 degrees: output.orientation = output.orientation + PI / 2 End If End If
ฟิลด์ระยะทาง
ฟิลด์ distance
จะอธิบายระยะห่างระหว่างเครื่องมือกับพื้นผิวของอุปกรณ์ระบบสัมผัส
ค่า 0.0 แสดงถึงการสัมผัสโดยตรง และค่าที่มากขึ้นแสดงถึง
ระยะห่างจากพื้นผิวที่เพิ่มขึ้น
touch.distance.calibration
คำจำกัดความ: touch.distance.calibration
= none
|
scaled
| default
ระบุประเภทการวัดที่ไดรเวอร์การสัมผัสใช้เพื่อรายงานระยะทาง
-
หากค่าเป็น
none
แสดงว่าไม่ทราบระยะทาง จึงตั้งค่าเป็น 0 -
หากค่าเป็น
scaled
ระบบจะคูณระยะทางที่รายงานด้วย ค่าคงที่ของปัจจัยการปรับขนาด -
หากค่าเป็น
default
ระบบจะใช้การปรับเทียบscaled
หากมีแกนระยะทาง ไม่เช่นนั้นจะใช้none
touch.distance.scale
คำจำกัดความ: touch.distance.scale
= <ตัวเลขทศนิยมที่ไม่เป็นลบ>
ระบุตัวคูณมาตราส่วนคงที่ที่ใช้ในการปรับเทียบ
ค่าเริ่มต้นคือ 1.0
การคำนวณ
การคำนวณฟิลด์ distance
จะขึ้นอยู่กับพารามิเตอร์การปรับเทียบที่ระบุ
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
ตัวอย่าง
# Input device configuration file for a touch screen that supports pressure, # size and orientation. The pressure and size scale factors were obtained # by measuring the characteristics of the device itself and deriving # useful approximations based on the resolution of the touch sensor and the # display. # # Note that these parameters are specific to a particular device model. # Different parameters need to be used for other devices. # Basic Parameters touch.deviceType = touchScreen touch.orientationAware = 1 # Size # Based on empirical measurements, we estimate the size of the contact # using size = sqrt(area) * 28 + 0. touch.size.calibration = area touch.size.scale = 28 touch.size.bias = 0 touch.size.isSummed = 0 # Pressure # Driver reports signal strength as pressure. # # A normal index finger touch typically registers about 80 signal strength # units although we don't expect these values to be accurate. touch.pressure.calibration = amplitude touch.pressure.scale = 0.0125 # Orientation touch.orientation.calibration = vector
หมายเหตุเกี่ยวกับความเข้ากันได้
พร็อพเพอร์ตี้การกำหนดค่าสำหรับอุปกรณ์ระบบสัมผัสมีการเปลี่ยนแปลงอย่างมากใน Android Ice Cream Sandwich 4.0 ต้องอัปเดตไฟล์การกำหนดค่าอุปกรณ์อินพุตทั้งหมดสำหรับอุปกรณ์ระบบสัมผัส เพื่อใช้พร็อพเพอร์ตี้การกำหนดค่าใหม่
นอกจากนี้ คุณอาจต้องอัปเดตไดรเวอร์ของอุปกรณ์ระบบสัมผัสรุ่นเก่าด้วย
ไฟล์คีย์แมปเสมือน
คุณใช้อุปกรณ์ระบบสัมผัสเพื่อใช้ปุ่มเสมือนได้
คุณทำได้หลายวิธีโดยขึ้นอยู่กับความสามารถของ ตัวควบคุมการสัมผัส คุณกำหนดค่าตัวควบคุมการสัมผัสบางอย่างได้โดยตรงเพื่อใช้ ปุ่มซอฟต์แวร์โดยการตั้งค่ารีจิสเตอร์เฟิร์มแวร์ ในบางครั้ง การแมปจากพิกัดสัมผัสไปยังรหัสแป้นในซอฟต์แวร์ก็เป็นสิ่งที่ต้องการ
เมื่อใช้คีย์เสมือนในซอฟต์แวร์ เคอร์เนลต้องส่งออกไฟล์แผนที่คีย์เสมือน
ชื่อ virtualkeys.<devicename>
เป็นพร็อพเพอร์ตี้ของบอร์ด เช่น
หากไดรเวอร์อุปกรณ์หน้าจอสัมผัสรายงานชื่อเป็น "touchyfeely" แล้ว
ไฟล์แผนที่คีย์เสมือนต้องมีเส้นทาง
/sys/board_properties/virtualkeys.touchyfeely
ไฟล์แผนที่คีย์เสมือนจะอธิบายพิกัดและรหัสคีย์ Linux ของคีย์เสมือน บนหน้าจอสัมผัส
นอกจากไฟล์แมปคีย์เสมือนแล้ว ยังต้องมีไฟล์เลย์เอาต์คีย์ที่เกี่ยวข้อง
และไฟล์แมปอักขระคีย์เพื่อแมปรหัสคีย์ Linux กับรหัสคีย์ Android และ
เพื่อระบุประเภทของอุปกรณ์แป้นพิมพ์ (โดยปกติคือ SPECIAL_FUNCTION
)
วากยสัมพันธ์
ไฟล์แผนที่คีย์เสมือนคือไฟล์ข้อความธรรมดาที่ประกอบด้วยลำดับคำอธิบายเลย์เอาต์คีย์เสมือน ซึ่งคั่นด้วยบรรทัดใหม่หรือด้วยเครื่องหมายโคลอน
บรรทัดความคิดเห็นจะขึ้นต้นด้วย "#" และสิ้นสุดที่ท้ายบรรทัด
คีย์เสมือนแต่ละรายการอธิบายโดยคอมโพเนนต์ 6 รายการที่คั่นด้วยเครื่องหมายโคลอน ดังนี้
0x01
: รหัสเวอร์ชัน ต้องเป็น0x01
เสมอ- <รหัสคีย์ Linux>: รหัสคีย์ Linux ของคีย์เสมือน
- <centerX>: พิกัด X ของพิกเซลตรงกลางของคีย์เสมือน
- <centerY>: พิกัด Y ของพิกเซลตรงกลางของคีย์เสมือน
- <width>: ความกว้างของปุ่มเสมือนในหน่วยพิกเซล
- <height>: ความสูงของปุ่มเสมือนในหน่วยพิกเซล
พิกัดและขนาดทั้งหมดจะระบุในแง่ของระบบพิกัดการแสดงผล
นี่คือไฟล์แผนที่คีย์เสมือนที่เขียนทั้งหมดในบรรทัดเดียว
# All on one line 0x01:158:55:835:90:55:0x01:139:172:835:125:55:0x01:102:298:835:115:55:0x01:217:412:835:95:55
นอกจากนี้ คุณยังเขียนไฟล์แมปคีย์เสมือนเดียวกันในหลายบรรทัดได้ด้วย
# One key per line 0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
ในตัวอย่างด้านบน หน้าจอสัมผัสมีความละเอียด 480x800 ดังนั้น คีย์เสมือนทั้งหมดจึงมีพิกัด <centerY> เป็น 835 ซึ่งอยู่ต่ำกว่าพื้นที่ที่มองเห็นของหน้าจอสัมผัสเล็กน้อย
คีย์แรกมีรหัสการสแกน Linux เป็น 158
(KEY_BACK
), centerX เป็น
55
, centerY เป็น 835
, ความกว้างเป็น 90
และความสูงเป็น
55
ตัวอย่าง
ไฟล์แผนที่คีย์เสมือน: /sys/board_properties/virtualkeys.touchyfeely
0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
ไฟล์เลย์เอาต์คีย์: /system/usr/keylayout/touchyfeely.kl
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
ไฟล์แผนที่อักขระของคีย์: /system/usr/keychars/touchyfeely.kcm
type SPECIAL_FUNCTION
ท่าทางสัมผัสของเคอร์เซอร์แบบมัลติทัชโดยอ้อม
ในโหมดเคอร์เซอร์ ระบบจะตีความท่าทางสัมผัสต่อไปนี้
- แตะด้วยนิ้วเดียว: คลิก
- การเคลื่อนไหวด้วยนิ้วเดียว: ย้ายเคอร์เซอร์
- การเคลื่อนไหวด้วยนิ้วเดียวบวกการกดปุ่ม: ลากเคอร์เซอร์
- การเคลื่อนไหวด้วย 2 นิ้วโดยทั้ง 2 นิ้วเคลื่อนที่ไปในทิศทางเดียวกัน: ลากพื้นที่ใต้เคอร์เซอร์ ไปในทิศทางนั้น แต่ตัวชี้จะไม่ขยับ
- การเคลื่อนไหวด้วย 2 นิ้ว โดยทั้ง 2 นิ้วเคลื่อนเข้าหากันหรือออกจากกันใน ทิศทางที่แตกต่างกัน: เลื่อน/ปรับขนาด/หมุนพื้นที่รอบๆ เคอร์เซอร์ แต่ตัวชี้จะไม่ขยับ
- การเคลื่อนไหวแบบหลายนิ้ว: ท่าทางสัมผัสแบบอิสระ
การปฏิเสธฝ่ามือ
ตั้งแต่ Android 13 เป็นต้นไป ระบบจะปฏิเสธอินพุตจากฝ่ามือโดยอัตโนมัติ
เมื่อเปิดใช้เฟรมเวิร์กในตัว ระบบยังคงรองรับโซลูชันที่สร้างขึ้นเองภายในองค์กร
แม้ว่าอาจต้องมีการแก้ไขเพื่อส่งคืนแฟล็ก TOOL_TYPE_PALM
เมื่อตรวจพบฝ่ามือ
ก็ตาม นอกจากนี้ เฟรมเวิร์กในตัวยังทำงานร่วมกับโซลูชันที่กำหนดเองได้ด้วย
โมเดลจริงจะดูข้อมูลท่าทางสัมผัส 90 มิลลิวินาทีแรกที่เคอร์เซอร์ปัจจุบันและเคอร์เซอร์โดยรอบ จากนั้นจะพิจารณาว่าการแตะอยู่ห่างจากขอบจอแสดงผลมากน้อยเพียงใด
จากนั้นจะพิจารณาว่านิ้วใดเป็นฝ่ามือโดยพิจารณาจากนิ้วแต่ละนิ้ว นอกจากนี้ ยังพิจารณาถึงขนาดของรายชื่อติดต่อแต่ละรายการตามที่รายงานโดย touchMajor
และ
touchMinor
ด้วย จากนั้นเฟรมเวิร์ก Android จะนำเคอร์เซอร์ที่ทำเครื่องหมายเป็น
ฝ่ามือออกจากสตรีมการแตะ
หากมีการส่งพอยน์เตอร์ไปยังแอปแล้ว ระบบจะดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้
- (หากมีเคอร์เซอร์อื่นๆ ที่ใช้งานอยู่) ยกเลิกเคอร์เซอร์ที่มี
ACTION_POINTER_UP
และตั้งค่าFLAG_CANCELED
- (หากเป็นเคอร์เซอร์เดียว) ยกเลิกเคอร์เซอร์ด้วย
ACTION_CANCEL
API สาธารณะ MotionEvent.FLAG_CANCELED
ระบุว่าเหตุการณ์ปัจจุบัน
ไม่ควรทริกเกอร์การกระทําของผู้ใช้ โดยตั้งค่าสำหรับทั้ง ACTION_CANCEL
และ ACTION_POINTER_UP
หากไม่ได้ส่งเคอร์เซอร์ฝ่ามือไปยังแอป ระบบจะทิ้งเคอร์เซอร์
เปิดใช้การปฏิเสธฝ่ามือ
- ในไดรเวอร์การสัมผัส ให้ใช้มาโคร
input_abs_set_res
เพื่อตั้งค่าความละเอียดสำหรับฟิลด์ต่อไปนี้ (หน่วยคือ พิกเซลต่อมม.)ABS_MT_POSITION_X
ABS_MT_POSITION_Y
ABS_MT_TOUCH_MAJOR
ABS_MT_TOUCH_MINOR
คุณจะรองรับ
ABS_MT_TOUCH_MINOR
หรือไม่ก็ได้ แต่หากอุปกรณ์รองรับ ให้ตรวจสอบว่าได้ตั้งค่าความละเอียดอย่างถูกต้อง - หากต้องการยืนยันว่าตั้งค่าช่องอย่างถูกต้อง ให้เรียกใช้คำสั่งต่อไปนี้
$ adb shell getevent -li
- หากต้องการเปิดใช้ฟีเจอร์นี้ในระหว่างรันไทม์ ให้เรียกใช้คำสั่งต่อไปนี้
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- รีสตาร์ทกระบวนการ
system_server
$ adb shell stop && adb shell start
- ตรวจสอบว่า
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: {} - หากต้องการเปิดใช้ฟีเจอร์นี้อย่างถาวร ให้เพิ่มคำสั่ง sysprop ที่เกี่ยวข้องในไฟล์
init**rc
ดังนี้setprop persist.device_config.input_native_boot.palm_rejection_enabled 1