如何在创建活动时获得DisplayCutout高度?

lub*_*ben 10 android surfaceview android-layout android-9.0-pie display-cutouts

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

SurfaceView已初始化onCreate,其大小由屏幕的宽度和高度(以像素为单位)决定.

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

Bitmap frameBuffer = Bitmap.createBitmap(screenWidth, screenHeight, Config.ARGB_8888);

MySurfaceView renderView = new MySurfaceView(this, frameBuffer);

this.setContentView(renderView);
Run Code Online (Sandbox Code Playgroud)

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

我试图找到真实的,screen height - display cutout height以便我可以使帧缓冲区具有该高度.

你知道是否有办法获得显示切口区域的高度onCreate,就像我们能够获得导航/状态栏高度一样.以下是返回导航栏高度的代码段:

Resources resources = getResources();
int resourceId = resources.getIdentifier("navigation_bar_height", "dimen", "android");
if (resourceId > 0) {
    int navigationBarHeight = resources.getDimensionPixelSize(resourceId);
}
Run Code Online (Sandbox Code Playgroud)

谢谢您的帮助!

---更新---

我会尝试更多地澄清这个问题:

1)onCreate使用屏幕宽度和高度(无XML)创建全屏肖像SurfaceView

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

3)屏幕宽度和高度采用Display.getSize()或Display.getRealSize()取决于API级别

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

5)我想获得Display Cutout的高度onCreate,以便我可以创建SurfaceView高度screenHeight - displayCutoutHeight.

6)问题归结为找到显示切口的高度.

Rom*_*nko 6

似乎没有办法WindowInsets在 onCreate 中获取对象。您Activity必须先连接到窗口。所以你的选择是:

1.

override fun onAttachedToWindow() {
    val cutout = window.decorView.rootWindowInsets.displayCutout
}
Run Code Online (Sandbox Code Playgroud)

2.

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    contentView?.setOnApplyWindowInsetsListener { _, insets ->
        val cutout = insets.displayCutout
        return@setOnApplyWindowInsetsListener insets
    }
}
Run Code Online (Sandbox Code Playgroud)


Sai*_*man 3

WindowInsets.getDisplayCutout()返回DisplayCutout对象(如果存在)。

要获取显示切口的边界矩形,您可以使用

DisplayCutout.getBoundingRects()

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

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

Rect.height()
Run Code Online (Sandbox Code Playgroud)

这也可能返回负值,因此请确保采用高度模数。

有关显示剪切支持的更多信息,请参阅以下链接:

android:windowLayoutInDisplayCutoutMode

显示剪裁

布局显示剪切模式

窗口插入

WindowInsets.getDisplayCutout()

  • 谢谢你的回答。我读到可以使用 WindowInsets 获取它,但我无法理解如何在 onCreate 期间获取插图。我已阅读您发布的所有链接,所有示例都展示了如何使用视图对象上的侦听器来执行此操作:onApplyWindowInsetsListener。问题是视图放置在插图(切口)下方,并且侦听器始终为切口返回零值,因为它们没有与视图重叠 - 它们在另一个窗口中位于视图上方。您能否提供一个如何获取 insets 对象的代码片段?从那里我可以获得矩形值。 (8认同)