получить плотность экрана программно в Android? - PullRequest
493 голосов
/ 02 июля 2010

Как программно получить плотность экрана в андроиде?

Я имею в виду: Как найти разрешение экрана текущего устройства?

Ответы [ 16 ]

510 голосов
/ 02 июля 2010

Вы можете получить информацию на дисплее из DisplayMetrics struct:

DisplayMetrics metrics = getResources().getDisplayMetrics();

Хотя Android не использует прямое отображение пикселей, он использует несколько квантованных независимых от плотности пикселейЗатем значения масштабируются до фактического размера экрана.Таким образом, свойство metrics.densityDpi будет одной из DENSITY_xxx констант (120, 160, 213, 240, 320, 480 или 640 dpi).

Если вам нужна фактическая плотность пикселей lcd * (возможно, для приложения OpenGL), вы можете получить ее из свойств metrics.xdpi и metrics.ydpi для горизонтальной и вертикальной плотности соответственно.

Если вы ориентируетесь API уровней раньше, чем 4. metrics.density свойством является плавающей точкой коэффициента масштабирования от исходной плотности (160dpi).То же значение, теперь предоставляемое metrics.densityDpi, может быть вычислено

int densityDpi = (int)(metrics.density * 160f);
352 голосов
/ 08 июня 2012

Это также работает:

 getResources().getDisplayMetrics().density;

Это даст вам:

0,75 - ldpi

1.0 - mdpi

1.5 - hdpi

2.0 - xhdpi

3.0 - xxhdpi

4.0 - xxxhdpi

enter image description here

ref: плотность

143 голосов
/ 16 марта 2011
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 и выше.

60 голосов
/ 08 октября 2013

Ответ Бланделла как статический вспомогательный метод:

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";
}
44 голосов
/ 02 октября 2011

Попробуйте это:

DisplayMetrics dm = context.getResources().getDisplayMetrics();
int densityDpi = dm.densityDpi;
35 голосов
/ 02 июля 2010

Чтобы получить 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;
27 голосов
/ 27 октября 2015

Вот константы плотности, источник :

enter image description here

В дополнение к стандартным плотностям, 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;
}
27 голосов
/ 24 июня 2014

Следующий ответ - небольшое улучшение, основанное на ответе 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
}
19 голосов
/ 17 октября 2013

На самом деле, если вы хотите иметь реальное отображение 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 дисплея должно быть Density * xdpi .. но я не уверен, что это правильный способ!

15 голосов
/ 10 декабря 2012

Это должно помочь вашей активности ...

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
...