logo Jbak keyboard - cоздание своей клавиатуры

Большинство пользователей на клавиатуре устраивает почти всё, процентов на 99. Буквы есть, текст набирает, что еще надо? Но оставшийся один процент постоянно даёт о себе знать. Кому-то не нравится голосовой ввод на кнопке переключения языков. Кого-то раздражает кнопка закрытия клавиатуры - "всё равно закрыть можно нажатием back - так зачем эта кнопка?" А кому-то вообще нужно отдельной кнопкой символ копирайта.
Есть и другие пользователи, которым в корне не нравится вся клавиатура. Вот взять бы да поставить вместо неё другую...

Сделать всё это в настройках нереально, слишком много будет настроек. Но есть другой путь - создание собственной клавиатуры. Можно отредактировать существующую раскладку, а можно создать свою, полностью с нуля. И даже добавить в программу язык, которого там нету.

Вот встроенные в программу клавиатуры. Человеку, знакомому с форматом xml, уже после первого просмотра станет многое понятно:

Встроенные клавиатуры Jbak keyboard, 17 Kb
Все встроенные клавиатуры в формате xml

А вот клавиатура от Али Гамидова, изображённая на скриншоте справа. Инструкция по установке - внутри архива:

Клавиатура от Али Гамидова, 8 Kb
Русская раскладка, клавиатура для смайликов и скин opera

Файлы клавиатур выкладываются в папку /mnt/sdcard/jbakKeyboard/keyboards/ .

Далее клавиатуру необходимо выбрать в настройках.

Чтобы попасть в настройки программы - открываем системные настройки, Языки и клавиатуры -> Настройки Jbak Keyboard. Либо удерживаем клавишу 123 на клавиатуре.

В окне настроек программы выбираем Языки и клавиатуры, нажимаем кнопку с клавиатурой напротив нужного языка. Пролистываем список клавиатур, на нужной нажимаем кнопку "Сохранить".

Название файла клавиатуры

Название файла клавиатуры начинается с двухбуквенного кода языка, после него следует подчёркивание. Например,
ru_Wide keys.xml - клавиатура Wide keys для русского языка
en_5 rows with numbers.xml - клавиатура 5 rows with numbers для английского языка
Коды всех языков мира можно узнать по ссылке: http://ru.wikipedia.org/wiki/Коды_языков

Вместо кода языка может быть одно из значений:

  • symbol - клавиатура для набора символов (запускается по нажатию кнопки 123 с основной клавиатуры)
  • symbol2 - дополнительная клавиатура для набора символов (запускается по нажатию клавиши Shift на символьной клавиатуре)
  • edittext - клавиатура для редактирования текста (запускается по удержанию клавиши Shift на основной клавиатуре)
  • smile - клавиатура для ввода смайликов (запускается по удержанию клавиши Enter)
  • num - числовая клавиатура, которая открывается в полях ввода телефонных номеров или числовых значений

Расширение файла - .xml . Файл обязательно должен быть в кодировке UTF-8

Формат файла клавиатуры

По правилам языка XML, внутри аттрибутов вместо некоторых символов необходимо писать особые значения:
& - &
< - &lt;
> - &gt;
' - &apos;
" - &quot;
Если клавиатура не загружается - проверьте, нет ли в каком-то аттрибуте одного из этих символов.

Аттрибуты android:keyWidth и android:horizontalGap рекомендуется задавать в процентах от общей ширины экрана.
Например, android:keyWidth="10%p" - задаст ширину клавиши в 10 %
Можно и в пикселях, например 10px , но этот размер не будет масштабироваться в зависимости от разрешения экрана

<Keyboard тэг содержит значения для всей клавиатуры
xmlns:android="http://schemas.android.com/apk/res/android" - это должно быть обязательно и именно в таком виде
   android:horizontalGap - отступ клавиш от левого края клавиатуры (в пикселях и в процентах)
   android:verticalGap - отступ клавиш от верха клавиатуры
   android:keyWidth - ширина клавиши по умолчанию (для тех клавиш, у которых не задан свой аттрибут android:keyWidth
>

    <Row Строка клавиатуры. Внутри тэга содержатся клавиши, относящиеся к данной строке

  • android:keyHeight="80%p"
    высота строки клавиш. Задается в процентах от высоты, заданой пользователем. Если не задано - 100%

    >

      <Key Отдельная клавиша. Список всех возможных атрибутов:

  • android:keyLabel="1\nq"
    текстовая метка для клавиши в виде "текст_для_ввода_по_долгому_нажатию|разделитель \n|основной_текст". Если разделителя \n нет - то содержимое метки будет показано как основной текст клавиатуры. Символ \ (обратный слэш) необходимо дублировать. Также некоторые символы вводятся по правилам xml (например &amp; - для &) Есть несколько специальных значений: d_vr - голосовой ввод, tab - табуляция, opt - запуск основного меню клавиатуры
  • android:codes="32"
    Код клавиши. Для буквенных клавиш не требуется. Содержит код символа для ввода в кодировке UNICODE или один из управляющих кодов (см. раздел Коды клавиш). Также может содержать несколько буквенных кодов, через запятую. Тогда при коротких нажатиях клавиш происходит перебор между указанными кодами Например, android:codes="1081,1082,1083" - перебирает буквы й,к,л.
  • android:keyIcon
    Иконка клавиши. Подробно в разделе Иконки клавиш
  • android:keyWidth="32%p"
    Ширина клавиши в процентах от ширины экрана. Может быть дробным значением, например "12.5%p". Если общая ширина клавиш в пределах тэга Row больше 100% - клавиши вылезут за пределы экрана.
  • android:horizontalGap
    Отступ клавиши от левого края экрана или от предыдущей клавиши Если не задан - оступ нулевой
  • android:isSticky
    Если значение "true" - клавиша имеет 2 положения, нажата и отпущена. В нажатом положении на клавише появляется зеленый кружок Нужно для клавиш Shift и Select, для остальных не имеет смысла
  • android:isRepeatable
    Если значение "true" - при удержании клавиши ввод повторяется. Используется для клавиш пробел, backspace и курсорных стрелок.
  • android:isModifier
    "true" - для клавиши Shift. Других модификаторов пока нету
  • android:popupCharacters
    Строка, содержащая набор символов. Если задана - по удержанию клавиши выводится маленькая клавиатура, позволяющая ввести каждый из указанных символов
  • android:longCode
    Код, выполняющийся по удержанию клавиши Содержит код символа для ввода в кодировке UNICODE или один из управляющих кодов (см. раздел Коды клавиш)
  • android:noColor
    Если "true" - изображение на клавише не окрашивается в цвет текста и используется как есть. Имеет смысл только для клавиш с аттрибутом keyIcon
  • android:specKey
    Имеет смысл в скинах, где функциональные клавиши отличаются оформлением от буквенных. "true" - клавиша рисуется с оформлением функциональных клавиш (как например клавиша Shift), "false" - со стандартным оформлением Если при текущем скине все клавиши рисуются с одинаковым фоном - этот атрибут игнорируется. Если не задан - программа сама выбирает нужный фон.
  • android:goQwerty
    Имеет смысл только на дополнительных клавиатурах. "true" - после нажатия клавиши происходит возврат на основную qwerty-клавиатуру. "false" - после нажатия клавиши остаемся на дополнительной клавиатуре
  • android:smallLabel
    Позволяет вывести основной текст на клавиатуре тем же шрифтом, которым выводятся дополнительные символы. Костыль для длинных текстов

      />

      <Key ... />
       <Key ... />
  </Row>
  <Row ...>
  <Replace from="11" to=":)"/> Если пользователь ввел текст, записанный в from - его принудительно меняет на текст, записанный в to. Работает с учетом регистра. Таких тегов может быть неограниченое количество
</Keyboard>

Коды клавиш

Для буквенных клавиш используются коды символов в кодировке unicode. Коды могут быть записаны как в десятичной, так и в шестнадцатеричной системе (в этом случае число начинается c 0x или #) Например, русская буква 'а' может быть записана как 1072 или 0x430.

Клавиши управления курсором:

19 - вверх
20 - вниз
21 - влево
22 - вправо
-303 - переход в начало всего текста
-304 - переход в конец всего текста
-305 - Home (переход в начало абзаца)
-306 - End (переход в конец абзаца)
-310 - Select - включает/выключает выделение текста

Текстовые команды:

-320 - Copy (копирует выбранный текст)
-321 - Paste (вставляет текст из буфера обмена)
-322 - Cut (копирует выбранный текст в буфер обмена и удаляет его)
-323 - Select All (выделяет весь текст в поле ввода)
-324 - Копировать весь текст в текущем поле ввода

Qwerty - клавиатура:

32 - клавиша пробел
10 - клавиша Enter
-1 - клавиша Shift
-5 - клавиша Baсkspace
-2 - код клавиши для вызова символьной клавиатуры (123) или возврата на qwerty (ABC)
-3 - код клавиши, закрывающей клавиатуру
-20 - переключение языка ввода. Если активных языков более 3 - показывается меню языков
-21 - показ меню языков - независимо от количества активных
-22 - переключение на предыдущий активный язык
-23 - переключение на следующий активный язык
-24 - показ клавиатуры смайликов или таблицы смайликов, в зависимости от настроек
-25 - показ клавиатуры редактирования
-27 - показ таблицы символов, независимо от настроек
-28 - показ таблицы смайлов, независимо от настроек

Внутренние коды:

-500 - запуск главного меню
-501 - голосовой ввод
-502 - запуск шаблонов
-503 - запуск настроек программы
-504 - запуск буфера обмена
-505 - диалог создания папки шаблонов
-506 - диалог создания шаблона
-508 - запуск настройки внешнего вида текущей клавиатуры
-509 - запуск собственного голосового ввода, независимо от настройки
-510 - запуск голосового ввода Google IME, независимо от настройки

Нажатие клавиш:

Если нужно отправить нажатие и отпускание клавиши - код задается по формуле 0-(1000+кейкод_клавиши).
Например, удаление символа после курсора выполняется клавишей с кейкодом 112 (KEYCODE_FORWARD_DEL). Значит нужно задать android:codes="-1112" .
Для нажатия клавиши F1 - отправляем кейкод 131 с помощью кода клавиши -1131
Полный список кейкодов можно посмотреть в документации android-разработчиков.

Клавиатура при этом просто отправляет нажатие и отпускание заданного кода в активное приложение. Как будет обработан код - целиком зависит от приложения-получателя.

Иконки клавиш

В качестве иконки может быть задана одна из встроенных иконок:

@drawable/sym_keyboard_clear - иконка Очистить (крестик)
@drawable/sym_keyboard_copy - иконка Копировать
@drawable/sym_keyboard_cut - иконка Вырезать
@drawable/sym_keyboard_delete - иконка Backspace
@drawable/sym_keyboard_done - иконка Done (галочка как на кнопке Закрыть клавиатуру)
@drawable/sym_keyboard_down - иконка Вниз
@drawable/sym_keyboard_up - иконка Вверх
@drawable/sym_keyboard_edit - иконка Редактирование (карандаш)
@drawable/sym_keyboard_go - иконка Перейти (стрелка вправо)
@drawable/sym_keyboard_menu - иконка Меню
@drawable/sym_keyboard_next - иконка Следующее (маленькая стрелка вправо)
@drawable/sym_keyboard_paste - иконка Вставить
@drawable/sym_keyboard_plus - иконка Плюс
@drawable/sym_keyboard_return - иконка Enter
@drawable/sym_keyboard_search - иконка Поиск
@drawable/sym_keyboard_send - иконка Отправить
@drawable/sym_keyboard_shift - иконка клавиши Shift
@drawable/sym_keyboard_show_password - иконка Показать пароль (глаз)
@drawable/sym_keyboard_smiley - иконка Смайлик
@drawable/sym_keyboard_space - иконка клавиши Пробел
@drawable/sym_keyboard_tab - иконка клавиши Табуляция
@drawable/sym_keyboard_voice_input - иконка Голосовой ввод

Например, android:keyIcon="@drawable/sym_keyboard_space" отобразит на клавише иконку пробела

Кроме того, можно задать путь к иконке, которая расположена в папке /mnt/sdcard/jbakKeyboard/keyboards .
Например, android:keyIcon="myIcons/icon1.png" отобразит на клавише иконку /mnt/sdcard/jbakKeyboard/keyboards/myIcons/icon1.png
Иконки должны быть белыми на прозрачном фоне. При отрисовке они окрашиваются в цвет текста текущего скина пользователя.
Для использования цветных иконок необходимо задать атрибут android:noColor="true" - тогда иконка не будет окрашиваться в цвет текста.

====
программист - Юрий Бакунин aka JBAK
редактор - Владимир Каширин aka_SmIle
Одесса, 2007-2017

Рейтинг@Mail.ru