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