有没有办法确定android物理屏幕高度(以厘米或英寸为单位)?

问题描述 投票:0回答:8

我需要确切知道设备上的屏幕有多大(以实际长度单位表示),以便我可以计算重力加速度(以每毫秒像素为单位)。

Android API 中是否有为此的方法?

android screen resolution
8个回答
93
投票

使用以下内容:

    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)
        {
        }
    }

参考这篇文章: 获取屏幕尺寸(以像素为单位)


9
投票

要获取当前大小,请在最后使用 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;

4
投票

android 开发者屏幕信息。

使用

xdpi * widthPixels
ydpi * heightPixels
可能会得到你想要的东西,我想。


4
投票

以下代码片段将帮助您获取以英寸为单位的屏幕尺寸

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);
}

希望这有帮助。


1
投票

我已经尝试了其他答案中提到的大多数方法,但这些方法在特定设备上失败。这是我对解决这个问题的一些贡献。代码是用 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 即 DisplayMetrics.DENSITY_MEDIUM 作为转换因子将 widthPixels 转换为 widthInDotPoints。

类似地,计算屏幕高度(以英寸为单位):

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

0
投票

我用它来获得实际尺寸

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

0
投票

某些设备(例如 Pixel)返回的 xdpi、ydpi 不正确。 所以你可以根据密度来计算。

   fun getScreenSizeInInches(context: Context): Float {
    try {
        val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
        val display = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            context.display
        } else {
            windowManager.defaultDisplay
        }

        val metrics = DisplayMetrics()
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
            display?.getRealMetrics(metrics)
        } else {
            display?.getMetrics(metrics)
        }
        // Calculate the diagonal size in inches using Pythagorean theorem
        val widthInInches = metrics.widthPixels / getDPIFromDensity(metrics.density)
        val heightInInches = metrics.heightPixels / getDPIFromDensity(metrics.density)
        val diagonalInInches = sqrt(widthInInches.pow(2) + heightInInches.pow(2))
        Log.d("diagonalInInches", metrics.toString() + "\n" + diagonalInInches.toString())
        return diagonalInInches
    } catch (e: Exception) {
        return 6.0f
    }
}

private fun getDPIFromDensity(density: Float): Float {
    val dpi = 160 * density
    Log.d("getDPIFromDensity", dpi.toString())
    return dpi
}

-4
投票

您需要使用屏幕密度来计算。

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

© www.soinside.com 2019 - 2024. All rights reserved.