在android中以编程方式获取屏幕密度?
如何在android中以编程方式获得屏幕密度?
我的意思是如何find当前设备的屏幕dpi?
您可以从DisplayMetrics结构中获取显示信息:
DisplayMetrics metrics = getResources().getDisplayMetrics();
虽然Android不使用直接的像素映射,但是它使用了一些量化的密度无关像素值,然后缩放到实际的屏幕大小。 那么metrics.densityDpi
属性将是DENSITY_???
常数(120,160,213,240,320,480或640dpi)。
如果您需要实际的 LCD像素密度(可能是OpenGL应用程序),则可以分别从metrics.xdpi
和metrics.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