Unity使用AndroidX获取,导航栏与虚拟键盘的高度

如何在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的空间)。

相关推荐
玖玥拾1 天前
Unity3D RPG 入门项目(八)游戏设置面板、帧率控制、快捷技能药品栏、技能解锁系统
游戏·3d·unity·游戏引擎
ellis19701 天前
u3d插件xLua[十] lua侧判空问题
unity
牛哇网络工作室1 天前
UnityHDRP写实数字人全流程基础5—语音输入和语音识别
android·unity·c#·游戏引擎·aigc·语音识别·xcode
ellis19702 天前
u3d插件xLua[九]例8 Hotfix
unity
淡海水2 天前
01-07-运行时-GC深度剖析-内存分配回收与结构选择
jvm·windows·unity·gc
优梦创客2 天前
游戏开发架构选型:第1篇|什么是架构?从进球事件看 MVC 的局限
unity·架构·游戏引擎·游戏开发
zhangphil3 天前
Unity3D(Unity)跨平台游戏引擎简介
unity
Madokaly3 天前
DOTween动画:TweenManager深度解析
unity
_ZHOURUI_H_4 天前
Unity TCP底层极限拆解:粘包、半包、CRC、序列号、双缓冲到底怎么一起工作的?
网络·网络协议·tcp/ip·游戏·unity·游戏引擎·游戏开发
KindSuper_liu4 天前
Unity 游戏网络基础:从 TCP、UDP 到 HTTP、TLS 与 Best HTTP
网络·游戏·unity