【问题标题】:How to get screen resolution in Android Honeycomb?如何在 Android Honeycomb 中获取屏幕分辨率?
【发布时间】:2011-08-27 09:49:51
【问题描述】:

我想在 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

有什么方法可以得到屏幕的真实高度?

非常感谢!

【问题讨论】:

  • @alexanderblom 我的情况不容易解释。但我真的需要获得 Honeycomb 的完整高度或状态栏。谢谢!

标签: android android-3.0-honeycomb


【解决方案1】:

从 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()。

【讨论】:

    【解决方案2】:

    你在这里,小技巧和假设屏幕装饰在顶部/底部,而不是在左/右:

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

    【讨论】:

    • 不幸的是,例如在 kindle fire 你的假设是完全错误的
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      DisplayMetrics metrics = new DisplayMetrics();
      getWindowManager().getDefaultDisplay().getMetrics(metrics);
      
      Log.d("log", "OOO " + metrics.heightPixels);
      

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

      【讨论】:

      • 谢谢,但是metrics.heightPixels = 752,和display.getHeight()一样;
      • 在 Honeycomb 上,这不会报告真实的物理屏幕尺寸。
      【解决方案5】:

      正如正确推断的那样,您得到的答案是由于状态栏。您所要做的就是在窗口显示启动之前摆脱状态栏。然后您可以在设置活动的内容视图之前重置状态栏。

      这样做的原因是摆脱状态栏会影响您的视图绘图,除非您动态处理所有测量、布局和绘图。这样做是在运行时的中间,会导致状态栏消失,然后根据需要重新出现,从而导致用户混淆。

      隐藏状态栏:

      在你的 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 Launcher 中也看到了类似的技术。注意:根据 Android 版本,您可能需要在 onWindowAttached() 中处理状态栏。如果这样做,请确保您仍然调用 super.onWindowAttached()。

      另一种技巧: 当然,如果您仍然想这样做,您可以随时在清单中以这种方式设置活动的属性。

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

      【讨论】:

      • 此示例似乎不适用于运行 4.4 的 Nexus 4。显示尺寸测量小于通知栏。
      • 这就是本文的核心,一个去掉通知栏然后测量的方法。然而,这个例子明显早于 Android 4.4。 Android 4.4 不允许移除通知栏?
      【解决方案6】:

      在问题Height of statusbar? 中解释如何获得状态栏高度。拥有statusBarHeight 值,您可以这样做:

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

          也许您可以添加状态栏的高度。 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);
          

          【讨论】:

            【解决方案9】:

            获取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。

            【讨论】:

              【解决方案10】:

              这是另一种测量屏幕尺寸的可行解决方案(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。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2011-11-10
                • 2011-04-10
                相关资源
                最近更新 更多