在android中以编程方式获取屏幕密度?

如何在android中以编程方式获得屏幕密度?

我的意思是如何find当前设备的屏幕dpi?

您可以从DisplayMetrics结构中获取显示信息:

 DisplayMetrics metrics = getResources().getDisplayMetrics(); 

虽然Android不使用直接的像素映射,但是它使用了一些量化的密度无关像素值,然后缩放到实际的屏幕大小。 那么metrics.densityDpi属性将是DENSITY_??? 常数(120,160,213,240,320,480或640dpi)。

如果您需要实际的 LCD像素密度(可能是OpenGL应用程序),则可以分别从metrics.xdpimetrics.ydpi属性中获取水平和垂直密度。

如果您的目标是早于4的API级别metrics.density属性是来自参考密度(160dpi)的浮点缩放因子。 现在可以计算metrics.densityDpi提供的相同值

 int densityDpi = (int)(metrics.density * 160f); 

这也适用:

  getResources().getDisplayMetrics().density; 

这会给你:

0.75 – ldpi

1.0 – mdpi

1.5 – hdpi

2.0 – xhdpi

3.0 – xxhdpi

4.0 – xxxhdpi

在这里输入图像描述

ref:密度

 DisplayMetrics metrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(metrics); switch(metrics.densityDpi){ case DisplayMetrics.DENSITY_LOW: break; case DisplayMetrics.DENSITY_MEDIUM: break; case DisplayMetrics.DENSITY_HIGH: break; } 

这将在API lavel 4或更高版本中工作。

布伦德尔的答案是一个静态的辅助方法:

 private static String getDensityName(Context context) { float density = context.getResources().getDisplayMetrics().density; if (density >= 4.0) { return "xxxhdpi"; } if (density >= 3.0) { return "xxhdpi"; } if (density >= 2.0) { return "xhdpi"; } if (density >= 1.5) { return "hdpi"; } if (density >= 1.0) { return "mdpi"; } return "ldpi"; } 

尝试这个:

 DisplayMetrics dm = context.getResources().getDisplayMetrics(); int densityDpi = dm.densityDpi; 

要获得dpi:

 DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); // will either be DENSITY_LOW, DENSITY_MEDIUM or DENSITY_HIGH int dpiClassification = dm.densityDpi; // these will return the actual dpi horizontally and vertically float xDpi = dm.xdpi; float yDpi = dm.ydpi; 

下面的答案是基于qwertzguy的答案的一个小改进。

 double density = getResources().getDisplayMetrics().density; if (density >= 4.0) { //"xxxhdpi"; } else if (density >= 3.0 && density < 4.0) { //xxhdpi } else if (density >= 2.0) { //xhdpi } else if (density >= 1.5 && density < 2.0) { //hdpi } else if (density >= 1.0 && density < 1.5) { //mdpi } 

实际上,如果你想有真正的显示dpi ,如果你查询显示指标,答案是介于两者之间:

 DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int dpiClassification = dm.densityDpi; float xDpi = dm.xdpi; float yDpi = dm.ydpi; 

densityDpi * 160会给你你应该使用的密度值/build议

 0.75 - ldpi - 120 dpi 1.0 - mdpi - 160 dpi 1.5 - hdpi - 240 dpi 2.0 - xhdpi - 320 dpi 3.0 - xxhdpi - 480 dpi 4.0 - xxxhdpi - 640 dpi 

如以前的post所述

dm.xdpi不会总是给出显示的实际dpi :例如:

 Device: Sony ericsson xperia mini pro (SK17i) Density: 1.0 (eg suggests you use 160dpi resources) xdpi: 193.5238 Real device ppi is arround 193ppi Device: samsung GT-I8160 (Samsung ace 2) Density 1.5 (eg suggests you use 240dpi resources) xdpi 160.42105 Real device ppi is arround 246ppi 

所以也许真正的显示dpi应该是Density * xdpi ..但我不知道这是否是正确的方法!

这里是密度常数, 来源 :

在这里输入图像描述

除了标准密度外,还有5个中级密度。 考虑到这个事实,下面的代码将是一个完整的工作示例:

 float density = getResources().getDisplayMetrics().density; if (density == 0.75f) { // LDPI } else if (density >= 1.0f && density < 1.5f) { // MDPI } else if (density == 1.5f) { // HDPI } else if (density > 1.5f && density <= 2.0f) { // XHDPI } else if (density > 2.0f && density <= 3.0f) { // XXHDPI } else { // XXXHDPI } 

或者使用densityDpi方法:

 int densityDpi = getResources().getDisplayMetrics().densityDpi; switch (densityDpi) { case DisplayMetrics.DENSITY_LOW: // LDPI break; case DisplayMetrics.DENSITY_MEDIUM: // MDPI break; case DisplayMetrics.DENSITY_TV: case DisplayMetrics.DENSITY_HIGH: // HDPI break; case DisplayMetrics.DENSITY_XHIGH: case DisplayMetrics.DENSITY_280: // XHDPI break; case DisplayMetrics.DENSITY_XXHIGH: case DisplayMetrics.DENSITY_360: case DisplayMetrics.DENSITY_400: case DisplayMetrics.DENSITY_420: // XXHDPI break; case DisplayMetrics.DENSITY_XXXHIGH: case DisplayMetrics.DENSITY_560: // XXXHDPI break; } 

这应该有助于你的活动…

 void printSecreenInfo(){ Display display = getWindowManager().getDefaultDisplay(); DisplayMetrics metrics = new DisplayMetrics(); display.getMetrics(metrics); Log.i(TAG, "density :" + metrics.density); // density interms of dpi Log.i(TAG, "D density :" + metrics.densityDpi); // horizontal pixel resolution Log.i(TAG, "width pix :" + metrics.widthPixels); // actual horizontal dpi Log.i(TAG, "xdpi :" + metrics.xdpi); // actual vertical dpi Log.i(TAG, "ydpi :" + metrics.ydpi); } 

输出:

 I/test( 1044): density :1.0 I/test( 1044): D density :160 I/test( 1044): width pix :800 I/test( 1044): xdpi :160.0 I/test( 1044): ydpi :160.42105 
 public static String getDensity(Context context) { String r; DisplayMetrics metrics = new DisplayMetrics(); if (!(context instanceof Activity)) { r = "hdpi"; } else { Activity activity = (Activity) context; activity.getWindowManager().getDefaultDisplay().getMetrics(metrics); if (metrics.densityDpi <= DisplayMetrics.DENSITY_LOW) { r = "ldpi"; } else if (metrics.densityDpi <= DisplayMetrics.DENSITY_MEDIUM) { r = "mdpi"; } else { r = "hdpi"; } } return r; } 

如果你想从一个服务检索密度,它的工作原理是这样的:

 WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics metrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(metrics); 

这应该工作。

 DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int width = dm.widthPixels; //320 int height = dm.heightPixels; //480 

还有一个答案:

 /** * @return "ldpi", "mdpi", "hdpi", "xhdpi", "xhdpi", "xxhdpi", "xxxhdpi", "tvdpi", or "unknown". */ public static String getDensityBucket(Resources resources) { switch (resources.getDisplayMetrics().densityDpi) { case DisplayMetrics.DENSITY_LOW: return "ldpi"; case DisplayMetrics.DENSITY_MEDIUM: return "mdpi"; case DisplayMetrics.DENSITY_HIGH: return "hdpi"; case DisplayMetrics.DENSITY_XHIGH: return "xhdpi"; case DisplayMetrics.DENSITY_XXHIGH: return "xxhdpi"; case DisplayMetrics.DENSITY_XXXHIGH: return "xxxhdpi"; case DisplayMetrics.DENSITY_TV: return "tvdpi"; default: return "unknown"; } } 

你应该尝试这个。 刚刚添加了一个方法,将find并显示吐司。 在哪个类别的设备下跌。

 public static int differentDensityAndScreenSize(Context context) { int value = 20; String str = ""; if ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_SMALL) { switch (context.getResources().getDisplayMetrics().densityDpi) { case DisplayMetrics.DENSITY_LOW: str = "small-ldpi"; value = 20; break; case DisplayMetrics.DENSITY_MEDIUM: str = "small-mdpi"; value = 20; break; case DisplayMetrics.DENSITY_HIGH: str = "small-hdpi"; value = 20; break; case DisplayMetrics.DENSITY_XHIGH: str = "small-xhdpi"; value = 20; break; case DisplayMetrics.DENSITY_XXHIGH: str = "small-xxhdpi"; value = 20; break; case DisplayMetrics.DENSITY_XXXHIGH: str = "small-xxxhdpi"; value = 20; break; case DisplayMetrics.DENSITY_TV: str = "small-tvdpi"; value = 20; break; default: str = "small-unknown"; value = 20; break; } } else if ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_NORMAL) { switch (context.getResources().getDisplayMetrics().densityDpi) { case DisplayMetrics.DENSITY_LOW: str = "normal-ldpi"; value = 82; break; case DisplayMetrics.DENSITY_MEDIUM: str = "normal-mdpi"; value = 82; break; case DisplayMetrics.DENSITY_HIGH: str = "normal-hdpi"; value = 82; break; case DisplayMetrics.DENSITY_XHIGH: str = "normal-xhdpi"; value = 90; break; case DisplayMetrics.DENSITY_XXHIGH: str = "normal-xxhdpi"; value = 96; break; case DisplayMetrics.DENSITY_XXXHIGH: str = "normal-xxxhdpi"; value = 96; break; case DisplayMetrics.DENSITY_TV: str = "normal-tvdpi"; value = 96; break; default: str = "normal-unknown"; value = 82; break; } } else if ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE) { switch (context.getResources().getDisplayMetrics().densityDpi) { case DisplayMetrics.DENSITY_LOW: str = "large-ldpi"; value = 78; break; case DisplayMetrics.DENSITY_MEDIUM: str = "large-mdpi"; value = 78; break; case DisplayMetrics.DENSITY_HIGH: str = "large-hdpi"; value = 78; break; case DisplayMetrics.DENSITY_XHIGH: str = "large-xhdpi"; value = 125; break; case DisplayMetrics.DENSITY_XXHIGH: str = "large-xxhdpi"; value = 125; break; case DisplayMetrics.DENSITY_XXXHIGH: str = "large-xxxhdpi"; value = 125; break; case DisplayMetrics.DENSITY_TV: str = "large-tvdpi"; value = 125; break; default: str = "large-unknown"; value = 78; break; } } else if ((context.getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_XLARGE) { switch (context.getResources().getDisplayMetrics().densityDpi) { case DisplayMetrics.DENSITY_LOW: str = "xlarge-ldpi"; value = 125; break; case DisplayMetrics.DENSITY_MEDIUM: str = "xlarge-mdpi"; value = 125; break; case DisplayMetrics.DENSITY_HIGH: str = "xlarge-hdpi"; value = 125; break; case DisplayMetrics.DENSITY_XHIGH: str = "xlarge-xhdpi"; value = 125; break; case DisplayMetrics.DENSITY_XXHIGH: str = "xlarge-xxhdpi"; value = 125; break; case DisplayMetrics.DENSITY_XXXHIGH: str = "xlarge-xxxhdpi"; value = 125; break; case DisplayMetrics.DENSITY_TV: str = "xlarge-tvdpi"; value = 125; break; default: str = "xlarge-unknown"; value = 125; break; } } // The Toast will show the Device falls in Which Categories. Toast.makeText(MainActivity.this, ""+str, Toast.LENGTH_SHORT).show(); return value; } 

http://www.androidwarriors.com/2016/01/how-to-find-different-devices-screen.html

Interesting Posts