如何在Android中以编程方式获取屏幕密度?
我的意思是:如何查找当前设备的屏幕dpi?
如何在Android中以编程方式获取屏幕密度?
我的意思是:如何查找当前设备的屏幕dpi?
您可以从DisplayMetrics结构中获取有关显示的信息:
DisplayMetrics metrics = getResources().getDisplayMetrics();
尽管Android不使用直接的像素映射,但它使用一些量化的独立像素密度值,然后缩放到实际屏幕大小。因此,metrics.densityDpi
属性将是DENSITY_xxx
常量之一(120
、160
、213
、240
、320
、480
或640
dpi)。metrics.xdpi
和metrics.ydpi
属性。metrics.density
属性是从参考密度(160dpi)的浮点缩放因子。现在由metrics.densityDpi
提供相同的值可以进行计算。int densityDpi = (int)(metrics.density * 160f);
getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
官方在API 17中添加了它,但是我很惊讶地发现,即使在我尝试过的4.0设备上,它也能够正常工作。 - benkcWindowManager
(例如在Loader
内部)时,可以使用此方法。只需将其乘以160即可。 - Michał KlimczakDisplayMetrics 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及更高级别。
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";
}
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;
}
试试这个:
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;
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将为您提供值/建议,告诉您应该使用哪种密度
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,但我不确定这是否是正确的方法!
这应该有助于您的活动...
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
getDisplayMetrics().xdpi
,它应该返回设备的实际 dpi 值。请注意,由于制造商没有一致正确地设置这个值,因此您不能仅仅依赖它们。可悲而真实的是:关于实际 dpi 的信息不可用。来源:https://groups.google.com/d/msg/android-developers/g56jV0Hora0/9d8p8QJg1ksJ - sulaigetResources().getDisplayMetrics().xdpi
和getResources().getDisplayMetrics().ydpi
将会给你实际的水平和垂直密度,在大多数情况下是不同的。 - Ωmega