【问题标题】:Is there a way to determine android physical screen height in cm or inches?有没有办法以厘米或英寸为单位确定 android 物理屏幕高度?
【发布时间】:2011-01-12 16:50:39
【问题描述】:

我需要以实际长度单位准确了解设备上的屏幕有多大,以便计算重力加速度(以像素/毫秒为单位)。

在 Android API 的某处是否有用于此的方法?

【问题讨论】:

  • 如果您希望进行一次性转换(例如从 Photoshop 导出精灵或设计物理尺寸的布局),here's a nifty converter

标签: android screen resolution inches


【解决方案1】:

你需要使用屏幕密度来计算这个。

Context.getResources().getDisplayMetrics().density

根据文档:

显示的逻辑密度。这是密度无关像素单元的缩放因子,其中一个 DIP 是大约 160 dpi 屏幕(例如 240x320、1.5"x2" 屏幕)上的一个像素,提供系统显示的基线。因此,在 160dpi 屏幕上,此密度值为 1;在 120 dpi 屏幕上为 0.75;等等

此值并不完全遵循实际屏幕尺寸(由 xdpi 和 ydpi 给出,而是用于根据显示 dpi 的总体变化逐步缩放整个 UI 的尺寸。例如,240x320 屏幕即使其宽度为 1.8"、1.3" 等,其密度也会为 1。但是,如果屏幕分辨率增加到 320x480 但屏幕尺寸仍为 1.5"x2",那么密度会增加(可能会增加到 1.5)。

【讨论】:

  • 按照另一张海报的描述使用 xdpi 和 ydpi。密度故意不是到物理屏幕尺寸的绝对映射,而是一个更抽象的单位,可以量化为少量离散值(目前为 120dpi、160dpi、240dpi)。
  • 这是一种不好的方法,会导致 dpi 和分辨率的值不准确。
【解决方案2】:

android developers screen info.

使用xdpi * widthPixelsydpi * heightPixels 可能会得到你想要的。

【讨论】:

  • 嗨,有些型号返回错误的 xdpi 和 ydpi 值,请参阅我的评论。
【解决方案3】:

使用以下内容:

    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    double x = Math.pow(mWidthPixels/dm.xdpi,2);
    double y = Math.pow(mHeightPixels/dm.ydpi,2);
    double screenInches = Math.sqrt(x+y);
    Log.d("debug","Screen inches : " + screenInches);

当 mWidthPixels 和 mHeightPixels 取自下面的代码时

private void setRealDeviceSizeInPixels()
{
    WindowManager windowManager = getWindowManager();
    Display display = windowManager.getDefaultDisplay();
    DisplayMetrics displayMetrics = new DisplayMetrics();
    display.getMetrics(displayMetrics);


    // since SDK_INT = 1;
    mWidthPixels = displayMetrics.widthPixels;
    mHeightPixels = displayMetrics.heightPixels;

    // includes window decorations (statusbar bar/menu bar)
    if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17)
    {
        try
        {
            mWidthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(display);
            mHeightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(display);
        }
        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(display, realSize);
            mWidthPixels = realSize.x;
            mHeightPixels = realSize.y;
        }
        catch (Exception ignored)
        {
        }
    }

请参阅此帖子以供参考: Get screen dimensions in pixels

【讨论】:

  • 我有大约 15 台测试设备,但在其中一些设备上失败了,例如它不适用于摩托罗拉 Milestone 或中兴手机等某些型号。
  • 返回值不精确,因为getMetrics(和display.getWidht(),或display.getHeight())返回的值可用于您的应用程序(例如,它不包含操作栏高度)。因此,在 1280x800 屏幕上,您可以获得 1260x800 或 1280x780 等值。
  • 正如 STeN 所提到的,这种计算对于某些设备是不正确的。例如,此代码报告 Droid Bionic 的 3" 屏幕,它实际上有一个 4.3" 屏幕。 Bionic 上 xdpi 和 ydpi 的返回值分别为 368、365,可能是由于 PenTile 显示或摩托罗拉混淆所致。此设备的实际 DPI 为 sqrt(960^2 + 540^2) / 4.3 = ~256 dpi。
  • 因此,对于 Droid Bionic 和其他一些设备,如果使用 DisplayMetrics.densityDpi 返回的近似 DPI 而不是使用 xdpi/ydpi,您将获得更准确的屏幕尺寸。
  • 说我的三星 Galaxy Ace S5830I 是 15 英寸 - 显然不是这样!
【解决方案4】:

最后使用 Math.round 获取当前大小。

 DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    double x = Math.pow(dm.widthPixels/dm.xdpi,2);
    double y = Math.pow(dm.heightPixels/dm.ydpi,2);
    double screenInches = Math.sqrt(x+y);
    Log.d("debug","Screen inches : " + screenInches);

screenInches=  (double)Math.round(screenInches * 10) / 10;

【讨论】:

    【解决方案5】:

    以下代码 sn-p 将帮助您获得 以英寸为单位的屏幕尺寸

    public static double getScreenSizeInches(Activity activity){
        WindowManager windowManager = activity.getWindowManager();
        Display display = windowManager.getDefaultDisplay();
        DisplayMetrics displayMetrics = new DisplayMetrics();
        display.getMetrics(displayMetrics);
    
        // since SDK_INT = 1;
        int mWidthPixels = displayMetrics.widthPixels;
        int mHeightPixels = displayMetrics.heightPixels;
    
        // includes window decorations (statusbar bar/menu bar)
        if (Build.VERSION.SDK_INT >= 14 && Build.VERSION.SDK_INT < 17) {
            try{
                mWidthPixels = (Integer) Display.class.getMethod("getRawWidth").invoke(display);
                mHeightPixels = (Integer) Display.class.getMethod("getRawHeight").invoke(display);
            } 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(display, realSize);
                mWidthPixels = realSize.x;
                mHeightPixels = realSize.y;
            } catch (Exception ignored) {}
        }
    
        DisplayMetrics dm = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(dm);
        double x = Math.pow(mWidthPixels / dm.xdpi, 2);
        double y = Math.pow(mHeightPixels / dm.ydpi, 2);
        return Math.sqrt(x + y);
    }
    

    希望对您有所帮助。

    【讨论】:

    • 给出错误的结果。我有模拟器屏幕 4'65 结果是 4'59。虽然它比其他解决方案更好。他们都给了我 4'3
    【解决方案6】:

    我用这个来得到真正的尺寸

    final DisplayMetrics metrics = new DisplayMetrics();
    final WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        windowManager.getDefaultDisplay().getRealMetrics(metrics);
    }
    else {
        windowManager.getDefaultDisplay().getMetrics(metrics);
    }
    int realHeight = metrics.heightPixels; // This is real height
    int realWidth = metrics.widthPixels; // This is real width
    

    【讨论】:

      【解决方案7】:

      我已经尝试了其他答案中提到的大多数方法,但这些方法在特定设备上失败了。所以这是我对解决这个问题的一点贡献。代码是用 Kotlin 编写的

      获取 DisplayMetrics 对象:

          val manager = mContext.getSystemService(Context.WINDOW_SERVICE) as WindowManager
          val displayMetrics = DisplayMetrics()
          manager.getDefaultDisplay().getMetrics(displayMetrics)
      

      以英寸为单位计算屏幕宽度:

          val widthInDotPoints : Double = (displayMetrics.widthPixels * (160 * 1.0 /displayMetrics.densityDpi))
          val widthInInches : Double = width / displayMetrics.xdpi
      

      在这里,我使用 widthPixels 以点 (dp) 为单位计算了设备的宽度,然后将其转换为以英寸为单位的宽度。我使用 160 .i.e DisplayMetrics.DENSITY_MEDIUM 作为转换因子将 widthPixels 转换为 widthInDotPoints。

      同样,以英寸为单位计算屏幕高度:

          val heightInDotPoints : Double = (displayMetrics.heightPixels * (160 * 1.0 /displayMetrics.densityDpi))
          val heightInInches : Double = height / displayMetrics.ydpi
      

      【讨论】:

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