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
-
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
ระบบจะตรวจจับประเภทอุปกรณ์โดยอัตโนมัติตามอัลกอริทึมการจำแนกประเภท
โปรดดูส่วน การจัดประเภท สำหรับรายละเอียดเพิ่มเติมว่าประเภทอุปกรณ์มีอิทธิพลต่อพฤติกรรมของอุปกรณ์สัมผัสอย่างไร
ใน 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
หากตัวชี้ปาล์มไม่ได้ส่งไปยังแอพแล้วระบบก็จะลดลงตัวชี้
เปิดใช้งานการปฏิเสธปาล์ม
- ในไดรเวอร์แบบสัมผัสของคุณใช้ แมโคร
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
- หากต้องการเปิดใช้งานคุณสมบัติในระหว่างการรันไทม์ Run:
$ adb shell device_config put input_native_boot palm_rejection_enabled 1
- รีสตาร์ทกระบวนการ
system_server
$ adb shell stop && adb shell start
- ยืนยันว่า
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: {} - หากต้องการเปิดใช้งานคุณสมบัติอย่างถาวรให้เพิ่มคำสั่ง sysprop ที่เกี่ยวข้องในไฟล์
init**rc
ของคุณ:setprop persist.device_config.input_native_boot.palm_rejection_enabled 1
อ่านเพิ่มเติม
-Android รองรับหน้าจอสัมผัสที่หลากหลายและแผ่นทัชแพดรวมถึงแท็บเล็ต Digitizer ที่ใช้สไตลัส
หน้าจอสัมผัส เป็นอุปกรณ์สัมผัสที่เกี่ยวข้องกับการแสดงผลเพื่อให้ผู้ใช้มีความประทับใจในการจัดการรายการโดยตรงบนหน้าจอ
แผ่นทัช เป็นอุปกรณ์สัมผัสที่ไม่เกี่ยวข้องกับจอแสดงผลเช่นแท็บเล็ต digitizer โดยทั่วไปแล้วแผ่นทัชจะใช้สำหรับการชี้หรือการวางตำแหน่งทางอ้อมแบบสัมบูรณ์หรือการควบคุมด้วยท่าทางของอินเทอร์เฟซผู้ใช้
อุปกรณ์สัมผัสสามารถมีปุ่มที่มีฟังก์ชั่นคล้ายกับปุ่มเมาส์
อุปกรณ์สัมผัสบางครั้งสามารถจัดการได้โดยใช้เครื่องมือที่หลากหลายเช่นนิ้วหรือสไตลัสขึ้นอยู่กับเทคโนโลยีเซ็นเซอร์สัมผัสพื้นฐาน
อุปกรณ์สัมผัสบางครั้งใช้เพื่อใช้คีย์เสมือนจริง ตัวอย่างเช่นบนอุปกรณ์ Android บางส่วนพื้นที่เซ็นเซอร์หน้าจอสัมผัสขยายเกินขอบของจอแสดงผลและให้บริการวัตถุประสงค์คู่เป็นส่วนหนึ่งของแผ่นคีย์ที่ละเอียดอ่อนสัมผัส
เนื่องจากอุปกรณ์สัมผัสที่หลากหลาย Android อาศัยคุณสมบัติการกำหนดค่าจำนวนมากเพื่ออธิบายลักษณะและพฤติกรรมที่ต้องการของอุปกรณ์แต่ละตัว
การจำแนกอุปกรณ์สัมผัส
อุปกรณ์อินพุตถูกจัดประเภทเป็นอุปกรณ์ มัลติทัช หากเงื่อนไขทั้งสองต่อไปนี้ถือ:
- อุปกรณ์อินพุตรายงานการมีอยู่ของ
ABS_MT_POSITION_X
และABS_MT_POSITION_Y
- อุปกรณ์อินพุตไม่มีปุ่ม gamepad ใด ๆ เงื่อนไขนี้แก้ไขความคลุมเครือด้วย gamepads บางตัวที่รายงานแกนที่มีรหัสที่ซ้อนทับกันของแกน MT
อุปกรณ์อินพุตถูกจัดประเภทเป็นอุปกรณ์ สัมผัสเดียว หากเงื่อนไขทั้งสองต่อไปนี้ถือ:
- อุปกรณ์อินพุตไม่ได้จัดเป็นอุปกรณ์มัลติทัช อุปกรณ์อินพุตถูกจัดประเภทเป็นอุปกรณ์สัมผัสเดี่ยวหรือเป็นอุปกรณ์มัลติทัชไม่เคยทั้งคู่
- อุปกรณ์อินพุตรายงานการปรากฏตัวของแกน
ABS_X
และABS_Y
Absolute และการปรากฏตัวของรหัสคีย์BTN_TOUCH
เมื่ออุปกรณ์อินพุตถูกจัดประเภทเป็นอุปกรณ์สัมผัสการมีอยู่ของปุ่มเสมือนจะถูกกำหนดโดยพยายามโหลดไฟล์แผนที่คีย์เสมือนสำหรับอุปกรณ์ หากมีแผนที่คีย์เสมือนพร้อมใช้งานไฟล์เค้าโครงคีย์สำหรับอุปกรณ์จะถูกโหลดด้วย อ้างถึง [ไฟล์แผนที่ Virtual Key] (#Virtual-Key-Map-Files) สำหรับข้อมูลเกี่ยวกับตำแหน่งและรูปแบบของไฟล์เหล่านี้
ถัดไประบบจะโหลดไฟล์การกำหนดค่าอุปกรณ์อินพุตสำหรับอุปกรณ์สัมผัส
อุปกรณ์สัมผัสในตัวทั้งหมดควรมีไฟล์การกำหนดค่าอุปกรณ์อินพุต หากไม่มีไฟล์การกำหนดค่าอุปกรณ์อินพุตระบบจะเลือกการกำหนดค่าเริ่มต้นที่เหมาะสมสำหรับอุปกรณ์ต่อพ่วงแบบสัมผัสอเนกประสงค์เช่น USB ภายนอกหรือหน้าจอสัมผัส HID บลูทู ธ หรือแผ่นทัชแพด ค่าเริ่มต้นเหล่านี้ไม่ได้ออกแบบมาสำหรับหน้าจอสัมผัสในตัวและอาจส่งผลให้เกิดพฤติกรรมที่ไม่ถูกต้อง
หลังจากโหลดการกำหนดค่าอุปกรณ์อินพุตระบบจะจัดประเภทอุปกรณ์อินพุตเป็น หน้าจอสัมผัส , ทัชแพด หรืออุปกรณ์ ตัวชี้
- อุปกรณ์ หน้าจอสัมผัส ใช้สำหรับการจัดการวัตถุโดยตรงบนหน้าจอ ผู้ใช้สัมผัสกับหน้าจอโดยตรงดังนั้นระบบไม่จำเป็นต้องมีการจ่ายเพิ่มเติมใด ๆ เพื่อระบุวัตถุที่ถูกจัดการ
- อุปกรณ์ ทัชแพด ใช้เพื่อให้ข้อมูลการวางตำแหน่งที่แน่นอนไปยังแอพเกี่ยวกับการสัมผัสในพื้นที่เซ็นเซอร์ที่กำหนด มันมีประโยชน์สำหรับแท็บเล็ต digitizer
- อุปกรณ์ ตัวชี้ ใช้สำหรับการจัดการวัตถุทางอ้อมบนหน้าจอโดยใช้เคอร์เซอร์ นิ้วถูกตีความว่าเป็นท่าทางตัวชี้แบบมัลติทัช เครื่องมืออื่น ๆ เช่น styluses ถูกตีความโดยใช้ตำแหน่งสัมบูรณ์ ดู ท่าทางตัวชี้แบบมัลติทัชทางอ้อม สำหรับข้อมูลเพิ่มเติม
กฎต่อไปนี้ใช้เพื่อจำแนกอุปกรณ์อินพุตเป็นหน้าจอสัมผัสทัชแพดหรืออุปกรณ์ตัวชี้
- หากตั้งค่าคุณสมบัติ
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 เช่นเดียวกับใน API MotionEvent
เครื่องมือมักถูกเรียกว่าเป็น ตัวชี้
รองรับประเภทเครื่องมือต่อไปนี้:
-
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
การโฉบเมื่อเทียบกับเครื่องมือสัมผัส
เครื่องมือสามารถติดต่อกับอุปกรณ์สัมผัสหรืออยู่ในช่วงและโฉบเหนือมัน อุปกรณ์การสัมผัสบางอย่างไม่สามารถสัมผัสได้ว่ามีเครื่องมือที่ลอยอยู่เหนืออุปกรณ์สัมผัส ผู้ที่ทำเช่น stylus digitizers ที่ใช้ RF มักจะสามารถตรวจจับได้เมื่อเครื่องมืออยู่ในช่วงที่ จำกัด ของ digitizer
ส่วนประกอบของ InputReader
แยกความแตกต่างของเครื่องมือการสัมผัสจากเครื่องมือที่โฉบ ในทำนองเดียวกันเครื่องมือสัมผัสและเครื่องมือที่โฉบไปยังแอพในรูปแบบที่แตกต่างกัน
เครื่องมือสัมผัสถูกรายงานไปยังแอพเป็นเหตุการณ์ที่สัมผัสโดยใช้ MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_MOVE
, MotionEvent.ACTION_DOWN
, MotionEvent.ACTION_POINTER_DOWN
และ MotionEvent.ACTION_POINTER_UP
เครื่องมือที่วางเมาส์ถูกรายงานไปยังแอพเป็นเหตุการณ์การเคลื่อนไหวทั่วไปโดยใช้ MotionEvent.ACTION_HOVER_ENTER
, MotionEvent.ACTION_HOVER_MOVE
และ MotionEvent.ACTION_HOVER_EXIT
ต้องการความต้องการไดรเวอร์อุปกรณ์อุปกรณ์
- ไดรเวอร์อุปกรณ์สัมผัสควรลงทะเบียนเฉพาะแกนและรหัสคีย์สำหรับแกนและปุ่มที่รองรับ การลงทะเบียนแกนที่ไม่ได้รับการสนับสนุนหรือรหัสคีย์อาจทำให้อัลกอริทึมการจำแนกอุปกรณ์สับสนหรือทำให้ระบบตรวจจับความสามารถของอุปกรณ์ไม่ถูกต้องไม่ถูกต้อง ตัวอย่างเช่นหากอุปกรณ์รายงานรหัสคีย์
BTN_TOUCH
ระบบจะถือว่าBTN_TOUCH
ใช้เสมอเพื่อระบุว่าเครื่องมือนั้นสัมผัสกับหน้าจอหรือไม่ ดังนั้นจึงไม่ควรใช้BTN_TOUCH
เพื่อระบุว่าเครื่องมือนั้นอยู่ในช่วงและโฉบ - อุปกรณ์สัมผัสเดี่ยวใช้เหตุการณ์อินพุต Linux ต่อไปนี้:
-
ABS_X
: (จำเป็น) รายงาน X พิกัดของเครื่องมือ -
ABS_Y
: (จำเป็น) รายงานการประสานงาน y ของเครื่องมือ -
ABS_PRESSURE
: (ไม่บังคับ) รายงานความดันทางกายภาพที่ใช้กับปลายเครื่องมือหรือความแรงของสัญญาณของหน้าสัมผัสสัมผัส -
ABS_TOOL_WIDTH
: (ไม่บังคับ) รายงานพื้นที่หน้าตัดหรือความกว้างของหน้าสัมผัสสัมผัสหรือเครื่องมือเอง -
ABS_DISTANCE
: (ไม่บังคับ) รายงานระยะทางของเครื่องมือจากพื้นผิวของอุปกรณ์สัมผัส -
ABS_TILT_X
: (ไม่บังคับ) รายงานการเอียงของเครื่องมือจากพื้นผิวของอุปกรณ์สัมผัสตามแกน x -
ABS_TILT_Y
: (ไม่บังคับ) รายงานการเอียงของเครื่องมือจากพื้นผิวของอุปกรณ์สัมผัสตามแกน y -
BTN_TOUCH
: (จำเป็น) ระบุว่าเครื่องมือกำลังสัมผัสอุปกรณ์หรือไม่ -
BTN_LEFT
,BTN_RIGHT
,BTN_MIDDLE
,BTN_BACK
,BTN_SIDE
,BTN_FORWARD
,BTN_EXTRA
,BTN_STYLUS
,BTN_STYLUS2
: (ไม่เลือก) -
BTN_TOOL_FINGER
,BTN_TOOL_PEN
BTN_TOOL_MOUSE
BTN_TOOL_BRUSH
BTN_TOOL_TRIPLETAP
BTN_TOOL_PENCIL
,BTN_TOOL_RUBBER
,BTN_TOOL_DOUBLETAP
BTN_TOOL_LENS
BTN_TOOL_QUADTAP
BTN_TOOL_AIRBRUSH
ประเภท เครื่องมือ
-
- อุปกรณ์มัลติทัชใช้เหตุการณ์อินพุต 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
: (ไม่บังคับ) รายงาน ID การติดตามของเครื่องมือ ID การติดตามเป็นจำนวนเต็มที่ไม่เป็นลบโดยพลการที่ใช้ในการระบุและติดตามเครื่องมือแต่ละตัวอย่างอิสระเมื่อมีการใช้งานเครื่องมือหลายตัว ตัวอย่างเช่นเมื่อนิ้วหลายนิ้วสัมผัสอุปกรณ์แต่ละนิ้วควรได้รับการกำหนดรหัสการติดตามที่แตกต่างกันซึ่งใช้ตราบเท่าที่นิ้วยังคงสัมผัส การติดตาม ID สามารถนำกลับมาใช้ใหม่ได้เมื่อเครื่องมือที่เกี่ยวข้องย้ายออกจากระยะ -
ABS_MT_SLOT
: (ไม่บังคับ) รายงาน Slot ID ของเครื่องมือเมื่อใช้โปรโตคอล Linux Multi-Touch '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_MOUSE
BTN_TOOL_BRUSH
BTN_TOOL_TRIPLETAP
BTN_TOOL_PENCIL
,BTN_TOOL_RUBBER
,BTN_TOOL_DOUBLETAP
BTN_TOOL_LENS
BTN_TOOL_QUADTAP
BTN_TOOL_AIRBRUSH
ประเภท เครื่องมือ
-
- หากมีการกำหนดแกนสำหรับโปรโตคอลแบบสัมผัสเดี่ยวและมัลติทัชนั้นจะใช้เฉพาะแกนมัลติทัชเท่านั้นและแกนสัมผัสเดี่ยวจะถูกละเว้น
ค่าต่ำสุดและสูงสุดของ
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 ถึง 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
-
EventHub
อ่านเหตุการณ์ดิบจากไดรเวอร์evdev
-
InputReader
ใช้กิจกรรมดิบและอัปเดตสถานะภายในเกี่ยวกับตำแหน่งและคุณสมบัติอื่น ๆ ของเครื่องมือแต่ละตัว นอกจากนี้ยังติดตามสถานะปุ่ม - หาก กดกลับ หรือ ส่งต่อ ถูกกดหรือเปิด
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
AXIS หรือ 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
ช่วงเอาท์พุท
นิพจน์ต่อไปนี้แสดงถึงลักษณะของระบบพิกัดเอาต์พุต The system uses linear interpolation to translate touch position information from the surface units used by the touch device into the output units that are reported to apps such as display pixels.
-
output.width
- The output width. For touch screens (associated with a display), this is the display width in pixels. For touch pads (not associated with a display), the output width equals
raw.width
, indicating that no interpolation is performed. -
output.height
- The output height. For touch screens (associated with a display), this is the display height in pixels. For touch pads (not associated with a display), the output height equals
raw.height
, indicating that no interpolation is performed. -
output.diag
- The diagonal length of the output coordinate system, equivalent to
sqrt(output.width ^2 + output.height ^2)
.
Basic configuration
The touch input mapper uses many configuration properties in the input device configuration file to specify calibration values. The following table describes some general purpose configuration properties. All other properties are described in the following sections along with the fields they are used to calibrate.
touch.deviceType
Definition: touch.deviceType
= touchScreen
| touchPad
| pointer
| default
Specifies the touch device type.
If the value is
touchScreen
, the touch device is a touch screen associated with a display.If the value is
touchPad
, the touch device is a touch pad not associated with a display.If the value is
pointer
, the touch device is a touch pad not associated with a display, and its motions are used for indirect multi-touch pointer gestures .If the value is
default
, the system automatically detects the device type according to the classification algorithm.
Refer to the Classification section for more details about how the device type influences the behavior of the touch device.
In Android 3 and lower, all touch devices were assumed to be touch screens.
touch.orientationAware
Definition: touch.orientationAware
= 0
| 1
Specifies whether the touch device should react to display orientation changes.
If the value is
1
, touch positions reported by the touch device are rotated whenever the display orientation changes.If the value is
0
, touch positions reported by the touch device are immune to display orientation changes.
The default value is 1
if the device is a touch screen, 0
otherwise.
The system distinguishes between internal and external touch screens and displays. An orientation aware internal touch screen is rotated based on the orientation of the internal display. An orientation aware external touch screen is rotated based on the orientation of the external display.
Orientation awareness is used to support rotation of touch screens on devices like the Nexus One. For example, when the device is rotated clockwise 90 degrees from its natural orientation, the absolute positions of touches are remapped such that a touch in the top-left corner of the touch screen's absolute coordinate system is reported as a touch in the top-left corner of the display's rotated coordinate system. This is done so that touches are reported with the same coordinate system that apps use to draw their visual elements.
Prior to Honeycomb, all touch devices were assumed to be orientation aware.
touch.gestureMode
Definition: touch.gestureMode
= pointer
| spots
| default
Specifies the presentation mode for pointer gestures. This configuration property is only relevant when the touch device is of type pointer .
If the value is
pointer
, the touch pad gestures are presented by way of a cursor similar to a mouse pointer.If the value is
spots
, the touch pad gestures are presented by an anchor that represents the centroid of the gesture and a set of circular spots that represent the position of individual fingers.
The default value is pointer
when the INPUT_PROP_SEMI_MT
input property is set, or spots
otherwise.
X and Y fields
The X and Y fields provide positional information for the center of the contact area.
การคำนวณ
The calculation is straightforward: positional information from the touch driver is linearly interpolated to the output coordinate system.
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 fields
The touchMajor
and touchMinor
fields describe the approximate dimensions of the contact area in output units (pixels).
The toolMajor
and toolMinor
fields describe the approximate dimensions of the tool itself in output units (pixels).
The size
field describes the normalized size of the touch relative to the largest possible touch that the touch device can sense. The smallest possible normalized size is 0.0 (no contact, or it is unmeasurable), and the largest possible normalized size is 1.0 (sensor area is saturated).
When both the approximate length and breadth can be measured, then the touchMajor
field specifies the longer dimension and the touchMinor
field specifies the shorter dimension of the contact area. When only the approximate diameter of the contact area can be measured, then the touchMajor
and touchMinor
fields are equal.
Likewise, the toolMajor
field specifies the longer dimension and the toolMinor
field specifies the shorter dimension of the tool's cross-sectional area.
If the touch size is unavailable but the tool size is available, then the tool size is set equal to the touch size. Conversely, if the tool size is unavailable but the touch size is available, then the touch size is set equal to the tool size.
Touch devices measure or report the touch size and tool size in various ways. The current implementation supports three different kinds of measurements: diameter, area, and geometric bounding box in surface units.
Definition: touch.size.calibration
= none
| geometric
| diameter
| area
| default
Specifies the kind of measurement used by the touch driver to report the touch size and tool size.
If the value is
none
, the size is set to zero.If the value is
geometric
, the size is assumed to be specified in the same surface units as the position, so it is scaled in the same manner.If the value is
diameter
, the size is assumed to be proportional to the diameter (width) of the touch or tool.If the value is
area
, the size is assumed to be proportional to the area of the touch or tool.If the value is
default
, the system uses thegeometric
calibration if theraw.touchMajor
orraw.toolMajor
axis is available, otherwise it uses thenone
calibration.
touch.size.scale
Definition: touch.size.scale
= <a non-negative floating point number>
Specifies a constant scale factor used in the calibration.
The default value is 1.0
.
touch.size.bias
Definition: touch.size.bias
= <a non-negative floating point number>
Specifies a constant bias value used in the calibration.
The default value is 0.0
.
touch.size.isSummed
Definition: touch.size.isSummed
= 0
| 1
Specifies whether the size is reported as the sum of the sizes of all active contacts, or is reported individually for each contact.
If the value is
1
, the reported size is divided by the number of contacts prior to use.If the value is
0
, the reported size is used as is.
The default value is 0
.
Some touch devices, particularly "Semi-MT" devices cannot distinguish the individual dimensions of multiple contacts so they report a size measurement that represents their total area or width. This property should only be set to 1
for such devices. If in doubt, set this value to 0
.
การคำนวณ
The calculation of the touchMajor
, touchMinor
, toolMajor
, toolMinor
, and size
fields depends on the specified calibration parameters.
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 field
The pressure
field describes the approximate physical pressure applied to the touch device as a normalized value between 0.0 (no touch) and 1.0 (normal pressure).
A zero pressure indicates that the tool is hovering.
touch.pressure.calibration
Definition: touch.pressure.calibration
= none
| physical
| amplitude
| default
Specifies the kind of measurement used by the touch driver to report the pressure.
If the value is
none
, the pressure is unknown so it is set to 1.0 when touching and 0.0 when hovering.If the value is
physical
, the pressure axis is assumed to measure the actual physical intensity of pressure applied to the touch pad.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
.
การคำนวณ
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 can 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
.
การคำนวณ
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
.
การคำนวณ
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
ตัวอย่าง
# 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
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 might also need to be updated.
Virtual key map files
Touch devices can be 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
).
ไวยากรณ์
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
.
ตัวอย่าง
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 display edge 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