ไฟล์เลย์เอาต์คีย์ (ไฟล์ .kl
) แมปรหัสคีย์ Linux และรหัสแกนกับรหัสคีย์ Android และรหัสแกน และระบุแฟล็กนโยบายที่เกี่ยวข้อง ไฟล์เค้าโครงคีย์เฉพาะอุปกรณ์คือ:
- จำเป็น สำหรับอุปกรณ์อินพุตภายใน (ในตัว) ที่มีปุ่ม รวมถึงปุ่มพิเศษ เช่น ปุ่มปรับระดับเสียง เปิด/ปิด และปุ่มมีเดียของชุดหูฟัง
- เป็นทางเลือก สำหรับอุปกรณ์อินพุตอื่นๆ แต่ แนะนำ สำหรับแป้นพิมพ์และจอยสติ๊กสำหรับวัตถุประสงค์พิเศษ
หากไม่มีไฟล์เค้าโครงคีย์เฉพาะอุปกรณ์ ระบบจะเลือกค่าเริ่มต้นแทน
ที่ตั้ง
ไฟล์เลย์เอาต์คีย์จะอยู่ที่ผู้จำหน่าย USB, รหัสผลิตภัณฑ์ (และเวอร์ชันเสริม) หรือตามชื่ออุปกรณ์อินพุต พิจารณาเส้นทางต่อไปนี้ตามลำดับ:
-
/odm/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
-
/vendor/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
-
/system/usr/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
-
/data/system/devices/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl
-
/odm/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
-
/vendor/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
-
/system/usr/keylayout/Vendor_XXXX_Product_XXXX.kl
-
/data/system/devices/keylayout/Vendor_XXXX_Product_XXXX.kl
-
/odm/usr/keylayout/DEVICE_NAME.kl
-
/vendor/usr/keylayout/DEVICE_NAME.kl
-
/system/usr/keylayout/DEVICE_NAME.kl
-
/data/system/devices/keylayout/DEVICE_NAME.kl
-
/odm/usr/keylayout/Generic.kl
-
/vendor/usr/keylayout/Generic.kl
-
/system/usr/keylayout/Generic.kl
-
/data/system/devices/keylayout/Generic.kl
เมื่อสร้างเส้นทางไฟล์ที่มีชื่ออุปกรณ์ อักขระทั้งหมดในชื่ออุปกรณ์ที่ไม่ใช่ '0'-'9', 'a'-'z', 'A'-'Z', '-' หรือ '_' จะถูกแทนที่ด้วย '_'
ไฟล์เค้าโครงคีย์ทั่วไป
ระบบจัดเตรียมไฟล์โครงร่างคีย์ทั่วไปในตัวพิเศษที่เรียกว่า Generic.kl
เค้าโครงปุ่มนี้มีวัตถุประสงค์เพื่อรองรับแป้นพิมพ์ภายนอกและจอยสติ๊กมาตรฐานที่หลากหลาย อย่าแก้ไขเค้าโครงคีย์ทั่วไป!
ไวยากรณ์
ไฟล์เลย์เอาต์คีย์คือไฟล์ข้อความธรรมดาที่ประกอบด้วยการประกาศคีย์หรือแกนและแฟล็ก
ประกาศที่สำคัญ
การประกาศคีย์ประกอบด้วย key
คีย์เวิร์ดตามด้วยหมายเลขโค้ดคีย์ Linux และชื่อโค้ดคีย์ Android หรือการใช้คีย์เวิร์ดตามด้วยการใช้งาน HID และชื่อโค้ดคีย์ Android การใช้งาน HID จะแสดงเป็นจำนวนเต็ม 32 บิต โดยที่ 16 บิตสูงแสดงถึงหน้าการใช้งาน HID และ 16 บิตต่ำแสดงถึง ID การใช้งาน HID การประกาศอย่างใดอย่างหนึ่งสามารถตามด้วยชุดตัวเลือกของแฟล็กนโยบายที่คั่นด้วยช่องว่าง
key 1 ESCAPE key 114 VOLUME_DOWN key 16 Q VIRTUAL key usage 0x0c006F BRIGHTNESS_UP
ยอมรับแฟล็กนโยบายต่อไปนี้:
-
FUNCTION
: คีย์ควรตีความราวกับว่ามีการกดปุ่ม FUNCTION เช่นกัน -
GESTURE
: ปุ่มที่สร้างขึ้นโดยท่าทางของผู้ใช้ เช่น การฝ่ามือบนหน้าจอสัมผัส -
VIRTUAL
: ปุ่มคือปุ่มซอฟท์คีย์เสมือน (ปุ่ม capacitive) ที่อยู่ติดกับหน้าจอสัมผัสหลัก ซึ่งจะทำให้ตรรกะ debouncing พิเศษถูกเปิดใช้งาน (ดูด้านล่าง)
ประกาศแกน
การประกาศแกนแต่ละรายการประกอบด้วย axis
คำหลักตามด้วยหมายเลขรหัสแกน Linux และตัวระบุที่ควบคุมพฤติกรรมของแกน รวมถึงชื่อรหัสแกน Android อย่างน้อยหนึ่งชื่อ
แกนพื้นฐาน
แกนพื้นฐานเพียงแมปรหัสแกน Linux กับชื่อรหัสแกน Android การประกาศต่อไปนี้แมป ABS_X
(ระบุโดย 0x00
) กับ AXIS_X
(ระบุโดย X
)
axis 0x00 X
ในตัวอย่างข้างต้น หากค่าของ ABS_X
คือ 5
แสดงว่า AXIS_X
จะถูกตั้งค่าเป็น 5
แยกแกน
แกนแบบแยกจะจับคู่โค้ดแกน Linux กับชื่อโค้ดแกน Android สองชื่อ โดยที่ค่าที่น้อยกว่าหรือมากกว่าเกณฑ์จะถูกแบ่งออกเป็นสองแกนที่แตกต่างกันเมื่อทำการแมป การแมปนี้มีประโยชน์เมื่อแกนทางกายภาพเดี่ยวที่รายงานโดยอุปกรณ์เข้ารหัสแกนลอจิคัลที่ไม่เกิดร่วมกันสองแกนที่แตกต่างกัน
การประกาศต่อไปนี้แมปค่าของแกน ABS_Y
(ระบุด้วย 0x01
) กับ AXIS_GAS
เมื่อน้อยกว่า 0x7f
หรือกับ AXIS_BRAKE
เมื่อมากกว่า 0x7f
axis 0x01 split 0x7f GAS BRAKE
ในตัวอย่างข้างต้น หากค่าของ ABS_Y
คือ 0x7d
ดังนั้น AXIS_GAS
จะถูกตั้งค่าเป็น 2
( 0x7f - 0x7d
) และ AXIS_BRAKE
จะถูกตั้งค่าเป็น 0
ในทางกลับกัน หากค่าของ ABS_Y
คือ 0x83
ดังนั้น AXIS_GAS
จะถูกตั้งค่าเป็น 0
และ AXIS_BRAKE
จะถูกตั้งค่าเป็น 4
( 0x83 - 0x7f
) สุดท้ายนี้ หากค่าของ ABS_Y
เท่ากับค่าการแยกของ 0x7f
ดังนั้นทั้ง AXIS_GAS
และ AXIS_BRAKE
จะถูกตั้งค่าเป็น 0
แกนคว่ำ
แกนกลับจะกลับเครื่องหมายของค่าแกน การประกาศต่อไปนี้แมป ABS_RZ
(ระบุโดย 0x05
) ไปยัง AXIS_BRAKE
(ระบุโดย BRAKE
) และกลับเอาต์พุตโดยการปฏิเสธ
axis 0x05 invert BRAKE
ในตัวอย่างข้างต้น หากค่าของ ABS_RZ
คือ 2
แสดงว่า AXIS_BRAKE
จะถูกตั้งค่าเป็น -2
ตัวเลือกตรงกลางแบน
อุปกรณ์จอยสติ๊กอาจรายงานเหตุการณ์อินพุตแม้ว่าจะไม่ได้ใช้งานจอยสติ๊กเนื่องจากเสียงรบกวน โดยทั่วไปเสียงรบกวนนี้มาจากแท่งด้านซ้ายและ/หรือด้านขวา และทำให้ผู้ขับขี่รายงานค่าตำแหน่งใกล้ 0 ค่า "ระนาบกึ่งกลาง" ระบุปริมาณเสียงรบกวนที่คาดหวังจากตัวควบคุมในขณะอยู่นิ่ง
โปรโตคอลอินพุต Linux มีวิธีสำหรับไดรเวอร์อุปกรณ์อินพุตเพื่อระบุค่ากึ่งกลางของแกนจอยสติ๊ก แต่ไม่ใช่ไดรเวอร์ทั้งหมดที่จะรายงานและบางส่วนจะให้ค่าที่ไม่ถูกต้อง เพื่อแก้ไขปัญหานี้ การประกาศแกนอาจตามด้วยตัวเลือก flat
ที่ระบุความกว้างของพื้นที่รอบตำแหน่งกึ่งกลางของแกนที่ควรพิจารณาว่าเป็นศูนย์กลาง
ตัวอย่างเช่น หากไดรเวอร์อุปกรณ์รายงานค่าสำหรับ AXIS_X
ระหว่าง 0 ถึง 100 ดังนั้น 0 จะถูกแมปกับ -1 และ 100 จะถูกแมปกับ 1 โดยระบบอินพุต Android จุดศูนย์กลางของช่วงจะเป็น 50 ในพิกัดที่ไม่ได้ปรับขนาด และ 0 ในพิกัดที่ปรับขนาด หากค่าคงที่เท่ากับ 10 นักพัฒนาควรถือว่าค่า AXIS_X
ใดๆ ที่รายงานระหว่าง -0.1 ถึง 0.1 (ระหว่าง 40 ถึง 60 ในพิกัดที่ไม่ได้ปรับขนาด) เป็นสัญญาณรบกวน และถือว่าค่าเหล่านั้นที่มาจากจอยสติ๊กเป็นศูนย์
หมายเหตุ : แม้ว่าไฟล์เลย์เอาต์คีย์จะระบุค่าสำหรับพื้นที่พิกัดของไดรเวอร์ แต่ค่าที่รายงานโดย android.view.InputDevice.MotionRange#getFlat() จะอยู่ในพื้นที่พิกัด Android
axis 0x03 Z flat 4096
ในตัวอย่างข้างต้น ค่าคงที่ตรงกลางถูกตั้งค่าเป็น 4096
ความคิดเห็น
บรรทัดความคิดเห็นเริ่มต้นด้วย # และไปต่อที่ท้ายบรรทัด:
# A comment!
บรรทัดว่างจะถูกละเว้น
ตัวอย่าง
คีย์บอร์ด
# This is an example of a key layout file for a keyboard. key 1 ESCAPE key 2 1 key 3 2 key 4 3 key 5 4 key 6 5 key 7 6 key 8 7 key 9 8 key 10 9 key 11 0 key 12 MINUS key 13 EQUALS key 14 DEL # etc...
การควบคุมระบบ
# This is an example of a key layout file for basic system controls, # such as volume and power keys which are typically implemented as GPIO pins # the device decodes into key presses. key 114 VOLUME_DOWN key 115 VOLUME_UP key 116 POWER
ปุ่มแบบคาปาซิทีฟ
# This is an example of a key layout file for a touch device with capacitive buttons. key 139 MENU VIRTUAL key 172 HOME VIRTUAL key 158 BACK VIRTUAL key 217 SEARCH VIRTUAL
การควบคุมสื่อของแจ็คชุดหูฟัง
# This is an example of a key layout file for headset mounted media controls. # A typical headset jack interface might have special control wires or detect known # resistive loads as corresponding to media functions or volume controls. # This file assumes that the driver decodes these signals and reports media # controls as key presses. key 163 MEDIA_NEXT key 165 MEDIA_PREVIOUS key 226 HEADSETHOOK
จอยสติ๊ก
# This is an example of a key layout file for a joystick. # These are the buttons that the joystick supports, represented as keys. key 304 BUTTON_A key 305 BUTTON_B key 307 BUTTON_X key 308 BUTTON_Y key 310 BUTTON_L1 key 311 BUTTON_R1 key 314 BUTTON_SELECT key 315 BUTTON_START key 316 BUTTON_MODE key 317 BUTTON_THUMBL key 318 BUTTON_THUMBR # Left and right stick. # The reported value for flat is 128 in a range of -32767 to 32768, which is absurd. # This confuses applications that rely on the flat value because the joystick # actually settles in a flat range of +/- 4096 or so. We override it here. axis 0x00 X flat 4096 axis 0x01 Y flat 4096 axis 0x03 Z flat 4096 axis 0x04 RZ flat 4096 # Triggers. axis 0x02 LTRIGGER axis 0x05 RTRIGGER # Hat. axis 0x10 HAT_X axis 0x11 HAT_Y
ซอฟต์คีย์เสมือน
ระบบอินพุตมีคุณสมบัติพิเศษสำหรับการนำซอฟต์คีย์เสมือนไปใช้ในกรณีการใช้งานต่อไปนี้:
- หากซอฟต์คีย์เสมือนแสดงเป็นกราฟิกบนหน้าจอ (เช่นบน Galaxy Nexus) ปุ่มเหล่านั้นจะถูกนำไปใช้โดยส่วนประกอบแถบการนำทางในแพ็คเกจ System UI เนื่องจากมีการนำซอฟต์คีย์เสมือนแบบกราฟิกไปใช้ที่เลเยอร์สูงในระบบ ไฟล์โครงร่างคีย์จึงไม่เกี่ยวข้อง และไม่มีข้อมูลต่อไปนี้
- หากมีการใช้ซอฟต์คีย์เสมือนเป็นพื้นที่สัมผัสแบบขยายที่เป็นส่วนหนึ่งของหน้าจอสัมผัสหลัก (เช่น บน Nexus One) ระบบอินพุตจะใช้ไฟล์แมปคีย์เสมือนเพื่อแปลพิกัดการสัมผัส X/Y เป็นโค้ดคีย์ Linux จากนั้นใช้ไฟล์เค้าโครงคีย์เพื่อแปลรหัสคีย์ Linux เป็นรหัสคีย์ Android (สำหรับรายละเอียดเกี่ยวกับไฟล์แมปคีย์เสมือน โปรดดู อุปกรณ์ระบบสัมผัส ) ไฟล์เลย์เอาต์คีย์สำหรับอุปกรณ์อินพุตหน้าจอสัมผัสจะต้องระบุการจับคู่คีย์ที่เหมาะสมและรวมแฟล็ก
VIRTUAL
สำหรับแต่ละคีย์ - หากมีการใช้ซอฟต์คีย์เสมือนเป็นปุ่มคาปาซิทีฟที่แยกจากหน้าจอสัมผัสหลัก (เช่น บน Nexus S) ไดรเวอร์อุปกรณ์เคอร์เนลหรือเฟิร์มแวร์จะรับผิดชอบในการแปลการสัมผัสเป็นรหัสคีย์ Linux ซึ่งระบบอินพุตจะแปลเป็นรหัสคีย์ Android โดยใช้ไฟล์เค้าโครงคีย์ ไฟล์เลย์เอาต์คีย์สำหรับอุปกรณ์อินพุตปุ่ม capacitive จะต้องระบุการแมปคีย์ที่เหมาะสมและรวมแฟล็ก
VIRTUAL
สำหรับแต่ละคีย์
เมื่อซอฟต์คีย์เสมือนอยู่ภายในหรือใกล้กับหน้าจอสัมผัส ผู้ใช้จะกดปุ่มโดยไม่ตั้งใจได้อย่างง่ายดายเมื่อสัมผัสใกล้ด้านล่างของหน้าจอ หรือเมื่อเลื่อนนิ้วจากบนลงล่างหรือจากล่างขึ้นบน บนหน้าจอ เพื่อป้องกันสิ่งนี้ ระบบอินพุตจะใช้การดีเด้งเล็กน้อย โดยที่การกดซอฟต์คีย์เสมือนจะถูกละเว้นในช่วงเวลาสั้นๆ หลังจากการสัมผัสครั้งล่าสุดบนหน้าจอสัมผัส (การหน่วงเวลานี้เรียกว่า เวลาเงียบของปุ่มเสมือน )
หากต้องการเปิดใช้งานการดีเด้งปุ่มซอฟท์คีย์เสมือน:
- จัดเตรียมไฟล์เค้าโครงคีย์สำหรับหน้าจอสัมผัสหรืออุปกรณ์อินพุตปุ่ม capacitive พร้อมการตั้งค่าสถานะ
VIRTUAL
สำหรับแต่ละคีย์key 139 MENU VIRTUAL key 172 HOME VIRTUAL key 158 BACK VIRTUAL key 217 SEARCH VIRTUAL
- ตั้งค่าของเวลาเงียบของคีย์เสมือนในการซ้อนทับทรัพยากรสำหรับรีซอร์สเฟรมเวิร์ก
config.xml
<!-- Specifies the amount of time to disable virtual keys after the screen is touched to filter out accidental virtual key presses due to swiping gestures or taps near the edge of the display. May be 0 to disable the feature. It is recommended that this value be no more than 250 ms. This feature should be disabled for most devices. --> <integer name="config_virtualKeyQuietTimeMillis">250</integer>
การตรวจสอบ
คุณควรตรวจสอบไฟล์เลย์เอาต์คีย์ของคุณโดยใช้เครื่องมือ Validate Keymaps