如何在Unity 中使用AndroidX ,参看之前的文章:Unity使用AndroidX
首先,要获取当前的View。
cs
AndroidHelper.activity = UnityPlayer.currentActivity;
AndroidHelper.window = activity.getWindow();
AndroidHelper.decorView = window.getDecorView();
其次,使用setOnApplyWindowInsetsListener监听高度变化。
cs
AndroidHelper.activity.runOnUiThread(() -> {
ViewCompat.setOnApplyWindowInsetsListener(AndroidHelper.decorView, (view, insets) -> {
AndroidHelper.navigationBarHeight = insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom;
AndroidHelper.keyboardHeight = insets.getInsets(WindowInsetsCompat.Type.ime()) .bottom;
AndroidHelper.isKeyboardVisible = insets.isVisible(WindowInsetsCompat.Type.ime());
return insets;
});
});
最后,是导出给Unity调用。
cs
// In Unity, it's called with a float return value
public static float getNavigationBarHeight() {
/*
var insets = ViewCompat.getRootWindowInsets(AndroidHelper.decorView);
if (insets != null) {
return insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom;
}
return 0;
*/
return AndroidHelper.navigationBarHeight;
}
// In Unity, it's called with a float return value
public static float getKeyboardHeight() {
/*
var insets = ViewCompat.getRootWindowInsets(AndroidHelper.decorView);
if (insets != null) {
return insets.getInsets(WindowInsetsCompat.Type.ime()).bottom;
}
return 0;
*/
return AndroidHelper.keyboardHeight;
}
注释的部分------是不使用高度监听 ,直接获取高度的方式。
值得指出的是,insets.isVisible(WindowInsetsCompat.Type.ime())------可以准确获得虚拟键盘的可见性,但会有一些延迟(大约0.15秒),可能是弹出动画的时间。
而在手动关闭键盘 的时候(使用键盘上右侧的向下箭头关闭按钮),Unity 会无法正确获取键盘的关闭状态,即已经收起了却还是可见激活状态。这在小窗口 与悬浮键盘 的时候,就无法通过键盘的高度变化 来判断是否关闭了(从弹出高度到0)------因为在这两种情况下,键盘高度始终返回0(不占用当前View的空间)。