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)问题归结为找到显示切口的高度.
似乎没有办法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)
WindowInsets.getDisplayCutout()返回DisplayCutout对象(如果存在)。
要获取显示切口的边界矩形,您可以使用
DisplayCutout.getBoundingRects()
Rect它将为您提供屏幕上所有显示切口(非功能区域)的列表。
为了获得每个显示切口的高度,
Rect.height()
Run Code Online (Sandbox Code Playgroud)
这也可能返回负值,因此请确保采用高度模数。
有关显示剪切支持的更多信息,请参阅以下链接:
android:windowLayoutInDisplayCutoutMode
WindowInsets.getDisplayCutout()
| 归档时间: |
|
| 查看次数: |
4019 次 |
| 最近记录: |