如何检测设备是否支持缺口显示?

Nee*_*pta 9 android

目前,我在检测移动设备是否支持android的Notch显示时遇到问题。

有人可以帮我吗?(我需要使用android studio中的代码来执行此操作)

谢谢。

Sac*_*tap 12

如果您打算支持所有操作系统,则某些奥利奥设备也会显示槽口,那么您可以使用我的解决方案。根据材料设计指南,Android设备的状态栏高度为24dp。您可以使用以下方法获取设备状态栏的高度和设备密度,并检查状态栏的高度是否大于24dp。如果其高度大于24dp,则显示为缺口,然后您可以根据需要处理视图位置。这也将适用于Oreo。

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

// DP至像素

public static int convertDpToPixel ( float dp){
    DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics();
    float px = dp * (metrics.densityDpi / 160f);
    return Math.round(px);
}
Run Code Online (Sandbox Code Playgroud)

//根据您的要求进行UI调整

if (statusBarHeight > convertDpToPixel(24)) {
    RelativeLayout.LayoutParams topbarLp = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    topbarlp.setMargins(0, statusBarHeight, 0, 0);

    //Set above layout params to your layout which was getting cut because of notch
    topbar.setLayoutParams(topbarlp)
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是这些三星 s10 设备 statusBarHeight 是 24。我们可能需要一些通用的解决方案。 (3认同)

she*_*ond 5

您需要使用WindowInsets对象的getDisplayCutout方法。这将为您提供一个DisplayCutout对象,您可以查询该对象以查找显示中的“安全”插图。

DisplayCutout 类是 API 级别 28 中的新类,因此您将无法在 API 级别较低的设备上执行此操作(您可以假设没有缺口,除非 API 级别 >= 28)。

这里有一个指南。

您可以通过重写View 的onApplyWindowInsets方法或实现OnApplyWindowInsetsListener类来获取 WindowInsets 对象。