如何获取真实的屏幕高度和宽度?

49
DisplayMetrics metrics = new DisplayMetrics();
this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
screenWidth = metrics.widthPixels;
screenHeight = metrics.heightPixels;

我使用以下代码获取屏幕的高度和宽度

我的Nexus7屏幕高度应该是1280

但它返回1205...

我的minSdkVersion为8级

所以我不能使用这些方法:

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int screen_width = size.x;
int screen_height = size.y;

现在,我应该如何获取正确的屏幕尺寸?
编辑:
if (Build.VERSION.SDK_INT >= 11) {
        Point size = new Point();
        try {
            this.getWindowManager().getDefaultDisplay().getRealSize(size);
            screenWidth = size.x;
            screenHeight = size.y;
        } catch (NoSuchMethodError e) {
            Log.i("error", "it can't work");
        }

    } else {
        DisplayMetrics metrics = new DisplayMetrics();
        this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
        screenWidth = metrics.widthPixels;
        screenHeight = metrics.heightPixels;
    }

使用它很有效!


这个有帮助吗?https://dev59.com/hnNA5IYBdhLWcg3wUL5Y - trojanfoe
不行,我不能使用 display.getSize(size);,因为我的最小SDK级别是8。 - user1531240
如果你读一下trojanfoe链接中的一些评论,他们建议这样做:try {display.getSize(size);width = size.x;height = size.y;}catch (NoSuchMethodError e){width = display.getWidth();height = display.getHeight();}....然而,即使你可以使用getSize()方法,我认为你仍然会得到这个1205分辨率,它是可用屏幕高度(即减去导航按钮)。不确定如何获取nav按钮的高度,但很感兴趣并在寻找。 - ggenglish
4
您在编辑时检查API级别是否大于等于11。Display#getRealSize()是在API级别17中添加的,因此您应该检查该级别。http://developer.android.com/reference/android/view/Display.html#getRealSize%28android.graphics.Point%29 - Takaitra
请参见 https://dev59.com/plIG5IYBdhLWcg3wqTbe。 - CoolMind
对于 API 级别 31+,请使用 windowManager.currentWindowMetrics.bounds.height - Zain
3个回答

53

我编写了一个方法,可以尽可能地获得 API 10 至 17+ 的宽度和高度。对于 API 14+,它应该能够给出真实的宽度和高度,而对于其他所有情况,它也会尽力而为。

    Display display = context.getWindowManager().getDefaultDisplay();
    int realWidth;
    int realHeight;

    if (Build.VERSION.SDK_INT >= 17){
        //new pleasant way to get real metrics
        DisplayMetrics realMetrics = new DisplayMetrics();
        display.getRealMetrics(realMetrics);
        realWidth = realMetrics.widthPixels;
        realHeight = realMetrics.heightPixels;

    } else if (Build.VERSION.SDK_INT >= 14) {
        //reflection for this weird in-between time
        try {
            Method mGetRawH = Display.class.getMethod("getRawHeight");
            Method mGetRawW = Display.class.getMethod("getRawWidth");
            realWidth = (Integer) mGetRawW.invoke(display);
            realHeight = (Integer) mGetRawH.invoke(display);
        } catch (Exception e) {
            //this may not be 100% accurate, but it's all we've got
            realWidth = display.getWidth();
            realHeight = display.getHeight();
            Log.e("Display Info", "Couldn't use reflection to get the real display metrics.");
        }

    } else {
        //This should be close, as lower API devices should not have window navigation bars
        realWidth = display.getWidth();
        realHeight = display.getHeight();
    }

可爱的方法。希望我能够投更多赞。一定是最佳答案。 - Sufian
1
请注意,上下文必须是一个活动。 - Chris Sprague
2
哦,谢谢你……这么简单的东西为什么要复杂化……我真不理解……应该只有一行:getScreenDimensions()!整理好你的事情Google。 - Aggressor
在真实设备上运行效果非常好,在模拟器上可能无法产生正确的结果,但这并不是真正的问题。 - Meanman
已过时,请参见https://dev59.com/plIG5IYBdhLWcg3wqTbe。 - CoolMind
显示剩余3条评论

39

我认为这会奏效。关键是你必须使用:

display.getRealSize(size);

display.getSize(size);

为解决您的API 8编码问题,请执行以下操作:

try { 
    display.getRealSize(size);
    height = size.y; 
} catch (NoSuchMethodError e) {
    height = display.getHeight();
}

只有较新的API设备才会有屏幕导航按钮,因此需要使用新的方法,而较旧的设备将抛出异常,但不会有屏幕导航,因此旧的方法也可以。

如果需要说明:仅因为您的项目的最低API级别为8并不意味着您必须以该级别进行编译。我同样将最低级别设置为8,但我的项目主要在级别13(3.2)进行编译,从而使它们可以访问许多新方法。


2
不要使用try-catch块,而应该检查设备上的API级别。请参见Build.VERSION和方法Display.getHeight,Display.getSize,display.getRealSize。 - mehmet6parmak
3
请记住,由于getRealSize()方法是在API级别17中引入的,因此此方法无法用于API级别14、15和16。以下是一个解决方法,用于找到API 17以下版本的原始值: https://dev59.com/f2gu5IYBdhLWcg3w6bGo - Saket

5

您可以使用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);
}

getDefaultDisplay已被弃用。请参见https://dev59.com/plIG5IYBdhLWcg3wqTbe。 - CoolMind

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