如何在Android中获取屏幕尺寸,包括虚拟按钮?

时间:2013-05-12 00:37:22

标签: android

对于正常用途,您可以使用DisplayMetrics类并获得“可渲染”大小,但我想弄清楚实际的物理屏幕大小,其中包括虚拟按钮高度。

在我的Galaxy Nexus上报告的尺寸无论我尝试的是1196x720,我可以使用什么来获得物理的1280x720?同样适用于Nexus 7,Nexus 4和Nexus 10设备。

更新:这是我现在使用的最终代码,包括修复:

    //Activity A = this;
    DisplayMetrics displayMetrics = new DisplayMetrics();
    WindowManager wm = (WindowManager) A.getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 
    Display disp = wm.getDefaultDisplay();

    int API_LEVEL =  android.os.Build.VERSION.SDK_INT;
    if (API_LEVEL >= 17)
    {
        disp.getRealMetrics(displayMetrics);
    }
    else
    {
        disp.getMetrics(displayMetrics);
    }

    int Width = displayMetrics.widthPixels;
    int Height = displayMetrics.heightPixels;

2 个答案:

答案 0 :(得分:6)

您应该使用Display.getRealSize(Point)来自官方文档here

  

显示区域以两种不同的方式描述。

     

应用程序显示区域指定显示的部分   可能包含一个应用程序窗口,不包括系统装饰。

     

应用程序显示区域可能小于实际显示区域   因为系统减去了装饰元素所需的空间   作为状态栏。使用以下方法查询应用程序   显示区域:getSize(Point),getRectSize(Rect)和   getMetrics(DisplayMetrics)。

     

实际显示区域指定部件   显示内容包含系统装饰的内容。   即便如此,实际显示区域可能小于物理尺寸   如果窗口管理器正在模拟较小的显示器,则显示   使用(adb shell am display-size)。使用以下方法进行查询   真正的显示区域:getRealSize(Point),   getRealMetrics(DisplayMetrics)。

答案 1 :(得分:4)

类似问题的答案似乎有一个解决方案,以获得API<时显示器的实际尺寸。 17 https://stackoverflow.com/a/15699681/601298

WindowManager w = activity.getWindowManager();
Display d = w.getDefaultDisplay();
DisplayMetrics metrics = new DisplayMetrics();
d.getMetrics(metrics);
// since SDK_INT = 1;
widthPixels = metrics.widthPixels;
heightPixels = metrics.heightPixels;
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17)
try {
    widthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(d);
    heightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(d);
} catch (Exception ignored) {
}
// includes window decorations (statusbar bar/menu bar)
if (Build.VERSION.SDK_INT >= 17)
try {
    Point realSize = new Point();
    Display.class.getMethod("getRealSize", Point.class).invoke(d, realSize);
    widthPixels = realSize.x;
    heightPixels = realSize.y;
} catch (Exception ignored) {
}