如何在Android Honeycomb中获得屏幕分辨率?

时间:2011-08-27 09:49:51

标签: android android-3.0-honeycomb

我想在Android Honeycomb上获得真正的屏幕分辨率。

这是我的代码

Display display = getWindowManager().getDefaultDisplay();
int w = display.getWidth();
int h = display.getHeight();

我的设备是Asus Transformer TF101,尺寸为1280x800。

但是上面的代码使w = 1280和h = 752(我想要的是800而不是752)。

我知道h< 800,因为它被减去状态栏。

有办法获得真正的屏幕高度吗?

非常感谢!

10 个答案:

答案 0 :(得分:15)

启动Andorid 3.2,系统状态栏的高度不包含在DisplayMetrics的高度中,您必须使用未记录的API(Display.getRawWidth()和Display.getRawHeight())来获取物理屏幕的宽度或高度。

以下是向您展示如何获取物理屏幕宽度或高度的示例。

Method mGetRawW = Display.class.getMethod("getRawWidth");
Method mGetRawH = Display.class.getMethod("getRawHeight");
int nW = (Integer)mGetRawW.invoke(dp);
int nH = (Integer)mGetRawH.invoke(dp);

<强>更新: 对于API 13-16,您必须使用上面的代码来获得真实的宽度/高度。 对于API 17+,您现在可以使用新的公共API,Display.getRealSize()。

答案 1 :(得分:12)

在这里,您可以通过小技巧并假设屏幕装饰位于顶部/底部,而不是左/右:

Display d = getWindowManager().getDefaultDisplay();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
int h = d.getWidth();
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
int w = d.getWidth();

答案 2 :(得分:5)

我手边有一个Xoom,并使用getWindowManager().getDefaultDisplay()来检索尺寸,它返回1280 x 800这是全屏尺寸。我想知道如何在版本3.0之前使用API​​获得分辨率减去导航栏。

答案 3 :(得分:4)

使用DisplayMetrics结构,描述有关显示的一般信息,例如其大小,密度和字体缩放。

用于获取显示高度的代码如下:

DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);

Log.d("log", "OOO " + metrics.heightPixels);

它应该返回显示的绝对高度,以像素为单位。

答案 4 :(得分:4)

你得到的答案,正确推断是因为状态栏。您所要做的就是在窗口显示开始之前摆脱状态栏。然后,您可以在设置活动的内容视图之前重置状态栏。

这样做的原因是,除非您动态处理所有度量,布局和绘制,否则删除状态栏会影响视图绘制。执行此操作是运行时的中间将导致状态栏消失,然后再次出现(如果需要),从而导致用户混淆。

隐藏状态栏:

在你的onCreate()中:

final WindowManager.LayoutParams attrs = getWindow().getAttributes();
//Add the flag to the Window Attributes
attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
getWindow().setAttributes(attrs);
//Disassociate Display from the Activity
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

现在您的默认显示应该可以正常工作

仍在你的onCreate():

Display display = getWindowManager().getDefaultDisplay();
int w = display.getWidth();
int h = display.getHeight();

现在,在设置内容

之前

再次,在你的onCreate():

final WindowManager.LayoutParams attrs = getWindow().getAttributes();
//Show the statubar
attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);
getWindow().setAttributes(attrs);
// Reassociate.
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);

<强>最后:

setContentView(r.layout.myView);

以前的代码段实际上几乎可以在任何地方使用。我只是想你的用户体验。当然,请随意放置它们。这些是从我的一个项目中提取的功能部分。我也看到过一些Home Launchers的技术类似。注意:根据Android版本的不同,您可能需要在onWindowAttached()中执行状态栏。如果这样做,请确保仍然调用super.onWindowAttached()。

另一种技术: 当然,如果你想要这样做,你总是可以在清单中以这种方式设置活动的属性。

android:theme="@android:style/Theme.NoTitleBar.Fullscreen"

答案 5 :(得分:0)

在问题Height of statusbar?中解释如何获得状态栏高度。拥有statusBarHeight值,您可以执行以下操作:

Display display = getWindowManager().getDefaultDisplay();
int h = display.getHeight() + statusBarHeight;

答案 6 :(得分:0)

您可以扩展将作为顶部布局的布局(将设置为fill_parent的宽度和高度)并覆盖onSizeChange(int width,int height,int oldwidth,int oldheight)。 宽度和高度是显示器的实际宽度和高度。

答案 7 :(得分:0)

也许您可以添加状态栏的高度。 Height of statusbar?

   Rect rectgle= new Rect();
   Window window= getWindow();
   window.getDecorView().getWindowVisibleDisplayFrame(rectgle);
   int StatusBarHeight= rectgle.top;
   int contentViewTop= `enter code here`
      window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
   int TitleBarHeight= contentViewTop - StatusBarHeight;

   Log.i("*** Jorgesys :: ", "StatusBar Height= " + StatusBarHeight + " , TitleBar Height = " + TitleBarHeight);

答案 8 :(得分:0)

使API11级别的屏幕尺寸最小化的功能;还包括更高级API的方法(更改函数以使用所选API,其函数调用及其返回对象类型):

public int getScreenOrientation()
{
    int nOrientation = Configuration.ORIENTATION_UNDEFINED;

    try
    {
        DisplayMetrics displayMetrics = null;
        WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        if(windowManager != null)
        {
            Display defaultDisplay = windowManager.getDefaultDisplay();
            if(defaultDisplay != null)
            {
                defaultDisplay.getMetrics(displayMetrics);//API11
                //defaultDisplay.getRectSize(rectGet);//API13
                //defaultDisplay.getSize(pointGet);//API13
                //defaultDisplay.getCurrentSizeRange(pointGet,pointGet);//API16
                //defaultDisplay.getRealSize(pointGet);//API17
                //defaultDisplay.getRealMetrics(displayMetrics);//API17
                if((displayMetrics.widthPixels == displayMetrics.heightPixels) || (displayMetrics.widthPixels < displayMetrics.heightPixels))
                {
                    nOrientation = Configuration.ORIENTATION_PORTRAIT;
                }
                else
                {
                    nOrientation = Configuration.ORIENTATION_LANDSCAPE;
                }
            }
        }
    }
    catch(Exception e)
    {
        showMessage(false,"Error","[getScreenOrientation]: " + e.toString());
    }

    return nOrientation;
}

注意:不推荐使用Configuration.ORIENTATION_SQUARE,因此在此处将其替换为默认为ORIENTATION_PORTRAIT。

答案 9 :(得分:0)

这是另一种测量屏幕尺寸的可行解决方案(API 11 +):

public static ABDimension calculateScreenDimensions(Activity activityGet)
{
    ABDimension abdReturn = new ABDimension();

    try
    {
        Rect rectGet = new Rect();
        Window winGet = null;
        DisplayMetrics displayMetrics = new DisplayMetrics();
        int nStatusBarHeight = 0;
        int nContentViewTop = 0;
        int nTitleBarHeight = 0;
        int nScreenHeight = 0;

        if((activityGet != null) && (rectGet != null) && (displayMetrics != null))
        {
            winGet = activityGet.getWindow();
            if(winGet != null)
            {
                winGet.getDecorView().getWindowVisibleDisplayFrame(rectGet);
                nStatusBarHeight = rectGet.top;
                nContentViewTop = winGet.findViewById(Window.ID_ANDROID_CONTENT).getTop();
                nTitleBarHeight = nContentViewTop - nStatusBarHeight;

                activityGet.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
                int screenHeight = displayMetrics.heightPixels;
                abdReturn.nWidth = displayMetrics.widthPixels;
                abdReturn.nHeight = screenHeight - (nTitleBarHeight + nStatusBarHeight);
            }
        }
    }
    catch(Exception e)
    {
        appContext.showMessage(false,"Error","[calculateScreenDimensions]: "+e.toString());
    }

    return abdReturn;
}

其中ABDimension类包含六个标记为nWidth,nHeight,nMarginLeft,nMarginTop,nMarginRight和nMarginBottom的整数。此版本考虑了常见的Android装饰组件,如TitleBar / StatusBar。