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

相关推荐
WarPigs2 天前
Unity无法修改Assembly-CSharp.csproj错误
unity
FairGuard手游加固2 天前
手游加固怎么做?SO、IL2CPP、AssetBundle 与运行时保护详解
安全·游戏·unity
阿松爱学习3 天前
【Unity开发】监听Scene场景事件
unity·c#
xiaogai_gai4 天前
BOM 物料清单同步实战:金蝶云星空 → 四化智造 MES 修改场景深度拆解
unity·游戏引擎
淡海水4 天前
03-03-架构篇-SGen GC架构解析
unity·架构·c#·gc·sgen
萌萌的提莫队长5 天前
Unity相机捕捉,图像识别,抠像+合成
opencv·unity
mxwin5 天前
Unity Shader 光线追踪原理与实战案例
unity·游戏引擎
地狱为王6 天前
Unity使用DPDFNet实现实时语音增强(降噪)
unity·语音增强·降噪·dpdfnet
平行云PVT6 天前
国产信创实时云渲染解决方案:如何实现数字孪生与三维应用云化部署?
unity·webrtc·unreal engine·实时云渲染·国产信创·摩尔线程·砺算科技
夏炎黄6 天前
Terrain地形剪裁
unity