ไฟล์เลย์เอาต์คีย์

ไฟล์เลย์เอาต์คีย์ (ไฟล์ .kl) จะแมปรหัสคีย์และรหัสแกน X/Y ของ Linux กับรหัสคีย์และรหัสแกน X/Y ของ Android รวมถึงระบุ Flag นโยบายที่เกี่ยวข้อง ไฟล์รูปแบบแป้นเฉพาะอุปกรณ์มีดังนี้

  • ต้องระบุสำหรับอุปกรณ์อินพุตภายใน (ในตัว) ที่มีปุ่ม ซึ่งรวมถึงปุ่มพิเศษ เช่น ปุ่มปรับระดับเสียง ปุ่มเปิด/ปิด และปุ่มสื่อของชุดหูฟัง
  • ไม่บังคับสำหรับอุปกรณ์อินพุตอื่นๆ แต่แนะนำสำหรับแป้นพิมพ์และจอยสติ๊กที่มีไว้เพื่อวัตถุประสงค์พิเศษ

หากไม่มีไฟล์เลย์เอาต์แป้นเฉพาะอุปกรณ์ ระบบจะเลือกค่าเริ่มต้นแทน

ตำแหน่ง

ไฟล์เลย์เอาต์คีย์จะอยู่ที่รหัสผู้ให้บริการ 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 เลย์เอาต์แป้นพิมพ์นี้มีไว้เพื่อรองรับแป้นพิมพ์และจอยสติ๊กภายนอกมาตรฐานที่หลากหลาย อย่าแก้ไขเลย์เอาต์คีย์ทั่วไป

วากยสัมพันธ์

ไฟล์เลย์เอาต์คีย์คือไฟล์ข้อความธรรมดาที่ประกอบด้วยการประกาศคีย์หรือแกน และ Flag

การประกาศคีย์

การประกาศคีย์ประกอบด้วยคีย์เวิร์ด key ตามด้วยหมายเลขรหัสคีย์ Linux และชื่อรหัสคีย์ Android หรือการใช้งานคีย์เวิร์ดตามด้วยการใช้งาน HID และชื่อรหัสคีย์ Android การใช้งาน HID จะแสดงเป็นจำนวนเต็ม 32 บิต โดยที่ 16 บิตบนสุดแสดงหน้าการใช้งาน HID และ 16 บิตล่างสุดแสดงรหัสการใช้งาน HID ประกาศทั้ง 2 รายการตามด้วยชุด Flag นโยบายที่คั่นด้วยเว้นวรรค (ไม่บังคับ)

key 1     ESCAPE
key 114   VOLUME_DOWN
key 16    Q                 VIRTUAL
key usage 0x0c006F          BRIGHTNESS_UP

ระบบจะจดจำ Flag นโยบายต่อไปนี้

  • FUNCTION: ระบบควรตีความแป้นนี้เหมือนกับว่ามีการกดแป้น FUNCTION ด้วย
  • GESTURE: คีย์ที่สร้างขึ้นจากท่าทางของผู้ใช้ เช่น การสัมผัสหน้าจอด้วยฝ่ามือ
  • VIRTUAL: ปุ่มนี้เป็นปุ่มเสมือน (ปุ่มแบบ Capacitive) ที่อยู่ติดกับหน้าจอสัมผัสหลัก ซึ่งจะเปิดใช้ตรรกะการลบล้างพิเศษ (ดูด้านล่าง)

การประกาศแกน

การประกาศแกนแต่ละรายการประกอบด้วยคีย์เวิร์ด axis ตามด้วยหมายเลขโค้ดแกน Linux และตัวระบุที่ควบคุมลักษณะการทํางานของแกน รวมถึงชื่อโค้ดแกน Android อย่างน้อย 1 รายการ

แกนพื้นฐาน

แกนพื้นฐานจะแมปโค้ดแกน Linux กับชื่อโค้ดแกน Android เท่านั้น การประกาศต่อไปนี้จะแมป ABS_X (ระบุด้วย 0x00) กับ AXIS_X (ระบุด้วย X)

axis 0x00 X

ในตัวอย่างข้างต้น หากค่าของ ABS_X คือ 5 ระบบจะตั้งค่า AXIS_X เป็น 5

แกนที่แยก

แกนแยกจะแมปรหัสแกน Linux กับชื่อรหัสแกน Android 2 รายการ เช่น ระบบจะแยกค่าที่น้อยกว่าหรือมากกว่าเกณฑ์ออกเป็น 2 แกนเมื่อมีการแมป การแมปนี้มีประโยชน์เมื่อแกนทางกายภาพเดียวที่อุปกรณ์รายงานเข้ารหัสแกนตรรกะ 2 แกนที่แตกต่างกันซึ่งไม่เกี่ยวข้องกัน

การประกาศต่อไปนี้จะจับคู่ค่าของแกน 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 ค่า "center flat" จะระบุปริมาณสัญญาณรบกวนที่คาดหวังจากตัวควบคุมขณะหยุดนิ่ง

โปรโตคอลอินพุตของ Linux มีวิธีให้ไดรเวอร์อุปกรณ์อินพุตระบุค่าศูนย์ของแกนโยก แต่ไดรเวอร์บางตัวไม่ได้รายงานค่านี้และบางตัวให้ค่าที่ไม่ถูกต้อง หากต้องการแก้ไขปัญหานี้ ให้ตามประกาศแกนด้วยตัวเลือก flat ที่ระบุความกว้างของภูมิภาครอบตำแหน่งกลางของแกนซึ่งควรถือว่าอยู่ตรงกลาง

ตัวอย่างเช่น หากโปรแกรมควบคุมอุปกรณ์รายงานค่า AXIS_X ระหว่าง 0 ถึง 100 ระบบอินพุตของ Android จะแมป 0 เป็น -1 และ 100 เป็น 1 ค่ากลางของช่วงจะเป็น 50 ในพิกัดที่ไม่ได้ปรับขนาดและ 0 ในพิกัดที่ปรับขนาด หากค่า Flat เท่ากับ 10 นักพัฒนาแอปควรถือว่าค่า AXIS_X ที่รายงานระหว่าง -0.1 ถึง 0.1 (ระหว่าง 40 ถึง 60 ในพิกัดที่ไม่ได้ปรับขนาด) เป็นสัญญาณรบกวน และถือว่าค่าเหล่านั้นที่มาจากจอยสติ๊กเป็น 0

หมายเหตุ: แม้ว่าไฟล์เลย์เอาต์คีย์จะระบุค่าสำหรับพื้นที่พิกัดของไดรเวอร์ แต่ค่าที่ 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

Joystick

# 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

ปุ่มเสมือน

ระบบการป้อนข้อมูลมีฟีเจอร์พิเศษสำหรับการใช้ปุ่มเสมือนใน Use Case ต่อไปนี้

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

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

วิธีเปิดใช้การกรองสัญญาณรบกวนบนแป้นพิมพ์เสมือน

  1. ระบุไฟล์เลย์เอาต์แป้นสำหรับอุปกรณ์อินพุตแบบหน้าจอสัมผัสหรือปุ่มแบบ Capacitive โดยตั้งค่า Flag 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>
    

การตรวจสอบความถูกต้อง

คุณควรตรวจสอบไฟล์เลย์เอาต์แป้นพิมพ์โดยใช้เครื่องมือตรวจสอบ Keymap