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

Pra*_*een 505 android dpi screen-density

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

我的意思是:如何找到当前设备的屏幕dpi?

jos*_*rry 518

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

DisplayMetrics metrics = getResources().getDisplayMetrics();
Run Code Online (Sandbox Code Playgroud)

虽然Android不使用直接像素映射,但它使用少量量化的密度独立像素值,然后缩放到实际屏幕大小.因此,metrics.densityDpi物业将是一个DENSITY_xxx常数(120,160,213,240,320,480640DPI).

如果你需要的实际 LCD像素密度(也许是一个OpenGL应用程序),你可以从一开始就metrics.xdpimetrics.ydpi性质分别为水平和垂直密度.

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

int densityDpi = (int)(metrics.density * 160f);
Run Code Online (Sandbox Code Playgroud)

  • 这篇文章来自两年多以前,但这是Google首次针对此搜索发布的内容,因此对于任何发现此问题的人来说,您不再需要乘以160. (38认同)
  • 注意:您可能需要这个更新的API:`getWindowManager().getDefaultDisplay().getRealMetrics(metrics);`这是在API 17中正式添加的,但我很惊讶地发现它甚至在我试过的4.0设备上也能正常工作. (6认同)
  • 不再是哪个版本? (5认同)
  • 还有getResources()。getDisplayMetrics()。densityDpi (2认同)

Blu*_*ell 357

这也有效:

 getResources().getDisplayMetrics().density;
Run Code Online (Sandbox Code Playgroud)

这会给你:

0.75 - ldpi

1.0 - mdpi

1.5 - hdpi

2.0 - xhdpi

3.0 - xxhdpi

4.0 - xxxhdpi

在此输入图像描述

ref:密度

  • +1当您无法直接访问"WindowManager"(例如在Loader中)时,此方法有效.只需乘以160即可 (10认同)
  • 这将为`tvdpi`提供1.3312501.有关`tvdpi`的更多信息,请参阅[此处](https://plus.google.com/105051985738280261832/posts/6eWwQvFGLV8) (3认同)
  • API Level 16添加了xxdpi,这里将其转换为3.0. (2认同)
  • 怎么样tvdpi? (2认同)
  • Nexus 7报告1.3,为什么支架应该进入? (2认同)

Mit*_*kum 144

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;
}
Run Code Online (Sandbox Code Playgroud)

这将适用于API级别4及更高级别.


qwe*_*guy 61

Blundell作为静态辅助方法答案:

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";
}
Run Code Online (Sandbox Code Playgroud)

  • 嘿@Andrew S,使用elses不会改变代码的效率,因为每个if都会立即返回.删除大括号只是一种风格问题,恕我直言使维护代码时更容易出错. (3认同)

Wiz*_*ist 44

试试这个:

DisplayMetrics dm = context.getResources().getDisplayMetrics();
int densityDpi = dm.densityDpi;
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这个,因为它依赖于上下文而不是活动. (5认同)

Jer*_*nes 36

要获得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;
Run Code Online (Sandbox Code Playgroud)

  • dm.densityDpi返回DENSITY_LOW或DENSITY_MEDIUM或DENSITY_HIGH.xhdpi怎么样?有没有DENSITY_XHIGH左右? (4认同)

Aya*_*fov 31

以下是密度常数,来源:

在此输入图像描述

除标准密度外,还有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 
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用以下方法找到密度常数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;
}
Run Code Online (Sandbox Code Playgroud)


San*_*San 27

以下答案是基于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
}
Run Code Online (Sandbox Code Playgroud)

  • 对于我的Nexus 5X(默认的谷歌设备顺便说一句),这不会返回正确的结果.器件密度为xxhdpi,返回的双密度约为2.6. (3认同)
  • @San在任何情况下都不需要&amp;&amp;,只要您始终检查&gt; =,否则else if将在第一个为真的条件下终止。 (2认同)

Mar*_*lmo 19

Actualy如果你想拥有真正的显示dpi,如果你查询显示指标,答案就介于两者之间:

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int dpiClassification = dm.densityDpi;
float xDpi = dm.xdpi;
float yDpi = dm.ydpi;
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

如先前帖子中所述

但是dm.xdpi不会总是给出给定显示的REAL 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
Run Code Online (Sandbox Code Playgroud)

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


小智 16

这应该对你的活动有所帮助......

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);

}
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)


Fel*_*ipe 12

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;
}
Run Code Online (Sandbox Code Playgroud)


Dis*_*ame 10

如果要从服务中检索密度,它的工作方式如下:

WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics metrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(metrics);
Run Code Online (Sandbox Code Playgroud)


Rob*_*ond 7

这应该工作.

DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int width = dm.widthPixels; //320
int height = dm.heightPixels; //480
Run Code Online (Sandbox Code Playgroud)

  • 显示器的像素大小不是密度. (4认同)

Jar*_*ler 7

还有一个答案:

/**
* @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";
    }
}
Run Code Online (Sandbox Code Playgroud)


Avi*_*rma 7

你应该试试这个.刚添加了一个可以找到并显示Toast的方法.设备落入哪个类别.

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;
 }
Run Code Online (Sandbox Code Playgroud)

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