如何在Android N后获取实际屏幕尺寸?

3

自从Android N引入分屏功能后,应用程序的窗口大小可以缩小至原来的一半。我发现getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);不再总是返回实际设备屏幕大小了,因为在分屏模式下,显示器的高度将成为应用程序窗口的高度。是否有其他API可以用于获取实际屏幕大小?


1
你为什么想要实际屏幕尺寸? - ianhanniballake
你的应用窗口大小可以是原始大小的一半,但是一旦我们开始使用支持自由多窗口模式的设备,你的窗口大小可能会比屏幕的一半小得多。 - CommonsWare
@ianhanniballake 假设你有一个实用程序应用,可以告诉你有关设备屏幕大小(宽度、高度、对角线)的信息,或者试图收集/记录用户设备屏幕大小数据的应用程序。我只是好奇在Android N中是否有替代简单的方法来完成它。 - hac.jack
3个回答

3

核心API中以“getReal”开头的方法太长了,这真的很令人困扰。我们真的需要整理一下。 - milosmns

0

使用 DisplayDisplayMetrics 可以在多窗口模式下获取真实设备尺寸。

使用 Display:

private void findRealSize(Activity activity)
{
    Point size = new Point();
    Display display = activity.getWindowManager().getDefaultDisplay();

    if (Build.VERSION.SDK_INT >= 17)
        display.getRealSize(size);
    else
        display.getSize(size);

    int realWidth = size.x;
    int realHeight = size.y;

    Log.i("LOG_TAG", "realWidth: " + realWidth + " realHeight: " + realHeight);
}

使用DisplayMetrics:

private void findRealSize(Activity activity)
{
    DisplayMetrics displayMetrics = new DisplayMetrics();

    if (Build.VERSION.SDK_INT >= 17)
    {
        activity.getWindowManager().getDefaultDisplay().getRealMetrics(displayMetrics);
    }
    else
    {
        activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
    }

    int realWidth = displayMetrics.widthPixels;
    int realHeight = displayMetrics.heightPixels;

    Log.i("LOG_TAG", "realWidth: " + realWidth + " realHeight: " + realHeight);
}

我正在使用SDK API 30,getRealSize和getSize将返回不同的答案。 getReal提供真实的硬件尺寸,但getSize较小。 它减去了操作栏的大小。 - John Henckel

-2

目前我还没有找到一个适当的解决方案,但我通过每个分辨率的densityDpi来处理它。就像这样:

private int getScreenDensityDPI() {
    DisplayMetrics metrics = new DisplayMetrics();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
    } else {
        getWindowManager().getDefaultDisplay().getMetrics(metrics);
    }
    return metrics.densityDpi;
}

private int getNumberItemsByScreenResolution() {
    int densityDPI = getScreenDensityDPI();
    if (densityDPI <= 140) {
        return 6;
    } else if (densityDPI <= 160) {
        return 5;
    } else {
        return 4;
    }
}

在您的 Android N 设备上,密度最低的 DPI 值越低,显示器的分辨率就越高。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接