如何区分 16:9 显示器和 18:9 显示器?

How to differentiate a 16:9 display from a 18:9 one?

在我的 Android 应用程序中,我使用不同的 Android 资源目录来支持多种屏幕尺寸和方向。所以在 res 里面我有一个 layout 文件夹,一个 layout-land 文件夹,一个 layout-large 文件夹,一个 layout-large-land 文件夹等等。

这种方法对我来说非常有效,直到我尝试在更新的 phone 中安装我的应用程序,该 18:9 显示而不是 16:9 显示。

此 phone 从 layoutlayout-land 文件夹中提取资源,这意味着它正在注册为 "normal" 屏幕。

此外,如果我尝试使用以下代码获取此 phone 的屏幕尺寸,

int screenSize = getResources().getConfiguration().screenLayout &
                Configuration.SCREENLAYOUT_SIZE_MASK;


        switch(screenSize) {
            case Configuration.SCREENLAYOUT_SIZE_XLARGE:
                Toast.makeText(this, "Extra Large Screen", Toast.LENGTH_LONG).show();
                break;
            case Configuration.SCREENLAYOUT_SIZE_LARGE:
                Toast.makeText(this, "Large Screen", Toast.LENGTH_LONG).show();
                break;
            case Configuration.SCREENLAYOUT_SIZE_NORMAL:
                Toast.makeText(this, "Normal Screen", Toast.LENGTH_LONG).show();
                break;
            case Configuration.SCREENLAYOUT_SIZE_SMALL:
                Toast.makeText(this, "Small Screen", Toast.LENGTH_LONG).show();
                break;
            default:
                Toast.makeText(this, "Screen size is neither xlarge, large, normal or small", Toast.LENGTH_LONG).show();
        }

然后它再次被注册为普通屏幕。 但是 phone 和 16:9 显示 也是如此。不用说,这会在应用程序在这两个 phone 上的外观上产生微小但明显的差异。

所以我的问题是,有没有办法区分这两种显示方式?

注意: 我知道有解决方法,比如完全避免 dp 值,只使用权重,但我想知道的是,如果有一种 "official" 或 "advised" 方法来处理这种情况。很像用于横向的 layout-land 文件夹或用于超大屏幕的 layout-xlarge 文件夹等等。

提前致谢。

设备碎片化一直是 Android 的一个大问题。可悲的是,让 Android 如此强大的同一件事也是痛苦的巨大来源。您无法真正预测设备制造商将如何更改设备的不同方面,包括屏幕和纵横比。

但是你可以自己检查比率并根据它进行更改(但我想这不是 "official" 你想要的方式):

DisplayMetrics metrics = context.getResources().getDisplayMetrics();
float ratio = ((float)metrics.heightPixels / (float)metrics.widthPixels);

Source