Android 创建活动时如何获取显示剪切高度?

Android 创建活动时如何获取显示剪切高度?,android,android-layout,surfaceview,android-9.0-pie,display-cutouts,Android,Android Layout,Surfaceview,Android 9.0 Pie,Display Cutouts,我有一个全屏(肖像)和线程的游戏,在表面上连续渲染 SurfaceView在创建时初始化,其大小由屏幕的宽度和高度(以像素为单位)决定 创建后,将其设置为游戏活动的内容视图(无XML定义): 问题是,屏幕的高度不包括显示剪切(对于具有剪切的设备),并且高于允许的图形屏幕,因为renderView位于剪切区域下方,不用于渲染 我试图找到真实的屏幕高度-显示剪切高度,以便使帧缓冲区具有该高度 您知道是否有办法在创建时获得显示剪切区域高度,就像我们能够获得导航/状态栏高度一样。以下是返回导航栏高度的代

我有一个全屏(肖像)和线程的游戏,在表面上连续渲染

SurfaceView在创建时初始化,其大小由屏幕的宽度和高度(以像素为单位)决定

创建后,将其设置为游戏活动的内容视图(无XML定义):

问题是,屏幕的高度不包括显示剪切(对于具有剪切的设备),并且高于允许的图形屏幕,因为renderView位于剪切区域下方,不用于渲染

我试图找到真实的
屏幕高度-显示剪切高度
,以便使帧缓冲区具有该高度

您知道是否有办法在创建时获得显示剪切区域高度,就像我们能够获得导航/状态栏高度一样。以下是返回导航栏高度的代码段:

Resources resources = getResources();
int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0) {
    int navigationBarHeight = resources.getDimensionPixelSize(resourceId);
}
谢谢你的帮助

---更新---

我会尝试进一步澄清这个问题:

1)
onCreate
使用屏幕宽度和高度的尺寸(无XML)创建全屏肖像表面视图

2) API级别>19时启用沉浸模式(KitKat)

3) 屏幕宽度和高度由Display.getSize()或Display.getRealSize()根据API级别确定

4) 在具有顶部显示剪切的设备上,视图自动放置在剪切的下方,底部内容被剪切,这就是问题所在

5) 我想在创建时获得显示剪切高度
onCreate
,以便我可以将SurfaceView高度创建为
screenHeight-displayCutoutHeight


6) 问题归结为找到显示剪切的高度。

WindowInsets.getDisplayCutout()
返回显示剪切对象(如果存在)

要获取显示剪切的边框,可以使用

DisplayCutout.getBoundingRects()

它将为您提供屏幕上所有显示窗口(非功能区)的
Rect
列表

为了获得每个显示切口的高度

Rect.height()
这可能会返回负值,因此请确保采用高度模数

有关显示剪切支持的详细信息,请参见以下链接:


似乎无法在onCreate中获取
窗口插入对象。您的
活动必须首先附加到窗口。因此,您的选择是:

一,

二,

以下是如何在onCreate()中:


如果您处于原始问题所询问的纵向模式,请在屏幕上的任何视图(对于drumRoll1Button)和getSafeInsetTop()(对于GetSafeInsettLeft())中交换。此示例适用于景观

对罗曼答案(如上)的修改对我很有效:

    @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        Log.i("Chicken", "cutout: " + getWindow().getDecorView().getRootWindowInsets().getDisplayCutout());
   }

谢谢你的回答。我读到我可以通过WindowInsets获得它,但我不知道如何在onCreate期间获得insets。我已经阅读了您发布的所有链接,所有示例都显示了如何使用视图对象上的侦听器:OnApplyWindowInsertsListener。问题是视图被放置在插入(剪切)的下方,侦听器总是为剪切返回零值,因为它们没有与视图重叠-它们在另一个窗口中位于视图上方。能否提供一个代码片段,说明如何获取insets对象?从那里我可以得到Rect值。小心,如果你手中的手机在旋转过程中稍微旋转一点角度,用这种方法你会得到错误的插入
override fun onAttachedToWindow() {
    val cutout = window.decorView.rootWindowInsets.displayCutout
}
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    contentView?.setOnApplyWindowInsetsListener { _, insets ->
        val cutout = insets.displayCutout
        return@setOnApplyWindowInsetsListener insets
    }
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {

    drumRoll1Button.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {
        @Override
        public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {

                DisplayCutout displayCutout = drumRoll1Button.getRootWindowInsets().getDisplayCutout();
                if (displayCutout!=null) {
                    displayCutoutLengthPx = displayCutout.getSafeInsetLeft();
                }
            Log.v(LOG_TAG,"displayCutoutLengthPx:"+displayCutoutLengthPx);
        }
    });
}
    @Override
    public void onAttachedToWindow() {
        super.onAttachedToWindow();
        Log.i("Chicken", "cutout: " + getWindow().getDecorView().getRootWindowInsets().getDisplayCutout());
   }