Android รองรับหน้าจอสัมผัสและทัชแพดที่หลากหลาย รวมถึงแท็บเล็ตดิจิไทเซอร์ที่ใช้สไตลัส
หน้าจอสัมผัสคืออุปกรณ์ระบบสัมผัสที่เชื่อมโยงกับจอแสดงผลเพื่อให้ผู้ใช้รู้สึกว่ากำลังจัดการรายการต่างๆ บนหน้าจอโดยตรง
ทัชแพดคืออุปกรณ์ระบบสัมผัสที่ไม่ได้เชื่อมโยงกับจอแสดงผล เช่น แท็บเล็ตดิจิไทเซอร์ โดยทั่วไปแล้ว ทัชแพดจะใช้สำหรับการชี้หรือสำหรับการกำหนดตำแหน่งทางอ้อมแบบสัมบูรณ์หรือการควบคุมอินเทอร์เฟซผู้ใช้ตามท่าทางสัมผัส
อุปกรณ์แบบสัมผัสอาจมีปุ่มที่มีฟังก์ชันการทำงานคล้ายกับปุ่มเมาส์
บางครั้งอุปกรณ์แบบสัมผัสสามารถควบคุมได้โดยใช้เครื่องมือต่างๆ เช่น นิ้วหรือสไตลัส ทั้งนี้ขึ้นอยู่กับเทคโนโลยีเซ็นเซอร์การสัมผัสที่ใช้
บางครั้งมีการใช้อุปกรณ์ระบบสัมผัสเพื่อใช้แป้นเสมือน ตัวอย่างเช่น ในอุปกรณ์ Android บางรุ่น พื้นที่เซ็นเซอร์หน้าจอสัมผัสจะขยายออกไปนอกขอบของจอแสดงผลและทำหน้าที่เป็นส่วนหนึ่งของแป้นกดที่ไวต่อการสัมผัส
เนื่องจากอุปกรณ์ระบบสัมผัสมีหลากหลายประเภท Android จึงอาศัยพร็อพเพอร์ตี้การกำหนดค่าจำนวนมากเพื่ออธิบายลักษณะและลักษณะการทำงานที่ต้องการของอุปกรณ์แต่ละเครื่อง
การแยกประเภทอุปกรณ์ระบบสัมผัส
อุปกรณ์อินพุตจะจัดอยู่ในประเภทอุปกรณ์มัลติทัชหากเป็นไปตามเงื่อนไขทั้ง 2 ข้อต่อไปนี้
- อุปกรณ์อินพุตจะรายงานการมีอยู่ของแกนสัมบูรณ์
ABS_MT_POSITION_XและABS_MT_POSITION_Y - อุปกรณ์อินพุตไม่มีปุ่มเกมแพด เงื่อนไขนี้จะช่วยแก้ปัญหาความกำกวมเกี่ยวกับเกมแพดบางรุ่นที่รายงานแกนด้วยรหัสที่ทับซ้อนกับแกน MT
อุปกรณ์อินพุตจะจัดอยู่ในประเภทอุปกรณ์แบบสัมผัสเดียวหากเป็นไปตามเงื่อนไขทั้ง 2 ข้อต่อไปนี้
- อุปกรณ์อินพุตไม่ได้จัดประเภทเป็นอุปกรณ์แบบมัลติทัช อุปกรณ์อินพุตจะจัดประเภทเป็นอุปกรณ์แบบสัมผัสเดียวหรืออุปกรณ์แบบมัลติทัชอย่างใดอย่างหนึ่งเท่านั้น
- อุปกรณ์อินพุตจะรายงานการมีอยู่ของแกนสัมบูรณ์
ABS_XและABS_Yและการมีอยู่ของรหัสคีย์BTN_TOUCH
เมื่ออุปกรณ์อินพุตจัดอยู่ในประเภทอุปกรณ์ระบบสัมผัส การมีอยู่ของแป้นเสมือนจะกำหนดโดยการพยายามโหลดไฟล์แผนที่แป้นเสมือนสำหรับอุปกรณ์ หากมีแผนผังแป้นเสมือน ระบบจะโหลดไฟล์เลย์เอาต์แป้นสำหรับอุปกรณ์ด้วย ดูข้อมูลเกี่ยวกับตำแหน่งและรูปแบบของไฟล์เหล่านี้ได้ที่ [ไฟล์การแมปคีย์เสมือน](#virtual-key-map-files)
จากนั้น ระบบจะโหลดไฟล์การกำหนดค่าอุปกรณ์อินพุตสำหรับอุปกรณ์ระบบสัมผัส
อุปกรณ์ระบบสัมผัสในตัวทั้งหมดควรมีไฟล์การกำหนดค่าอุปกรณ์อินพุต หากไม่มีไฟล์การกำหนดค่าอุปกรณ์อินพุต ระบบจะเลือกการกำหนดค่าเริ่มต้นที่เหมาะสมสำหรับอุปกรณ์ต่อพ่วงแบบสัมผัสอเนกประสงค์ เช่น หน้าจอสัมผัสหรือทัชแพด HID แบบ USB หรือบลูทูธภายนอก ค่าเริ่มต้นเหล่านี้ไม่ได้ออกแบบมาสำหรับหน้าจอสัมผัสในตัวและอาจส่งผลให้เกิดลักษณะการทำงานที่ไม่ถูกต้อง
หลังจากโหลดการกำหนดค่าอุปกรณ์อินพุตแล้ว ระบบจะจัดประเภทอุปกรณ์อินพุตเป็นหน้าจอสัมผัส ทัชแพด หรืออุปกรณ์ตัวชี้
- อุปกรณ์หน้าจอสัมผัสใช้สำหรับการจัดการวัตถุบนหน้าจอโดยตรง ผู้ใช้แตะหน้าจอโดยตรง ระบบจึงไม่จำเป็นต้องมีตัวบ่งชี้เพิ่มเติมเพื่อระบุออบเจ็กต์ที่กำลังจัดการ
- อุปกรณ์ทัชแพดใช้เพื่อระบุข้อมูลตำแหน่งที่แน่นอนให้แก่แอปเกี่ยวกับการแตะในพื้นที่เซ็นเซอร์ที่กำหนด ซึ่งอาจเป็นประโยชน์สำหรับแท็บเล็ตดิจิไทเซอร์
- อุปกรณ์ตัวชี้ใช้สำหรับการจัดการวัตถุบนหน้าจอโดยอ้อมโดยใช้เคอร์เซอร์ ระบบจะตีความนิ้วเป็นท่าทางสัมผัสของตัวชี้แบบมัลติทัช เครื่องมืออื่นๆ เช่น สไตลัส จะตีความโดยใช้ตำแหน่งสัมบูรณ์ ดูข้อมูลเพิ่มเติมได้ที่ท่าทางสัมผัสของตัวชี้แบบมัลติทัชทางอ้อม
ระบบจะใช้กฎต่อไปนี้เพื่อจัดประเภทอุปกรณ์อินพุตเป็นหน้าจอสัมผัส ทัชแพด หรืออุปกรณ์ชี้ตำแหน่ง
- หากตั้งค่าพร็อพเพอร์ตี้
touch.deviceTypeระบบจะตั้งค่าประเภทอุปกรณ์ตามที่ระบุไว้ - หากอุปกรณ์อินพุตรายงานว่ามีพร็อพเพอร์ตี้อินพุต
INPUT_PROP_DIRECT(ผ่านEVIOCGPROPioctl) ระบบจะตั้งค่าประเภทอุปกรณ์เป็นหน้าจอสัมผัส เงื่อนไขนี้จะถือว่าอุปกรณ์ระบบสัมผัสแบบอินพุตโดยตรงเชื่อมต่อกับจอแสดงผลที่เชื่อมต่ออยู่ด้วย - หากอุปกรณ์อินพุตรายงานว่ามีพร็อพเพอร์ตี้อินพุต
INPUT_PROP_POINTER(ผ่านEVIOCGPROPioctl) ระบบจะตั้งค่าประเภทอุปกรณ์เป็น pointer - หากอุปกรณ์อินพุตรายงานว่ามีแกนสัมพัทธ์
REL_XหรือREL_Yระบบจะตั้งค่าประเภทอุปกรณ์เป็นทัชแพด เงื่อนไขนี้จะช่วยแก้ปัญหาความกำกวมสำหรับอุปกรณ์อินพุตที่ประกอบด้วยทั้งเมาส์และทัชแพด ในกรณีนี้ ระบบจะไม่ใช้ทัชแพดเพื่อควบคุมตัวชี้เนื่องจากเมาส์ควบคุมตัวชี้อยู่แล้ว - ไม่เช่นนั้น ประเภทอุปกรณ์จะตั้งค่าเป็น pointer ค่าเริ่มต้นนี้ช่วยให้มั่นใจว่าทัชแพดที่ไม่ได้กำหนดวัตถุประสงค์พิเศษอื่นๆ จะควบคุมเคอร์เซอร์
ปุ่ม
ปุ่มเป็นตัวควบคุมที่ไม่บังคับซึ่งแอปสามารถใช้เพื่อทำฟังก์ชันเพิ่มเติมได้ ปุ่มบนอุปกรณ์ระบบสัมผัสทำงานคล้ายกับปุ่มเมาส์ และส่วนใหญ่จะใช้กับอุปกรณ์ระบบสัมผัสประเภทตัวชี้หรือสไตลัส
ระบบรองรับปุ่มต่อไปนี้
BTN_LEFT: แมปกับMotionEvent.BUTTON_PRIMARYBTN_RIGHT: แมปกับMotionEvent.BUTTON_SECONDARYBTN_MIDDLE: แมปกับMotionEvent.BUTTON_MIDDLEBTN_BACKและBTN_SIDE: แมปกับMotionEvent.BUTTON_BACKการกดปุ่มนี้ยังสังเคราะห์การกดแป้นด้วยรหัสแป้นKeyEvent.KEYCODE_BACKด้วยBTN_FORWARDและBTN_EXTRA: แมปกับMotionEvent.BUTTON_FORWARDการกดปุ่มนี้ยังสังเคราะห์การกดแป้นด้วยรหัสแป้นKeyEvent.KEYCODE_FORWARDด้วยBTN_STYLUS: แมปกับMotionEvent.BUTTON_SECONDARYBTN_STYLUS2: แมปกับMotionEvent.BUTTON_TERTIARY
เครื่องมือและประเภทเครื่องมือ
เครื่องมือคือนิ้ว สไตลัส หรืออุปกรณ์อื่นๆ ที่ใช้ในการโต้ตอบกับอุปกรณ์ระบบสัมผัส อุปกรณ์ระบบสัมผัสบางรุ่นสามารถแยกแยะเครื่องมือประเภทต่างๆ ได้
ในส่วนอื่นๆ ของ Android เช่น ใน MotionEvent API มักจะเรียกเครื่องมือว่าพอยน์เตอร์
ระบบรองรับเครื่องมือประเภทต่อไปนี้
BTN_TOOL_FINGERและMT_TOOL_FINGER: แมปกับMotionEvent.TOOL_TYPE_FINGERBTN_TOOL_PENและMT_TOOL_PEN: แมปกับMotionEvent.TOOL_TYPE_STYLUSBTN_TOOL_RUBBER: แมปกับMotionEvent.TOOL_TYPE_ERASERBTN_TOOL_BRUSH: แมปกับMotionEvent.TOOL_TYPE_STYLUSBTN_TOOL_PENCIL: แมปกับMotionEvent.TOOL_TYPE_STYLUSBTN_TOOL_AIRBRUSH: แมปกับMotionEvent.TOOL_TYPE_STYLUSBTN_TOOL_MOUSE: แมปกับMotionEvent.TOOL_TYPE_MOUSEBTN_TOOL_LENS: แมปกับMotionEvent.TOOL_TYPE_MOUSEBTN_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_PENABS_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ควรเข้าใกล้ศูนย์เมื่อเครื่องมือสัมผัสกับอุปกรณ์ ระยะห่างอาจยังคงไม่ใช่ศูนย์แม้ว่าเครื่องมือจะสัมผัสโดยตรงก็ตาม ค่าที่รายงานจะขึ้นอยู่กับวิธีที่ฮาร์ดแวร์วัดระยะทางข้อมูลระยะทางในการรายงานเป็นไม่บังคับ แต่แนะนำสำหรับอุปกรณ์สไตลัส
ค่าที่รายงานโดย
ABS_TILT_XและABS_TILT_Yควรเป็น 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แสดงว่าเครื่องมือไม่ได้วางเมาส์เหนือองค์ประกอบ แม้ว่าเงื่อนไขข้อใดข้อหนึ่งต่อไปนี้จะเป็นจริงก็ตาม - หากเครื่องมือทำงานอยู่และไดรเวอร์รายงานข้อมูลแรงกด และแรงกดที่รายงานเป็นศูนย์ แสดงว่าเครื่องมือกำลังลอยอยู่
- หากเครื่องมือทำงานอยู่และไดรเวอร์รองรับรหัสคีย์
BTN_TOUCHและBTN_TOUCHมีค่าเป็น 0 แสดงว่าเครื่องมือกำลังลอยอยู่เหนือหน้าจอ
- หากเครื่องมือเป็น
InputReaderรองรับทั้งโปรโตคอลมัลติทัช "A" และ "B" ไดรเวอร์ใหม่ควรใช้โปรโตคอล "B" แต่จะใช้โปรโตคอลใดก็ได้ตั้งแต่ Android 4.0 เป็นต้นไป อาจต้องเปลี่ยนไดรเวอร์หน้าจอสัมผัสเพื่อให้เป็นไปตามข้อกำหนดโปรโตคอลอินพุตของ Linux
คุณอาจต้องทำการเปลี่ยนแปลงต่อไปนี้
เมื่อเครื่องมือไม่มีการใช้งาน (นิ้ว "ยกขึ้น") เครื่องมือควรหยุดปรากฏในรายงานการซิงค์แบบมัลติทัชที่ตามมา เมื่อเครื่องมือทั้งหมดไม่ทำงาน (นิ้วทั้งหมด "ยกขึ้น") ไดรเวอร์ควรส่งแพ็กเก็ตรายงานการซิงค์ที่ว่างเปล่า เช่น
SYN_MT_REPORTตามด้วยSYN_REPORTAndroid เวอร์ชันก่อนหน้าคาดว่าจะมีการรายงานเหตุการณ์ "ขึ้น" โดยการส่งค่าแรงกดเป็น 0 ลักษณะการทำงานแบบเก่าเข้ากันไม่ได้กับข้อกำหนดโปรโตคอลอินพุตของ Linux และไม่รองรับอีกต่อไป
ควรรายงานข้อมูลแรงกดดันทางกายภาพหรือความแรงของสัญญาณโดยใช้
ABS_MT_PRESSUREAndroid เวอร์ชันก่อนหน้าดึงข้อมูลความดันจาก
ABS_MT_TOUCH_MAJORลักษณะการทำงานแบบเก่าเข้ากันไม่ได้กับข้อกำหนดโปรโตคอลอินพุตของ Linux และระบบไม่รองรับอีกต่อไป- ควรรายงานข้อมูลขนาดการแตะโดยใช้
ABS_MT_TOUCH_MAJORAndroid เวอร์ชันก่อนหน้าดึงข้อมูลขนาดจาก
ABS_MT_TOOL_MAJORลักษณะการทำงานเดิมเข้ากันไม่ได้กับข้อกำหนดโปรโตคอลอินพุตของ Linux และไม่รองรับอีกต่อไป
การทำงานของอุปกรณ์ระบบสัมผัส
ต่อไปนี้เป็นข้อมูลสรุปสั้นๆ เกี่ยวกับการทำงานของอุปกรณ์ระบบสัมผัสบน Android
EventHubอ่านเหตุการณ์ดิบจากไดรเวอร์evdevInputReaderจะใช้เหตุการณ์ดิบและอัปเดตสถานะภายในเกี่ยวกับตำแหน่งและลักษณะอื่นๆ ของเครื่องมือแต่ละรายการ นอกจากนี้ยังติดตามสถานะปุ่มด้วย- หากมีการกดหรือปล่อยปุ่มย้อนกลับหรือไปข้างหน้า
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ท่าทางสัมผัสของทัชแพดจะแสดงโดย Anchor ที่แสดงถึงเซนทรอยด์ของท่าทางสัมผัสและชุดจุดวงกลมที่แสดงตำแหน่งของนิ้วแต่ละนิ้ว
ค่าเริ่มต้นคือ pointer เมื่อตั้งค่าพร็อพเพอร์ตี้อินพุต INPUT_PROP_SEMI_MT หรือ spots ในกรณีอื่นๆ
ฟิลด์ X และ Y
ช่อง X และ Y จะให้ข้อมูลตำแหน่งสำหรับจุดศูนย์กลางของพื้นที่สัมผัส
การคำนวณ
การคำนวณนั้นตรงไปตรงมา โดยข้อมูลตำแหน่งจากไดรเวอร์การสัมผัสจะได้รับการประมาณค่าในช่วงเชิงเส้นไปยังระบบพิกัดเอาต์พุต
xScale = output.width / raw.width
yScale = output.height / raw.height
If not orientation aware or screen rotation is 0 degrees:
output.x = (raw.x - raw.x.min) * xScale
output.y = (raw.y - raw.y.min) * yScale
Else If rotation is 90 degrees:
output.x = (raw.y - raw.y.min) * yScale
output.y = (raw.x.max - raw.x) * xScale
Else If rotation is 180 degrees:
output.x = (raw.x.max - raw.x) * xScale
output.y = (raw.y.max - raw.y) * yScale
Else If rotation is 270 degrees:
output.x = (raw.y.max - raw.y) * yScale
output.y = (raw.x - raw.x.min) * xScale
End If
ฟิลด์ touchMajor, touchMinor, toolMajor, toolMinor, size
ช่อง touchMajor และ touchMinor อธิบายขนาดโดยประมาณของพื้นที่สัมผัสในหน่วยเอาต์พุต (พิกเซล)
ช่อง toolMajor และ toolMinor อธิบายขนาดโดยประมาณของเครื่องมือในหน่วยเอาต์พุต (พิกเซล)
ช่อง size อธิบายขนาดที่ปรับมาตรฐานแล้วของการแตะที่สัมพันธ์กับการแตะที่ใหญ่ที่สุดเท่าที่จะเป็นไปได้ซึ่งอุปกรณ์ระบบสัมผัสสามารถตรวจจับได้ ขนาดที่ปรับให้เป็นมาตรฐานที่เล็กที่สุดคือ 0.0 (ไม่มีการสัมผัสหรือวัดไม่ได้) และขนาดที่ปรับให้เป็นมาตรฐานที่ใหญ่ที่สุดคือ 1.0 (พื้นที่เซ็นเซอร์อิ่มตัว)
เมื่อวัดได้ทั้งความยาวและความกว้างโดยประมาณ ช่อง touchMajor จะระบุด้านที่ยาวกว่า และช่อง touchMinor จะระบุด้านที่สั้นกว่าของพื้นที่สัมผัส เมื่อวัดได้เฉพาะเส้นผ่านศูนย์กลางโดยประมาณของพื้นที่สัมผัส ช่อง touchMajor และ touchMinor จะเท่ากัน
ในทำนองเดียวกัน ช่อง toolMajor จะระบุด้านที่ยาวกว่า และช่อง toolMinor จะระบุด้านที่สั้นกว่าของพื้นที่หน้าตัดของเครื่องมือ
หากขนาดการสัมผัสไม่พร้อมใช้งาน แต่ขนาดเครื่องมือพร้อมใช้งาน ระบบจะตั้งค่าขนาดเครื่องมือให้เท่ากับขนาดการสัมผัส ในทางกลับกัน หากไม่มีขนาดเครื่องมือแต่มีขนาดการแตะ ระบบจะตั้งค่าขนาดการแตะให้เท่ากับขนาดเครื่องมือ
อุปกรณ์แบบสัมผัสจะวัดหรือรายงานขนาดการสัมผัสและขนาดเครื่องมือในรูปแบบต่างๆ การใช้งานปัจจุบันรองรับการวัด 3 ประเภท ได้แก่ เส้นผ่านศูนย์กลาง พื้นที่ และกรอบล้อมรอบทางเรขาคณิตในหน่วยพื้นผิว
<touch.size.calibration< h4=""></touch.size.calibration<>
คำจำกัดความ: touch.size.calibration = none |
geometric | diameter
| area | default
ระบุประเภทการวัดที่ไดรเวอร์การสัมผัสใช้เพื่อรายงานขนาดการสัมผัสและขนาดเครื่องมือ
-
หากค่าเป็น
noneระบบจะกำหนดขนาดเป็น 0 -
หากค่าเป็น
geometricระบบจะถือว่ามีการระบุขนาดในหน่วยพื้นผิวเดียวกับตำแหน่ง ดังนั้นจึงปรับขนาดในลักษณะเดียวกัน -
หากค่าเป็น
diameterระบบจะถือว่าขนาดเป็นสัดส่วนกับเส้นผ่านศูนย์กลาง (ความกว้าง) ของการสัมผัสหรือเครื่องมือ -
หากค่าเป็น
areaระบบจะถือว่าขนาดเป็นสัดส่วนกับพื้นที่ของการสัมผัสหรือเครื่องมือ -
หากค่าเป็น
defaultระบบจะใช้การปรับเทียบgeometricหากมีแกนraw.touchMajorหรือraw.toolMajorไม่เช่นนั้นจะใช้การปรับเทียบnone
touch.size.scale
คำจำกัดความ: touch.size.scale = <เลขทศนิยมที่ไม่เป็นค่าลบ>
ระบุค่าตัวคูณมาตราส่วนคงที่ที่ใช้ในการปรับเทียบ
ค่าเริ่มต้นคือ 1.0
touch.size.bias
คำจำกัดความ: touch.size.bias = <เลขทศนิยมที่ไม่เป็นค่าลบ>
ระบุค่าความคลาดเคลื่อนคงที่ที่ใช้ในการปรับเทียบ
ค่าเริ่มต้นคือ 0.0
touch.size.isSummed
คำจำกัดความ: touch.size.isSummed = 0 | 1
ระบุว่าจะรายงานขนาดเป็นผลรวมของขนาดของรายชื่อติดต่อที่ใช้งานอยู่ทั้งหมด หรือรายงานแยกกันสำหรับรายชื่อติดต่อแต่ละรายการ
-
หากค่าเป็น
1ระบบจะหารขนาดที่รายงานด้วยจำนวนรายชื่อติดต่อก่อนใช้งาน -
หากค่าเป็น
0ระบบจะใช้ขนาดที่รายงานตามที่เป็นอยู่
ค่าเริ่มต้นคือ 0
อุปกรณ์ระบบสัมผัสบางรุ่น โดยเฉพาะอุปกรณ์ "Semi-MT" ไม่สามารถแยกแยะขนาดของจุดสัมผัสหลายจุดได้ จึงรายงานการวัดขนาดที่แสดงถึงพื้นที่หรือความกว้างทั้งหมด คุณควรตั้งค่าพร็อพเพอร์ตี้นี้เป็น 1 สำหรับอุปกรณ์ดังกล่าวเท่านั้น หากไม่แน่ใจ ให้ตั้งค่านี้เป็น 0
การคำนวณ
การคำนวณช่อง touchMajor, touchMinor, toolMajor, toolMinor และ size ขึ้นอยู่กับพารามิเตอร์การปรับเทียบที่ระบุ
If raw.touchMajor and raw.toolMajor are available:
touchMajor = raw.touchMajor
touchMinor = raw.touchMinor
toolMajor = raw.toolMajor
toolMinor = raw.toolMinor
Else If raw.touchMajor is available:
toolMajor = touchMajor = raw.touchMajor
toolMinor = touchMinor = raw.touchMinor
Else If raw.toolMajor is available:
touchMajor = toolMajor = raw.toolMajor
touchMinor = toolMinor = raw.toolMinor
Else
touchMajor = toolMajor = 0
touchMinor = toolMinor = 0
size = 0
End If
size = avg(touchMajor, touchMinor)
If touch.size.isSummed == 1:
touchMajor = touchMajor / numberOfActiveContacts
touchMinor = touchMinor / numberOfActiveContacts
toolMajor = toolMajor / numberOfActiveContacts
toolMinor = toolMinor / numberOfActiveContacts
size = size / numberOfActiveContacts
End If
If touch.size.calibration == "none":
touchMajor = toolMajor = 0
touchMinor = toolMinor = 0
size = 0
Else If touch.size.calibration == "geometric":
outputScale = average(output.width / raw.width, output.height / raw.height)
touchMajor = touchMajor * outputScale
touchMinor = touchMinor * outputScale
toolMajor = toolMajor * outputScale
toolMinor = toolMinor * outputScale
Else If touch.size.calibration == "area":
touchMajor = sqrt(touchMajor)
touchMinor = touchMajor
toolMajor = sqrt(toolMajor)
toolMinor = toolMajor
Else If touch.size.calibration == "diameter":
touchMinor = touchMajor
toolMinor = toolMajor
End If
If touchMajor != 0:
output.touchMajor = touchMajor * touch.size.scale + touch.size.bias
Else
output.touchMajor = 0
End If
If touchMinor != 0:
output.touchMinor = touchMinor * touch.size.scale + touch.size.bias
Else
output.touchMinor = 0
End If
If toolMajor != 0:
output.toolMajor = toolMajor * touch.size.scale + touch.size.bias
Else
output.toolMajor = 0
End If
If toolMinor != 0:
output.toolMinor = toolMinor * touch.size.scale + touch.size.bias
Else
output.toolMinor = 0
End If
output.size = size
ช่องความดัน
ช่อง pressure อธิบายแรงกดทางกายภาพโดยประมาณที่ใช้กับอุปกรณ์ระบบสัมผัสเป็นค่าที่ปรับให้เป็นมาตรฐานระหว่าง 0.0 (ไม่มีการสัมผัส) และ 1.0 (แรงกดปกติ)
แรงกดเป็นศูนย์หมายความว่าเครื่องมือกำลังลอยอยู่
touch.pressure.calibration
คำจำกัดความ: touch.pressure.calibration = none |
physical | amplitude | default
ระบุประเภทการวัดที่ไดรเวอร์การสัมผัสใช้เพื่อรายงานแรงกด
-
หากค่าเป็น
noneระบบจะไม่ทราบแรงกด จึงตั้งค่าเป็น 1.0 เมื่อแตะและ 0.0 เมื่อวางเมาส์เหนือ -
หากค่าเป็น
physicalระบบจะถือว่าแกนแรงกดวัดความหนักทางกายภาพที่แท้จริงของแรงกดที่ใช้กับทัชแพด -
หากค่าเป็น
amplitudeระบบจะถือว่าแกนแรงกดวัดแอมพลิจูดของสัญญาณ ซึ่งเกี่ยวข้องกับขนาดของหน้าสัมผัสและแรงกดที่ใช้ -
หากค่าเป็น
defaultระบบจะใช้การปรับเทียบphysicalหากมีแกนแรงกด ไม่เช่นนั้นจะใช้none
touch.pressure.scale
คำจำกัดความ: touch.pressure.scale = <เลขทศนิยมที่ไม่เป็นค่าลบ>
ระบุค่าตัวคูณมาตราส่วนคงที่ที่ใช้ในการปรับเทียบ
ค่าเริ่มต้นคือ 1.0 / raw.pressure.max
การคำนวณ
การคำนวณฟิลด์ pressure ขึ้นอยู่กับพารามิเตอร์การปรับเทียบที่ระบุ
If touch.pressure.calibration == "physical" or "amplitude":
output.pressure = raw.pressure * touch.pressure.scale
Else
If hovering:
output.pressure = 0
Else
output.pressure = 1
End If
End If
ช่องการวางแนวและการเอียง
ช่อง orientation อธิบายการวางแนวของการแตะและเครื่องมือเป็นการวัดเชิงมุม การวางแนว 0 บ่งบอกว่าแกนหลักวางแนวในแนวตั้ง -PI/2 บ่งบอกว่าแกนหลักวางแนวไปทางซ้าย PI/2 บ่งบอกว่าแกนหลักวางแนวไปทางขวา เมื่อมีเครื่องมือสไตลัส ช่วงการวางแนวจะอธิบายได้ในช่วงวงกลมเต็มจาก -PI หรือ PI
ช่อง tilt อธิบายความเอียงของเครื่องมือเป็นการวัดเชิงมุม
การเอียง 0 บ่งบอกว่าเครื่องมือตั้งฉากกับพื้นผิว
การเอียง PI/2 บ่งบอกว่าเครื่องมือวางราบอยู่บนพื้นผิว
touch.orientation.calibration
คำจำกัดความ: touch.orientation.calibration = none |
interpolated | vector | default
ระบุประเภทการวัดที่ไดรเวอร์การสัมผัสใช้เพื่อรายงานการวางแนว
- หากค่าเป็น
noneแสดงว่าไม่ทราบการวางแนว ระบบจึงตั้งค่าเป็น 0 - หากค่าเป็น
interpolatedการวางแนวจะได้รับการประมาณค่าในช่วงเชิงเส้นเพื่อให้ค่าดิบraw.orientation.minจับคู่กับ-PI/2และค่าดิบraw.orientation.maxจับคู่กับPI/2ค่าตรงกลางของ(raw.orientation.min + raw.orientation.max) / 2จะแมปกับ0 - หากค่าเป็น
vectorระบบจะตีความการวางแนวเป็นเวกเตอร์ที่รวมกันซึ่งประกอบด้วยฟิลด์ 4 บิตที่มีเครื่องหมาย 2 ฟิลด์ การแสดงนี้ใช้กับส่วน Atmel Object Based Protocol เมื่อถอดรหัสแล้ว เวกเตอร์จะแสดงมุมการวางแนวและขนาดความเชื่อมั่น ขนาดความเชื่อมั่นจะใช้เพื่อปรับขนาดข้อมูลขนาด เว้นแต่จะเป็นเรขาคณิต - หากค่าเป็น
defaultระบบจะใช้การปรับเทียบinterpolatedหากมีแกนการวางแนว ไม่เช่นนั้นจะใช้none
การคำนวณ
การคำนวณช่อง orientation และ tilt จะขึ้นอยู่กับพารามิเตอร์การปรับเทียบที่ระบุและอินพุตที่ใช้ได้
If touch.tiltX and touch.tiltY are available:
tiltXCenter = average(raw.tiltX.min, raw.tiltX.max)
tiltYCenter = average(raw.tiltY.min, raw.tiltY.max)
tiltXAngle = (raw.tiltX - tiltXCenter) * PI / 180
tiltYAngle = (raw.tiltY - tiltYCenter) * PI / 180
output.orientation = atan2(-sin(tiltXAngle), sinf(tiltYAngle))
output.tilt = acos(cos(tiltXAngle) * cos(tiltYAngle))
Else If touch.orientation.calibration == "interpolated":
center = average(raw.orientation.min, raw.orientation.max)
output.orientation = PI / (raw.orientation.max - raw.orientation.min)
output.tilt = 0
Else If touch.orientation.calibration == "vector":
c1 = (raw.orientation & 0xF0) >> 4
c2 = raw.orientation & 0x0F
If c1 != 0 or c2 != 0:
If c1 >= 8 Then c1 = c1 - 16
If c2 >= 8 Then c2 = c2 - 16
angle = atan2(c1, c2) / 2
confidence = sqrt(c1*c1 + c2*c2)
output.orientation = angle
If touch.size.calibration == "diameter" or "area":
scale = 1.0 + confidence / 16
output.touchMajor *= scale
output.touchMinor /= scale
output.toolMajor *= scale
output.toolMinor /= scale
End If
Else
output.orientation = 0
End If
output.tilt = 0
Else
output.orientation = 0
output.tilt = 0
End If
If orientation aware:
If screen rotation is 90 degrees:
output.orientation = output.orientation - PI / 2
Else If screen rotation is 270 degrees:
output.orientation = output.orientation + PI / 2
End If
End If
ช่องระยะทาง
ช่อง distance อธิบายระยะห่างระหว่างเครื่องมือกับพื้นผิวของอุปกรณ์ระบบสัมผัส ค่า 0.0 บ่งบอกถึงการสัมผัสโดยตรง และค่าที่มากขึ้นบ่งบอกถึงระยะห่างจากพื้นผิวที่เพิ่มขึ้น
touch.distance.calibration
คำจำกัดความ: touch.distance.calibration = none |
scaled | default
ระบุประเภทการวัดที่ไดรเวอร์การสัมผัสใช้เพื่อรายงานระยะทาง
-
หากค่าเป็น
noneแสดงว่าไม่ทราบระยะทาง ระบบจึงตั้งค่าเป็น 0 -
หากค่าเป็น
scaledระยะทางที่รายงานจะคูณด้วยค่าตัวคูณมาตราส่วนคงที่ -
หากค่าเป็น
defaultระบบจะใช้การปรับเทียบscaledหากมีแกนระยะทาง ไม่เช่นนั้นจะใช้none
touch.distance.scale
คำจำกัดความ: touch.distance.scale = <เลขทศนิยมที่ไม่เป็นค่าลบ>
ระบุค่าตัวคูณมาตราส่วนคงที่ที่ใช้ในการปรับเทียบ
ค่าเริ่มต้นคือ 1.0
การคำนวณ
การคำนวณฟิลด์ distance ขึ้นอยู่กับพารามิเตอร์การปรับเทียบที่ระบุ
If touch.distance.calibration == "scaled":
output.distance = raw.distance * touch.distance.scale
Else
output.distance = 0
End If
ตัวอย่าง
# Input device configuration file for a touch screen that supports pressure, # size and orientation. The pressure and size scale factors were obtained # by measuring the characteristics of the device itself and deriving # useful approximations based on the resolution of the touch sensor and the # display. # # Note that these parameters are specific to a particular device model. # Different parameters need to be used for other devices. # Basic Parameters touch.deviceType = touchScreen touch.orientationAware = 1 # Size # Based on empirical measurements, we estimate the size of the contact # using size = sqrt(area) * 28 + 0. touch.size.calibration = area touch.size.scale = 28 touch.size.bias = 0 touch.size.isSummed = 0 # Pressure # Driver reports signal strength as pressure. # # A normal index finger touch typically registers about 80 signal strength # units although we don't expect these values to be accurate. touch.pressure.calibration = amplitude touch.pressure.scale = 0.0125 # Orientation touch.orientation.calibration = vector
หมายเหตุเกี่ยวกับความเข้ากันได้
พร็อพเพอร์ตี้การกำหนดค่าสำหรับอุปกรณ์ระบบสัมผัสมีการเปลี่ยนแปลงอย่างมากใน Android Ice Cream Sandwich 4.0 ต้องอัปเดตไฟล์การกำหนดค่าอุปกรณ์อินพุตทั้งหมดสำหรับอุปกรณ์ระบบสัมผัสเพื่อใช้พร็อพเพอร์ตี้การกำหนดค่าใหม่
นอกจากนี้ คุณอาจต้องอัปเดตไดรเวอร์ของอุปกรณ์ระบบสัมผัสรุ่นเก่าด้วย
ไฟล์แมปแป้นเสมือน
อุปกรณ์ระบบสัมผัสสามารถใช้เพื่อใช้แป้นเสมือนได้
ซึ่งทำได้หลายวิธี โดยขึ้นอยู่กับความสามารถของตัวควบคุมระบบสัมผัส ตัวควบคุมการสัมผัสบางตัวสามารถกำหนดค่าได้โดยตรงเพื่อใช้แป้นซอฟต์คีย์โดยการตั้งค่ารีจิสเตอร์เฟิร์มแวร์ ในบางครั้ง คุณอาจต้องการทำการแมปจากพิกัดการสัมผัสไปยังคีย์โค้ดในซอฟต์แวร์
เมื่อใช้คีย์เสมือนในซอฟต์แวร์ เคอร์เนลต้องส่งออกไฟล์แมปคีย์เสมือนที่ชื่อ virtualkeys.<devicename> เป็นพร็อพเพอร์ตี้บอร์ด ตัวอย่างเช่น
หากไดรเวอร์อุปกรณ์หน้าจอสัมผัสรายงานชื่อเป็น "touchyfeely"
ไฟล์แผนที่คีย์เสมือนต้องมีเส้นทาง
/sys/board_properties/virtualkeys.touchyfeely
ไฟล์แผนที่แป้นเสมือนจะอธิบายพิกัดและรหัสแป้น Linux ของแป้นเสมือนบนหน้าจอสัมผัส
นอกจากไฟล์แมปแป้นเสมือนแล้ว จะต้องมีไฟล์เลย์เอาต์แป้นและไฟล์แมปอักขระแป้นที่เกี่ยวข้องเพื่อแมปรหัสแป้น Linux กับรหัสแป้น Android และระบุประเภทของอุปกรณ์แป้นพิมพ์ (โดยปกติคือ SPECIAL_FUNCTION)
ไวยากรณ์
ไฟล์แผนผังแป้นเสมือนคือไฟล์ข้อความธรรมดาที่ประกอบด้วยลำดับคำอธิบายเลย์เอาต์แป้นเสมือนที่คั่นด้วยการขึ้นบรรทัดใหม่หรือโคลอน
บรรทัดความคิดเห็นจะขึ้นต้นด้วย "#" และต่อเนื่องไปจนถึงท้ายบรรทัด
คีย์เสมือนแต่ละรายการจะอธิบายด้วยคอมโพเนนต์ที่คั่นด้วยโคลอน 6 รายการ ดังนี้
0x01: รหัสเวอร์ชัน ต้องเป็น0x01เสมอ- <Linux 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, centerY เป็น 835, ความกว้างเป็น 90 และความสูงเป็น 55
ตัวอย่าง
ไฟล์การแมปคีย์เสมือน: /sys/board_properties/virtualkeys.touchyfeely
0x01:158:55:835:90:55 0x01:139:172:835:125:55 0x01:102:298:835:115:55 0x01:217:412:835:95:55
ไฟล์เลย์เอาต์คีย์: /system/usr/keylayout/touchyfeely.kl
key 158 BACK key 139 MENU key 172 HOME key 217 SEARCH
ไฟล์การแมปอักขระคีย์: /system/usr/keychars/touchyfeely.kcm
type SPECIAL_FUNCTION
ท่าทางสัมผัสของตัวชี้แบบมัลติทัชทางอ้อม
ในโหมดตัวชี้ ระบบจะตีความท่าทางสัมผัสต่อไปนี้
- แตะด้วยนิ้วเดียว: คลิก
- การเคลื่อนไหวนิ้วเดียว: ย้ายตัวชี้
- การเคลื่อนไหวนิ้วเดียวพร้อมกับการกดปุ่ม: ลากตัวชี้
- การเคลื่อนไหวด้วย 2 นิ้วโดยที่ทั้ง 2 นิ้วเคลื่อนที่ไปในทิศทางเดียวกัน: ลากพื้นที่ใต้เคอร์เซอร์ไปในทิศทางนั้น ตัวชี้จะไม่ขยับ
- การเคลื่อนไหวด้วย 2 นิ้ว โดยนิ้วทั้ง 2 นิ้วเคลื่อนเข้าหากันหรือแยกออกจากกันในทิศทางต่างๆ: แพน/ปรับขนาด/หมุนพื้นที่รอบๆ ตัวชี้ ตัวชี้จะไม่ขยับ
- การเคลื่อนไหวหลายนิ้ว: ท่าทางสัมผัสแบบอิสระ
การปฏิเสธการสัมผัสจากฝ่ามือ
ตั้งแต่ Android 13 เป็นต้นไป ระบบจะปฏิเสธการป้อนข้อมูลจากฝ่ามือโดยอัตโนมัติเมื่อเปิดใช้เฟรมเวิร์กในตัว ระบบยังคงรองรับโซลูชันที่สร้างขึ้นเองภายในองค์กร แต่อาจต้องแก้ไขเพื่อแสดงแฟล็ก TOOL_TYPE_PALM เมื่อตรวจพบฝ่ามือ นอกจากนี้ เฟรมเวิร์กในตัวยังทำงานร่วมกับโซลูชันที่กำหนดเองได้ด้วย
โมเดลจริงจะดูข้อมูลท่าทางสัมผัส 90 มิลลิวินาทีแรก ดูตัวชี้ปัจจุบัน และดูตัวชี้โดยรอบ จากนั้นจะพิจารณาว่าการแตะอยู่ห่างจากขอบจอแสดงผลเท่าใด
จากนั้นจะพิจารณาตามตัวชี้แต่ละตัวว่าตัวชี้ใดเป็นฝ่ามือ นอกจากนี้ยังพิจารณาขนาดของรายชื่อติดต่อแต่ละรายตามที่รายงานโดย touchMajor และ touchMinor ด้วย จากนั้นเฟรมเวิร์ก Android จะนำตัวชี้ที่ทำเครื่องหมายเป็นฝ่ามือออกจากสตรีมการสัมผัส
หากมีการส่งพอยน์เตอร์ไปยังแอปแล้ว ระบบจะดำเนินการอย่างใดอย่างหนึ่งต่อไปนี้
- (หากมีตัวชี้อื่นๆ ที่ใช้งานอยู่) ยกเลิกตัวชี้ที่มีการตั้งค่า
ACTION_POINTER_UPและFLAG_CANCELED - (หากเป็นตัวชี้เพียงตัวเดียว) ยกเลิกตัวชี้ด้วย
ACTION_CANCEL
API สาธารณะ MotionEvent.FLAG_CANCELED บ่งชี้ว่าเหตุการณ์ปัจจุบันไม่ควรทริกเกอร์การดำเนินการของผู้ใช้ แฟล็กนี้ตั้งค่าไว้สำหรับทั้ง ACTION_CANCEL และ ACTION_POINTER_UP
หากไม่ได้ส่งตัวชี้ฝ่ามือไปยังแอป ระบบจะทิ้งตัวชี้ดังกล่าว
เปิดใช้การปฏิเสธฝ่ามือ
- ในไดรเวอร์ระบบสัมผัส ให้ใช้มาโคร
input_abs_set_resเพื่อตั้งค่าความละเอียดสำหรับช่องต่อไปนี้ (หน่วยเป็นพิกเซลต่อมิลลิเมตร)ABS_MT_POSITION_XABS_MT_POSITION_YABS_MT_TOUCH_MAJORABS_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