Как я могу найти высоту мягкой клавиатуры в приложении LibGDX
Я разрабатываю Android игру с LibGDX. И мне нужно найти высоту мягкой клавиатуры, которую пользователь использует, так как я хочу отображать некоторые объекты прямо над клавиатурой.
Я прочитал эту тему:
как я могу получить мягкую высоту клавиатуры на андроиде?
Но комментарий предполагает, что он не работает, и он также, похоже, используется для Android SDK. Я не уверен. Кто-нибудь знает способ, который определенно будет работать?
Ответы
Ответ 1
Если ваша проблема в том, что ваши текстовые поля затенены, я предлагаю использовать
void Gdx.input.getTextInput(Input.TextInputListener listener,
java.lang.String title,
java.lang.String text)
вместо этого, потому что это создаст диалог ввода исходного модального текста, который перемещается вверх и вниз с помощью клавиатуры. Я также пытался получить высоту клавиатуры, но до сих пор мне не удалось.
См. ответы на эту тему:
Как libgdx обнаруживает присутствие клавиатуры
Ответ 2
Надеюсь, кто-то найдет этот ответ полезным:
Существует тренировка для определения точной высоты мягкой клавиатуры, которая включает в себя действие Launcher, чтобы отправить размер экрана в игру, когда происходит событие изменения размера экрана.
Сначала установите диспетчер компоновки на ViewTreeObserver корневого элемента вашей LauncherActivity:
public class AndroidLauncher extends AndroidApplication {
//...
public void setListenerToRootView() {
final View activityRootView = getWindow().getDecorView().findViewById(android.R.id.content);
activityRootView.getViewTreeObserver().addOnGlobalLayoutListener(keyboardLayoutListener);
}
private ViewTreeObserver.OnGlobalLayoutListener keyboardLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Rect visibleDisplayFrame = new Rect();
getWindow().getDecorView().getWindowVisibleDisplayFrame(visibleDisplayFrame);
game.screenResize(visibleDisplayFrame.width(), visibleDisplayFrame.height());
}
};
//...
}
Если вы попытаетесь получить высоту корневого представления, это не сработает, так как большинство игр полноэкранные.
Не забудьте добавить и удалить слушателя в соответствующих случаях:
@Override
protected void onCreate (Bundle savedInstanceState) {
//...
setListenerToRootView();
}
@Override
protected void onDestroy () {
super.onDestroy();
removeListenerToRootView();
}
public void removeListenerToRootView() {
final View activityRootView = getWindow().getDecorView().findViewById(android.R.id.content);
activityRootView.getViewTreeObserver().removeOnGlobalLayoutListener(keyboardLayoutListener);
}
Затем объявите метод screenResize внутри Game Class, который получит размеры и отправит их на текущий экран:
public class YourGame extends Game {
//...
public ScreenBase currentScreen;
//...
public void screenResize(float width, float height) {
if(currentScreen != null)
currentScreen.onScreenResize(width, height);
}
//...
}
Каждый экран, который включает изменение, должен реализовать метод onScreenResize. Ввести абстрактный базовый класс экрана с абстрактным методом onScreenResize. В конструкторе должна быть задана переменная currentScreen:
public abstract class ScreenBase implements Screen {
//...
public ScreenBase(YourGame game) {
//...
this.game = game;
this.game.currentScreen = this;
//....
}
public abstract void onScreenResize(float width, float height);
Внедрите их в любой экран, который вы хотите:
public class LoginScreen extends ScreenBase {
//...
@Override
public void onScreenResize(final float width, final float height) {
if(Gdx.graphics.getHeight() > height) {
Gdx.app.log("LoginScreen", "Height of keyboard: " + (Gdx.graphics.getHeight() - height));
}
}
}