Файлы раскладки клавиатуры (файлы .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, или ключевого слова usage, за которым следует код использования HID и кодовое название ключа Android. Использование HID представлено в виде 32-битного целого числа, где старшие 16 бит представляют страницу использования HID, а младшие 16 бит – идентификатор использования HID. После каждой декларации можно указать набор флагов правил, разделенных пробелами.
key 1 ESCAPE key 114 VOLUME_DOWN key 16 Q VIRTUAL key usage 0x0c006F BRIGHTNESS_UP
Распознаются следующие флаги правил:
FUNCTION– клавиша должна интерпретироваться так, как если бы также была нажата функциональная клавиша.GESTURE: ключ, созданный с помощью жеста пользователя, например прикосновения к сенсорному экрану.VIRTUAL– ключ является виртуальной сенсорной кнопкой (емкостной кнопкой), расположенной рядом с основным сенсорным экраном. В этом случае включается специальная логика устранения дребезга (см. ниже).
Декларации осей
Каждое объявление оси состоит из ключевого слова 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.
Единая ставка по центру
Джойстик может сообщать о событиях ввода, даже если он не используется, из-за помех. Обычно шум исходит от левого и/или правого стика и приводит к тому, что драйвер сообщает о положении, близком к нулю. Значение "center flat" указывает, какой уровень шума можно ожидать от контроллера в состоянии покоя.
Протокол ввода Linux позволяет драйверам устройств ввода указывать плоское центральное значение осей джойстика, но не все драйверы сообщают его, а некоторые предоставляют неверные значения. Чтобы устранить эту проблему, после объявления оси можно добавить параметр flat, который задает ширину области вокруг центральной позиции оси, которая должна считаться центрированной.
Например, если драйвер устройства сообщает значения для AXIS_X от 0 до 100, то система ввода Android сопоставит 0 с -1, а 100 – с 1.
Центр диапазона будет иметь координаты 50 в исходном масштабе и 0 в масштабированном.
Если плоское значение равно 10, разработчики должны считать, что любое значение AXIS_X, зарегистрированное в диапазоне от -0,1 до 0,1 (от 40 до 60 в нескорректированных координатах), является шумом, и рассматривать эти значения, поступающие от джойстика, как нулевые.
Примечание. В файле раскладки клавиатуры указывается значение для системы координат драйвера, а значение, возвращаемое методом android.view.InputDevice.MotionRange#getFlat(), относится к системе координат Android.
axis 0x03 Z flat 4096
В примере выше значение center flat равно 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), они реализуются компонентом панели навигации в пакете интерфейса системы. Поскольку графические виртуальные клавиши реализованы на высоком уровне системы, файлы раскладки клавиш не используются, и приведенная ниже информация не применяется.
- Если виртуальные клавиши реализованы как расширенная сенсорная область, которая является частью основного сенсорного экрана (например, на Nexus One), система ввода использует файл виртуальной карты клавиш, чтобы преобразовать координаты X/Y в коды клавиш Linux, а затем использует файл раскладки клавиш, чтобы преобразовать коды клавиш Linux в коды клавиш Android. Подробнее о файлах виртуальной карты клавиш можно узнать в разделе Сенсорные устройства. В файле раскладки клавиатуры для устройства ввода с сенсорным экраном необходимо указать правильное сопоставление клавиш и добавить флаг
VIRTUALдля каждой клавиши. - Если виртуальные программные клавиши реализованы в виде емкостных кнопок, отдельных от основного сенсорного экрана (например, на Nexus S), драйвер устройства ядра или встроенное ПО отвечает за преобразование касаний в коды клавиш Linux, которые система ввода затем преобразует в коды клавиш Android с помощью файл раскладки клавиатуры.
В файле раскладки клавиш для устройства ввода с емкостными кнопками должно быть указано соответствующее сопоставление клавиш и флаг
VIRTUALдля каждой клавиши.
Если виртуальные программные клавиши расположены на сенсорном экране или в непосредственной близости от него, пользователи могут случайно нажать кнопку, когда касаются нижней части экрана или проводят пальцем сверху вниз или снизу вверх. Чтобы этого не происходило, система ввода применяет небольшую задержку, в течение которой виртуальные нажатия игнорируются после последнего касания сенсорного экрана (этот период называется временем бездействия виртуальных клавиш).
Чтобы включить устранение дребезга виртуальных клавиш:
- Укажите файл раскладки клавиатуры для устройства ввода с сенсорным экраном или емкостной кнопкой, задав для каждой клавиши флаг
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 (Проверка раскладки клавиатуры).