Android รองรับหน้าจอสัมผัสและทัชแพดที่หลากหลาย รวมถึงแท็บเล็ต digitizer ที่ใช้สไตลัส
หน้าจอสัมผัสเป็นอุปกรณ์สัมผัสที่เชื่อมโยงกับจอแสดงผลในลักษณะที่ผู้ใช้มีความรู้สึกว่าจัดการรายการบนหน้าจอโดยตรง
ทัชแพดคืออุปกรณ์สัมผัสที่ไม่เกี่ยวข้องกับจอแสดงผล เช่น แท็บเล็ตดิจิไทเซอร์ โดยทั่วไปจะใช้ทัชแพดสำหรับการชี้ตำแหน่งหรือการวางตำแหน่งโดยอ้อมหรือการควบคุมส่วนต่อประสานกับผู้ใช้ด้วยท่าทาง
อุปกรณ์ระบบสัมผัสอาจมีปุ่มที่ทำหน้าที่คล้ายกับปุ่มเมาส์
บางครั้งอุปกรณ์ระบบสัมผัสสามารถจัดการได้โดยใช้เครื่องมือต่างๆ มากมาย เช่น นิ้วหรือปากกาสไตลัส ขึ้นอยู่กับเทคโนโลยีเซ็นเซอร์สัมผัสพื้นฐาน
บางครั้งใช้อุปกรณ์สัมผัสเพื่อใช้งานคีย์เสมือน ตัวอย่างเช่น ในอุปกรณ์ Android บางรุ่น พื้นที่เซ็นเซอร์หน้าจอสัมผัสจะขยายเลยขอบของจอแสดงผลและทำหน้าที่สองอย่างโดยเป็นส่วนหนึ่งของแป้นกดที่ไวต่อการสัมผัส
เนื่องจากอุปกรณ์ระบบสัมผัสมีความหลากหลายมาก Android จึงอาศัยคุณสมบัติการกำหนดค่าจำนวนมากเพื่ออธิบายคุณลักษณะและลักษณะการทำงานที่ต้องการของอุปกรณ์แต่ละชิ้น
แตะการจัดประเภทอุปกรณ์
อุปกรณ์อินพุตถูกจัดประเภทเป็น อุปกรณ์มัลติทัช หากเป็นไปตามเงื่อนไขทั้งสองข้อต่อไปนี้:
อุปกรณ์อินพุตรายงานการมีอยู่ของแกนสัมบูรณ์
ABS_MT_POSITION_X
และABS_MT_POSITION_Y
อุปกรณ์อินพุตไม่มีปุ่มเกมแพดใดๆ เงื่อนไขนี้จะแก้ไขความกำกวมกับเกมแพดบางเกมที่รายงานแกนด้วยรหัสที่ทับซ้อนกับแกน MT
อุปกรณ์อินพุตถูกจัดประเภทเป็นอุปกรณ์ แบบสัมผัสเดียว หากทั้งสองเงื่อนไขต่อไปนี้มีอยู่:
อุปกรณ์อินพุตไม่จัดอยู่ในประเภทอุปกรณ์มัลติทัช อุปกรณ์อินพุตจัดอยู่ในประเภทอุปกรณ์สัมผัสเดียวหรืออุปกรณ์มัลติทัช ไม่จัดทั้งสองอย่าง
อุปกรณ์อินพุตรายงานการมีอยู่ของแกนสัมบูรณ์
ABS_X
และABS_Y
และการมีอยู่ของรหัสคีย์BTN_TOUCH
เมื่ออุปกรณ์อินพุตได้รับการจัดประเภทเป็นอุปกรณ์สัมผัสแล้ว การมีอยู่ของคีย์เสมือนจะถูกกำหนดโดยการพยายามโหลดไฟล์แผนที่คีย์เสมือนสำหรับอุปกรณ์ หากมีแมปคีย์เสมือน ไฟล์เค้าโครงคีย์สำหรับอุปกรณ์จะถูกโหลดด้วย
โปรดดูส่วนด้านล่างเกี่ยวกับตำแหน่งและรูปแบบของไฟล์แผนที่คีย์เสมือน
จากนั้น ระบบจะโหลดไฟล์การกำหนดค่าอุปกรณ์อินพุตสำหรับอุปกรณ์สัมผัส
อุปกรณ์สัมผัสในตัวทั้งหมดควรมีไฟล์การกำหนดค่าอุปกรณ์อินพุต หากไม่มีไฟล์การกำหนดค่าอุปกรณ์อินพุต ระบบจะเลือกการกำหนดค่าเริ่มต้นที่เหมาะสมสำหรับอุปกรณ์ต่อพ่วงแบบสัมผัสที่ใช้งานทั่วไปทั่วไป เช่น หน้าจอสัมผัสหรือทัชแพด USB หรือ Bluetooth HID ภายนอก ค่าเริ่มต้นเหล่านี้ไม่ได้ออกแบบมาสำหรับหน้าจอสัมผัสในตัว และมักจะส่งผลให้เกิดพฤติกรรมที่ไม่ถูกต้อง
หลังจากโหลดการกำหนดค่าอุปกรณ์อินพุตแล้ว ระบบจะจัดประเภทอุปกรณ์อินพุตเป็น หน้าจอ สัมผัส ทัชแพด หรืออุปกรณ์ ตัวชี้
อุปกรณ์ หน้าจอสัมผัส ใช้สำหรับจัดการวัตถุบนหน้าจอโดยตรง เนื่องจากผู้ใช้สัมผัสหน้าจอโดยตรง ระบบจึงไม่ต้องการความช่วยเหลือเพิ่มเติมใดๆ เพื่อระบุวัตถุที่ถูกจัดการ
อุปกรณ์ ทัชแพด ใช้เพื่อให้ข้อมูลตำแหน่งที่แน่นอนแก่แอปพลิเคชันเกี่ยวกับการสัมผัสบนพื้นที่เซ็นเซอร์ที่กำหนด อาจมีประโยชน์สำหรับแท็บเล็ต digitizer
อุปกรณ์ ตัวชี้ ใช้สำหรับจัดการวัตถุบนหน้าจอทางอ้อมโดยใช้เคอร์เซอร์ นิ้วถูกตีความว่าเป็นท่าทางสัมผัสของตัวชี้แบบมัลติทัช เครื่องมืออื่นๆ เช่น สไตลัส ถูกตีความโดยใช้ตำแหน่งสัมบูรณ์
ดู ท่าทางสัมผัสตัวชี้มัลติทัชทางอ้อม สำหรับข้อมูลเพิ่มเติม
กฎต่อไปนี้ใช้เพื่อจัดประเภทอุปกรณ์อินพุตเป็น หน้าจอ สัมผัส ทัชแพด หรืออุปกรณ์ ตัวชี้
หากมีการตั้งค่าคุณสมบัติ
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
: (เป็นทางเลือก) รายงาน ID สล็อตของเครื่องมือ เมื่อใช้โปรโตคอล Linux แบบมัลติทัช 'B' โปรดดูเอกสารประกอบของโปรโตคอล 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
หากเป็นค่าที่รายงานทั้งหมด จะต้องไม่เป็นศูนย์เมื่อเครื่องมือแตะกับอุปกรณ์ และมิฉะนั้นจะเป็นศูนย์เพื่อระบุว่าเครื่องมือกำลังลอยอยู่การรายงานข้อมูลความกดดันเป็น ทางเลือก แต่แนะนำเป็นอย่างยิ่ง แอปพลิเคชันสามารถใช้ข้อมูลแรงกดเพื่อใช้การวาดภาพที่ไวต่อแรงกดและเอฟเฟกต์อื่นๆ
ค่าที่รายงานโดย
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 Ice Cream Sandwich 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
EventHub
อ่านเหตุการณ์ดิบจากไดรเวอร์evdev
InputReader
ใช้เหตุการณ์ดิบและอัปเดตสถานะภายในเกี่ยวกับตำแหน่งและคุณลักษณะอื่น ๆ ของแต่ละเครื่องมือ นอกจากนี้ยังติดตามสถานะของปุ่มหากมีการกดหรือปล่อยปุ่ม BACK หรือ FORWARD
InputReader
จะแจ้งInputDispatcher
เกี่ยวกับเหตุการณ์สำคัญInputReader
กำหนดว่ามีการกดคีย์เสมือนหรือไม่ หากเป็นเช่นนั้น ระบบจะแจ้งInputDispatcher
เกี่ยวกับเหตุการณ์สำคัญInputReader
กำหนดว่าการสัมผัสเริ่มต้นภายในขอบเขตของจอแสดงผลหรือไม่ หากเป็นเช่นนั้น ระบบจะแจ้งInputDispatcher
เกี่ยวกับเหตุการณ์การสัมผัสหากไม่มีเครื่องมือสัมผัส แต่มีเครื่องมือโฮเวอร์อย่างน้อยหนึ่งเครื่องมือ
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
ระบบจะตรวจจับประเภทอุปกรณ์โดยอัตโนมัติตามอัลกอริทึมการจำแนกประเภท
โปรดดูส่วน การจัดประเภท สำหรับรายละเอียดเพิ่มเติมว่าประเภทอุปกรณ์มีอิทธิพลต่อลักษณะการทำงานของอุปกรณ์สัมผัสอย่างไร
ก่อนที่จะมี Honeycomb อุปกรณ์ระบบสัมผัสทั้งหมดจะถือว่าเป็นหน้าจอสัมผัส
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
, ฟิลด์ Size
TouchMajor
และ TouchMinor
อธิบายขนาดโดยประมาณของพื้นที่สัมผัสในหน่วยเอาต์พุต (พิกเซล)
ToolMajor
และ ToolMinor
อธิบายขนาดโดยประมาณของ เครื่องมือ ในหน่วยเอาต์พุต (พิกเซล)
ช่อง Size
จะอธิบายขนาดปกติของการสัมผัสที่สัมพันธ์กับการสัมผัสที่ใหญ่ที่สุดเท่าที่อุปกรณ์สัมผัสจะรับรู้ได้ ขนาดนอร์มัลไลซ์ที่เล็กที่สุดเท่าที่จะเป็นไปได้คือ 0.0 (ไม่มีการสัมผัส หรือวัดไม่ได้) และขนาดนอร์มัลไลซ์ที่ใหญ่ที่สุดที่เป็นไปได้คือ 1.0 (พื้นที่เซ็นเซอร์อิ่มตัว)
เมื่อสามารถวัดทั้งความยาวและความกว้างโดยประมาณได้ ฟิลด์ TouchMajor
จะระบุมิติที่ยาวกว่า และฟิลด์ TouchMinor
จะระบุมิติที่สั้นกว่าของพื้นที่สัมผัส เมื่อวัดได้เฉพาะเส้นผ่านศูนย์กลางโดยประมาณของพื้นที่สัมผัสเท่านั้น ฟิลด์ TouchMajor
และ TouchMinor
จะเท่ากัน
ในทำนองเดียวกัน ฟิลด์ ToolMajor
จะระบุมิติที่ยาวกว่า และฟิลด์ ToolMinor
จะระบุมิติที่สั้นกว่าของพื้นที่หน้าตัดของเครื่องมือ
หากไม่มีขนาดสัมผัสแต่มีขนาดเครื่องมืออยู่ ขนาดเครื่องมือจะถูกตั้งค่าให้เท่ากับขนาดสัมผัส ในทางกลับกัน หากขนาดเครื่องมือไม่พร้อมใช้งาน แต่ขนาดสัมผัสใช้ได้ ขนาดสัมผัสจะถูกตั้งค่าเท่ากับขนาดเครื่องมือ
อุปกรณ์สัมผัสวัดหรือรายงานขนาดสัมผัสและขนาดเครื่องมือด้วยวิธีต่างๆ การใช้งานปัจจุบันรองรับการวัดที่แตกต่างกันสามประเภท: เส้นผ่านศูนย์กลาง พื้นที่ และกล่องขอบเขตทางเรขาคณิตในหน่วยพื้นผิว
touch.size.calibration
คำจำกัดความ: touch.size.calibration
= none
| geometric
| diameter
| area
| default
ระบุชนิดของการวัดที่ใช้โดยโปรแกรมควบคุมการสัมผัสเพื่อรายงานขนาดการสัมผัสและขนาดเครื่องมือ
ถ้า
none
ค่า ขนาดจะถูกตั้งค่าเป็นศูนย์ถ้าค่าเป็น
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
ฟิลด์ Pressure
อธิบายถึงแรงกดทางกายภาพโดยประมาณที่ใช้กับอุปกรณ์สัมผัสเป็นค่าปกติระหว่าง 0.0 (ไม่สัมผัส) ถึง 1.0 (แรงเต็มที่)
แรงดันเป็นศูนย์แสดงว่าเครื่องมือลอยอยู่
touch.pressure.calibration
คำจำกัดความ: touch.pressure.calibration
= none
| physical
| amplitude
| default
ระบุชนิดของการวัดที่ใช้โดยไดรเวอร์ระบบสัมผัสเพื่อรายงานความดัน
ถ้าค่าเป็น
none
แสดงว่าไม่ทราบความดัน ดังนั้นให้ตั้งค่าเป็น 1.0 เมื่อแตะและ 0.0 เมื่อวางเมาส์เหนือหากเป็นค่า
physical
จะถือว่าแกนแรงกดเป็นการวัดความเข้มจริงของแรงกดที่กระทำต่อทัชแพดIf the value is
amplitude
, the pressure axis is assumed to measure the signal amplitude, which is related to the size of the contact and the pressure applied.If the value is
default
, the system uses thephysical
calibration if the pressure axis available, otherwise usesnone
.
touch.pressure.scale
Definition: touch.pressure.scale
= <a non-negative floating point number>
Specifies a constant scale factor used in the calibration.
The default value is 1.0 / raw.pressure.max
.
Calculation
The calculation of the Pressure
field depends on the specified calibration parameters.
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
and Tilt
Fields
The Orientation
field describes the orientation of the touch and tool as an angular measurement. An orientation of 0
indicates that the major axis is oriented vertically, -PI/2
indicates that the major axis is oriented to the left, PI/2
indicates that the major axis is oriented to the right. When a stylus tool is present, the orientation range may be described in a full circle range from -PI
or PI
.
The Tilt
field describes the inclination of the tool as an angular measurement. A tilt of 0
indicates that the tool is perpendicular to the surface. A tilt of PI/2
indicates that the tool is flat on the surface.
touch.orientation.calibration
Definition: touch.orientation.calibration
= none
| interpolated
| vector
| default
Specifies the kind of measurement used by the touch driver to report the orientation.
If the value is
none
, the orientation is unknown so it is set to 0.If the value is
interpolated
, the orientation is linearly interpolated such that a raw value ofraw.orientation.min
maps to-PI/2
and a raw value ofraw.orientation.max
maps toPI/2
. The center value of(raw.orientation.min + raw.orientation.max) / 2
maps to0
.If the value is
vector
, the orientation is interpreted as a packed vector consisiting of two signed 4-bit fields. This representation is used on Atmel Object Based Protocol parts. When decoded, the vector yields an orientation angle and confidence magnitude. The confidence magnitude is used to scale the size information, unless it is geometric.If the value is
default
, the system uses theinterpolated
calibration if the orientation axis available, otherwise usesnone
.
Calculation
The calculation of the Orientation
and Tilt
fields depends on the specified calibration parameters and available input.
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
Field
The Distance
field describes the distance between the tool and the touch device surface. A value of 0.0 indicates direct contact and larger values indicate increasing distance from the surface.
touch.distance.calibration
Definition: touch.distance.calibration
= none
| scaled
| default
Specifies the kind of measurement used by the touch driver to report the distance.
If the value is
none
, the distance is unknown so it is set to 0.If the value is
scaled
, the reported distance is multiplied by a constant scale factor.If the value is
default
, the system uses thescaled
calibration if the distance axis available, otherwise usesnone
.
touch.distance.scale
Definition: touch.distance.scale
= <a non-negative floating point number>
Specifies a constant scale factor used in the calibration.
The default value is 1.0
.
Calculation
The calculation of the Distance
field depends on the specified calibration parameters.
If touch.distance.calibration == "scaled": output.distance = raw.distance * touch.distance.scale Else output.distance = 0 End If
Example
# 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 will 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
Compatibility Notes
The configuration properties for touch devices changed significantly in Android Ice Cream Sandwich 4.0. All input device configuration files for touch devices must be updated to use the new configuration properties.
Older touch device drivers may also need to be updated.
Virtual Key Map Files
Touch devices are often used to implement virtual keys.
There are several ways of doing this, depending on the capabilities of the touch controller. Some touch controllers can be directly configured to implement soft keys by setting firmware registers. Other times it is desirable to perform the mapping from touch coordinates to key codes in software.
When virtual keys are implemented in software, the kernel must export a virtual key map file called virtualkeys.<devicename>
as a board property. For example, if the touch screen device drivers reports its name as "touchyfeely" then the virtual key map file must have the path /sys/board_properties/virtualkeys.touchyfeely
.
A virtual key map file describes the coordinates and Linux key codes of virtual keys on the touch screen.
In addition to the virtual key map file, there must be a corresponding key layout file and key character map file to map the Linux key codes to Android key codes and to specify the type of the keyboard device (usually SPECIAL_FUNCTION
).
Syntax
A virtual key map file is a plain text file consisting of a sequence of virtual key layout descriptions either separated by newlines or by colons.
Comment lines begin with '#' and continue to the end of the line.
Each virtual key is described by 6 colon-delimited components:
-
0x01
: A version code. Must always be0x01
. - <Linux key code>: The Linux key code of the virtual key.
- <centerX>: The X pixel coordinate of the center of the virtual key.
- <centerY>: The Y pixel coordinate of the center of the virtual key.
- <width>: The width of the virtual key in pixels.
- <height>: The height of the virtual key in pixels.
All coordinates and sizes are specified in terms of the display coordinate system.
Here is a virtual key map file all written on one line.
# 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
The same virtual key map file can also be written on multiple lines.
# 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
In the above example, the touch screen has a resolution of 480x800. Accordingly, all of the virtual keys have a <centerY> coordinate of 835, which is a little bit below the visible area of the touch screen.
The first key has a Linux scan code of 158
( KEY_BACK
), centerX of 55
, centerY of 835
, width of 90
and height of 55
.
Example
Virtual key map file: /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
Key layout file: /system/usr/keylayout/touchyfeely.kl
.
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
Key character map file: /system/usr/keychars/touchyfeely.kcm
.
type SPECIAL_FUNCTION
Indirect Multi-touch Pointer Gestures
In pointer mode, the system interprets the following gestures:
Single finger tap: click.
Single finger motion: move the pointer.
Single finger motion plus button presses: drag the pointer.
Two finger motion both fingers moving in the same direction: drag the area under the pointer in that direction. The pointer itself does not move.
Two finger motion both fingers moving towards each other or apart in different directions: pan/scale/rotate the area surrounding the pointer. The pointer itself does not move.
Multiple finger motion: freeform gesture.
Palm rejection
As of Android 13, the system can automatically reject inputs from palms when the built-in framework is enabled. In-house, custom-built solutions are still supported, though they might need to be modified to return the TOOL_TYPE_PALM
flag when a palm is detected. The built-in framework also works in conjunction with custom solutions.
The actual model looks at the first 90 ms of gesture data, at the current pointer, and at the surrounding pointers, then considers how far away from the edge of the display the touches are. It then determines, on a per-pointer basis, which of the pointers are palms. It also takes into account the size of each contact, as reported by TouchMajor
and TouchMinor
. The Android framework then removes the pointers that are marked as palms from the touch stream.
If a pointer was already sent to the apps, then the system either:
- (If there are other active pointers) Cancels the pointer with
ACTION_POINTER_UP
andFLAG_CANCELED
set. - (If this is the only pointer) Cancels the pointer with
ACTION_CANCEL
.
A public API, MotionEvent.FLAG_CANCELED
, indicates that the current event shouldn't trigger user action. This flag is set for both ACTION_CANCEL
and ACTION_POINTER_UP
.
If the palm pointer wasn't sent to apps, then the system simply drops the pointer.
Enable palm rejection
- In your touch driver, use the
input_abs_set_res
macro to set the resolutions for the following fields (units are pixels per mm ):-
ABS_MT_POSITION_X
-
ABS_MT_POSITION_Y
-
ABS_MT_TOUCH_MAJOR
-
ABS_MT_TOUCH_MINOR
Support for
ABS_MT_TOUCH_MINOR
is optional. However, if your device does support it, make sure the resolution is set correctly. -
- To confirm the fields are set correctly, run:
$ adb shell getevent -li
- To enable the feature during runtime, run:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- Restart the
system_server
process.$ adb shell stop && adb shell start
- Confirm that
adb shell dumpsys input
shows that there are palm rejectors insideUnwantedInteractionBlocker
. If it doesn't, check the input-related logs to find clues on what might be misconfigured.See the following example for reference:
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: {} - To permanently enable the feature, add the corresponding sysprop command in your
init**rc
file:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1