当我在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)。
答案 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,我可以使用xdpi
和ydpi
。
将这些应用到我的三星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).提供了更全面的解释
获取X和Y维度中每英寸屏幕的确切物理像素数屏幕密度
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 框架密度。