声明的大小(以英寸为单位)与使用DisplayMetrics获得的大小之间的差异

时间:2014-05-05 14:39:33

标签: android android-screen

我有一个Samsung Galaxy S4 Active

当我在Android上执行时,代码如下:

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int width=dm.widthPixels;
int height=dm.heightPixels;
int dens=dm.densityDpi;
double wi=(double)width/(double)dens;
double hi=(double)height/(double)dens;
double x = Math.pow(wi,2);
double y = Math.pow(hi,2);
double screenInches = Math.sqrt(x+y);

我获得了

width = 1080
heigh = 1920
dens = 480

那么,使用的公式是否正确,screenInches是4.589。但是规范说screenInches的大小是5。

我也试过我的Samsung Galaxy SII给了我:

width = 480
heigh = 800
dens = 240

对应于screenInches 3.887而不是4.3(如规格中所述)

为什么声明的英寸大小与我获得的大小之间存在差异?

编辑:看来densityDpi会返回以下值之一:(120,160,213,240,320,480或640 dpi)。

2 个答案:

答案 0 :(得分:0)

densityDpi返回以每英寸点数表示的屏幕密度,但此值近似。

densityDpi是从density计算的,这是显示的逻辑密度。这是密度独立像素单位的缩放系数,其中一个DIP是大约160 dpi屏幕上的一个像素(用于例如240x320,1.5“x2”屏幕),提供系统显示的基线。因此,在160dpi屏幕上,此密度值将为1;在120 dpi的屏幕上它将是.75;等。

如文档中所述:

This value does not exactly follow the real screen size (as given by xdpi and ydpi) , but rather is used to scale the size of the overall UI in steps based on gross changes in the display dpi.

因此,为了获得正确的DPI,我可以使用xdpiydpi

将这些应用到我的三星Galaxy S4 Active,我获得:

xdpi = 442.451 ydpi = 439.351

我的手机规格说~441 ppi像素密度,所以我认为这些值是正确的。

因此,得到平均值440.901 DPI的结果是:

screenInches = 4.9963

答案 1 :(得分:0)

我不认为你可以从DisplayMetrics.densityDpi获得真正的屏幕密度。它只能返回一个特定的常量值。 DisplayMetrics documentation

  

屏幕密度以每英寸点数表示。可以是DENSITY_LOW,DENSITY_MEDIUM或DENSITY_HIGH。

但是Android Compatibility Definition Document (CDD).提供了更全面的解释

  

屏幕密度
  Android UI框架定义了一组标准   逻辑密度,以帮助应用程序开发人员定位应用程序   资源。   设备实现必须报告以下之一   逻辑Android框架密度通过   android.util.DisplayMetrics API,必须执行应用程序   这个标准密度。   
> 120 dpi,被称为' ldpi'   
> 160 dpi,被称为' mdpi'   
> 213 dpi,被称为' tvdpi'   
> 240 dpi,被称为' hdpi'   
> 320 dpi,被称为' xhdpi'   
> 400 dpi,被称为' 400dpi'   
> 480 dpi,被称为' xxhdpi'   
> 640 dpi,被称为&x; xxxhdpi'   
  设备实现应该定义   标准的Android框架密度,在数值上最接近   屏幕的物理密度,除非逻辑密度推动   报告的屏幕尺寸低于支持的最小值。如果标准   Android框架密度在数值上最接近物理   密度导致屏幕尺寸小于最小值   支持兼容的屏幕尺寸(320 dp宽度),设备   实现应该报告下一个最低标准的Android   框架密度。

您可以从DespalyMetrics.xdpiDespalyMetrics.ydpi

获取X和Y维度中每英寸屏幕的确切物理像素数