получение плотности экрана программно в android?
Как получить плотность экрана программно в Android?
Я имею в виду: как найти dpi экрана текущего устройства?
16 ответов:
вы можете получить информацию о дисплее из DisplayMetrics struct:
DisplayMetrics metrics = getResources().getDisplayMetrics();
хотя Android не использует прямое отображение пикселей, он использует несколько квантованных значений независимых от плотности пикселей, а затем масштабируется до фактического размера экрана. Так что
metrics.densityDpi
отель будет одним изDENSITY_xxx
константы (120
,160
,213
,240
,320
,480
или640
dpi).Если вам нужны фактический ЖК-дисплей плотность пикселей (возможно, для приложения OpenGL) вы можете получить его от
metrics.xdpi
иmetrics.ydpi
свойства для горизонтальной и вертикальной плотности соответственно.если вы ориентируетесь на уровни API ранее, чем 4. Элемент
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
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 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 }
вот константы плотности,источник:
есть, в дополнение к стандартным плотностям, 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; }
на самом деле, если вы хотите иметь реальный дисплей dpi ответ где-то посередине если вы запрашиваете метрики отображения:
DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int dpiClassification = dm.densityDpi; float xDpi = dm.xdpi; float yDpi = dm.ydpi;
densityDpi * 160 даст вам значения / предложение, какую плотность вы должны использовать
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
, как указано в предыдущих постах
но
dm.xdpi
не будет давать вам всегда реальный dpi данного дисплея: Пример:Device: Sony ericsson xperia mini pro (SK17i) Density: 1.0 (e.g. suggests you use 160dpi resources) xdpi: 193.5238 Real device ppi is arround 193ppi Device: samsung GT-I8160 (Samsung ace 2) Density 1.5 (e.g. suggests you use 240dpi resources) xdpi 160.42105 Real device ppi is arround 246ppi
так что, возможно, реальный dpi дисплея должен быть Плотность*xdpi .. но я не уверен, что это правильный способ сделать!
Это должно помочь в вашей деятельности ...
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"; } }
Вы Должны Попробовать Это. Просто добавлен метод, который найдет и покажет тост. То, в какую категорию попадает устройство.
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
попробуйте это...
В Котлин
fun determineScreenDensityCode(): String { return when (resources.displayMetrics.densityDpi) { DisplayMetrics.DENSITY_LOW -> "ldpi" DisplayMetrics.DENSITY_MEDIUM -> "mdpi" DisplayMetrics.DENSITY_HIGH -> "hdpi" DisplayMetrics.DENSITY_XHIGH, DisplayMetrics.DENSITY_280 -> "xhdpi" DisplayMetrics.DENSITY_XXHIGH, DisplayMetrics.DENSITY_360, DisplayMetrics.DENSITY_400, DisplayMetrics.DENSITY_420 -> "xxhdpi" DisplayMetrics.DENSITY_XXXHIGH, DisplayMetrics.DENSITY_560 -> "xxxhdpi" else -> "Unknown code ${resources.displayMetrics.densityDpi}" } }
вы можете позвонив по
println("density: ${determineScreenDensityCode()}")
и выход будетSystem.out: density: xxxhdpi