我有一部三星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。但规格上说屏幕尺寸是5英寸。
我也试过我的三星Galaxy SII,它给了我:
width = 480
heigh = 800
dens = 240
对应于screenInches
为3.887而不是4.3(如规范中所说)
为什么在以英寸为单位声明的尺寸与我获得的尺寸之间存在这种差异?
EDIT:似乎densityDpi返回这些值之一:(120,160,213,240,320,480或640 dpi)
我不认为你可以得到真正的屏幕密度从DisplayMetrics.densityDpi。它只能返回一个特定的常数值。DisplayMetrics文档中说
屏幕密度,以每英寸点数表示。可以是DENSITY_LOW, DENSITY_MEDIUM,或DENSITY_HIGH。
但是Android兼容性定义文档(CDD)。提供更全面的解释
屏幕密度
Android UI框架定义了一套标准逻辑密度帮助应用程序开发人员瞄准应用程序资源。设备实现必须报告以下情况之一逻辑Android框架密度通过android.util.DisplayMetrics api,并且必须在这个标准密度。
> 120dpi,称为ldpi
> 160dpi,称为'mdpi'
> 213 dpi,称为"tvdpi"
> 240dpi,即hdpi
> 320dpi,即xhdpi
> 400dpi,称为'400dpi'
> 480 dpi,称为"xxhdpi"
> 640 dpi,称为"xxxhdpi"
设备实现应该定义标准的Android框架密度,在数字上最接近物理密度的屏幕,除非逻辑密度推动报告的屏幕尺寸低于支持的最小尺寸。如果标准Android框架密度在数值上最接近物理密度密度导致屏幕尺寸小于最小的屏幕支持兼容屏幕尺寸(320dp宽度)、设备实现应该报告下一个最低标准的Android框架密度。
您可以从DespalyMetrics中获得X和Y维度中每英寸屏幕的精确物理像素。xdpi和DespalyMetrics.ydpi
densityDpi
返回以点每英寸表示的屏幕密度,但这个值是近似值。
densityDpi
由显示逻辑密度density
计算得出。这是密度无关像素单元的比例因子,其中一个DIP是大约160 dpi屏幕上的一个像素(例如240x320, 1.5"x2"屏幕),提供系统显示的基线。因此,在160dpi屏幕上,该密度值将为1;在120 dpi的屏幕上,它将是0.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.451Ydpi = 439.351
我的手机规格说~441 ppi像素密度,所以我认为这些值是正确的。
因此,得到平均值440.901 DPI的结果是:
screenInches = 4.9963