如何在LibGDX应用程序中找到软键盘的高度

时间:2013-12-05 20:34:15

标签: keyboard height libgdx

我正在使用 LibGDX 开发 Android 游戏。我需要找到用户正在使用的软键盘的高度,因为我想在键盘正上方显示一些对象。

我已阅读此主题: how can i get soft keyboard height on android?

但该评论表明它不起作用,而且似乎也适用于 Android SDK 。我不确定。有没有人知道一种绝对有用的方法?

2 个答案:

答案 0 :(得分:3)

如果您的问题是您的文本字段被遮挡,那么我建议使用

void Gdx.input.getTextInput(Input.TextInputListener listener, java.lang.String title, java.lang.String text)

相反,因为这将生成一个本机模式文本输入对话框,使用键盘上下移动。我试图获得键盘的高度,但到目前为止我还没有管理。

查看此主题的答案: How do libgdx detect keyboard presence

答案 1 :(得分:1)

希望有人会觉得这个答案很有用:

进行锻炼以检测软键盘的确切高度,当发生屏幕调整大小事件时,该键盘涉及Launcher Activity向游戏发送屏幕尺寸。

首先,在LauncherActivity的rootView的ViewTreeObserver上设置布局侦听器:

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);
}

接下来,在Game Class中声明screenResize方法,它将接收尺寸并将其发送到当前屏幕:

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));
        }
    }
}