Android 创建活动时如何获取显示剪切高度?
我有一个全屏(肖像)和线程的游戏,在表面上连续渲染 SurfaceView在创建时初始化,其大小由屏幕的宽度和高度(以像素为单位)决定 创建后,将其设置为游戏活动的内容视图(无XML定义): 问题是,屏幕的高度不包括显示剪切(对于具有剪切的设备),并且高于允许的图形屏幕,因为renderView位于剪切区域下方,不用于渲染 我试图找到真实的Android 创建活动时如何获取显示剪切高度?,android,android-layout,surfaceview,android-9.0-pie,display-cutouts,Android,Android Layout,Surfaceview,Android 9.0 Pie,Display Cutouts,我有一个全屏(肖像)和线程的游戏,在表面上连续渲染 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());
}