我正在使用 LibGDX 开发 Android 游戏。我需要找到用户正在使用的软键盘的高度,因为我想在键盘正上方显示一些对象。
我已阅读此主题: how can i get soft keyboard height on android?
但该评论表明它不起作用,而且似乎也适用于 Android SDK 。我不确定。有没有人知道一种绝对有用的方法?
答案 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));
}
}
}