ไฟล์เค้าโครงคีย์

ไฟล์เลย์เอาต์คีย์ (ไฟล์ .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

ซอฟต์คีย์เสมือน

ระบบอินพุตมีคุณสมบัติพิเศษสำหรับการนำซอฟต์คีย์เสมือนไปใช้ในกรณีการใช้งานต่อไปนี้:

  1. หากซอฟต์คีย์เสมือนแสดงเป็นกราฟิกบนหน้าจอ (เช่นบน Galaxy Nexus) ปุ่มเหล่านั้นจะถูกนำไปใช้โดยส่วนประกอบแถบการนำทางในแพ็คเกจ System UI เนื่องจากมีการนำซอฟต์คีย์เสมือนแบบกราฟิกไปใช้ที่เลเยอร์สูงในระบบ ไฟล์โครงร่างคีย์จึงไม่เกี่ยวข้อง และไม่มีข้อมูลต่อไปนี้
  2. หากมีการใช้ซอฟต์คีย์เสมือนเป็นพื้นที่สัมผัสแบบขยายที่เป็นส่วนหนึ่งของหน้าจอสัมผัสหลัก (เช่น บน Nexus One) ระบบอินพุตจะใช้ไฟล์แมปคีย์เสมือนเพื่อแปลพิกัดการสัมผัส X/Y เป็นโค้ดคีย์ Linux จากนั้นใช้ไฟล์เค้าโครงคีย์เพื่อแปลรหัสคีย์ Linux เป็นรหัสคีย์ Android (สำหรับรายละเอียดเกี่ยวกับไฟล์แมปคีย์เสมือน โปรดดู อุปกรณ์ระบบสัมผัส ) ไฟล์เลย์เอาต์คีย์สำหรับอุปกรณ์อินพุตหน้าจอสัมผัสจะต้องระบุการจับคู่คีย์ที่เหมาะสมและรวมแฟล็ก VIRTUAL สำหรับแต่ละคีย์
  3. หากมีการใช้ซอฟต์คีย์เสมือนเป็นปุ่มคาปาซิทีฟที่แยกจากหน้าจอสัมผัสหลัก (เช่น บน Nexus S) ไดรเวอร์อุปกรณ์เคอร์เนลหรือเฟิร์มแวร์จะรับผิดชอบในการแปลการสัมผัสเป็นรหัสคีย์ Linux ซึ่งระบบอินพุตจะแปลเป็นรหัสคีย์ Android โดยใช้ไฟล์เค้าโครงคีย์ ไฟล์เลย์เอาต์คีย์สำหรับอุปกรณ์อินพุตปุ่ม capacitive จะต้องระบุการแมปคีย์ที่เหมาะสมและรวมแฟล็ก VIRTUAL สำหรับแต่ละคีย์

เมื่อซอฟต์คีย์เสมือนอยู่ภายในหรือใกล้กับหน้าจอสัมผัส ผู้ใช้จะกดปุ่มโดยไม่ตั้งใจได้อย่างง่ายดายเมื่อสัมผัสใกล้ด้านล่างของหน้าจอ หรือเมื่อเลื่อนนิ้วจากบนลงล่างหรือจากล่างขึ้นบน บนหน้าจอ เพื่อป้องกันสิ่งนี้ ระบบอินพุตจะใช้การดีเด้งเล็กน้อย โดยที่การกดซอฟต์คีย์เสมือนจะถูกละเว้นในช่วงเวลาสั้นๆ หลังจากการสัมผัสครั้งล่าสุดบนหน้าจอสัมผัส (การหน่วงเวลานี้เรียกว่า เวลาเงียบของปุ่มเสมือน )

หากต้องการเปิดใช้งานการดีเด้งปุ่มซอฟท์คีย์เสมือน:

  1. จัดเตรียมไฟล์เค้าโครงคีย์สำหรับหน้าจอสัมผัสหรืออุปกรณ์อินพุตปุ่ม capacitive พร้อมการตั้งค่าสถานะ VIRTUAL สำหรับแต่ละคีย์
    key 139    MENU           VIRTUAL
    key 172    HOME           VIRTUAL
    key 158    BACK           VIRTUAL
    key 217    SEARCH         VIRTUAL
    
  2. ตั้งค่าของเวลาเงียบของคีย์เสมือนในการซ้อนทับทรัพยากรสำหรับรีซอร์สเฟรมเวิร์ก 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