Ответ 1
Оригинальное решение опубликовано в fooobar.com/questions/456155/..., но оно не приходит с объяснением, поэтому здесь я немного расширю его.
1) Создайте новый класс, который расширяет класс клавиатуры, который переопределяет метод getHeight().
@Override
public int getHeight() {
return getKeyHeight() * 3;
}
Примечание: число 3 здесь - ваше общее количество строк, если ваша клавиатура имеет 5 строк, поместите 5.
Если высота каждой строки клавиатуры различна для каждой строки, здесь вам нужно вычислить себя и вернуть общую высоту (единица в пикселях, мне потребовалось некоторое время, чтобы понять, что это не dp, поэтому необходимо преобразовать dp в пиксель для всех вычислений), например:
@Override
public int getHeight() {
return row1Height + row2Height + row3Height + row4Height + row5Height;
}
2) Создайте новую публичную функцию в том же классе.
public void changeKeyHeight(double height_modifier)
{
int height = 0;
for(Keyboard.Key key : getKeys()) {
key.height *= height_modifier;
key.y *= height_modifier;
height = key.height;
}
setKeyHeight(height);
getNearestKeys(0, 0); //somehow adding this fixed a weird bug where bottom row keys could not be pressed if keyboard height is too tall.. from the Keyboard source code seems like calling this will recalculate some values used in keypress detection calculation
}
Если вы не используете height_modifier, но вместо этого настроитесь на определенную высоту, вам нужно будет вычислить позицию key.y.
Если высота каждой строки клавиатуры различна для каждой строки, вам может потребоваться проверить ключи, определить принадлежащую ей строку и установить высоту для коррекции значения, если ключи не будут перекрывать друг друга. Также сохраните высоту строки в частной переменной, которая будет использоваться в getHeight() выше. PS: При определенной конфигурации я не мог нажать клавиши нижней строки после изменения высоты клавиатуры, и я обнаружил, что вызов getNearestKeys() исправляет это, хотя я не совсем уверен, почему.
Примечание: key.y - это позиция y, координата 0 начинается с верхней части клавиатуры и уменьшается при увеличении значения. например Координата 100 точек на 100 пикселей от верхней части клавиатуры:)
3) Последний шаг - вызвать changeKeyHeight в вашем основном классе, который расширяет InputMethodService. Сделайте это внутри (переопределите) onStartInputView(), так как именно здесь клавиатура должна быть перерисована после изменения высоты (с помощью предпочтения или чего-то еще).
Если вы посмотрите на образец программы для мягкой клавиатуры Android, это будет следующим:
@Override public void onStartInputView(EditorInfo attribute, boolean restarting) {
super.onStartInputView(attribute, restarting);
// Change the key height here dynamically after getting your value from shared preference or something
mCurKeyboard.changeKeyHeight(1.5);
// Apply the selected keyboard to the input view.
mInputView.setKeyboard(mCurKeyboard);
mInputView.closing();
final InputMethodSubtype subtype = mInputMethodManager.getCurrentInputMethodSubtype();
mInputView.setSubtypeOnSpaceKey(subtype);
}
Ура!
Дополнительно: если вам нужен конвертер dp в пиксель, вот код:
private int convertDpToPx(int dp)
{
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());
}