如何检查 Android 设备是 HDPI 屏幕还是 MDPI 屏幕?

我想检查这个通过互联网获取不同的图像。如何做到这一点?

71159 次浏览
density = getResources().getDisplayMetrics().density;


// return 0.75 if it's LDPI
// return 1.0 if it's MDPI
// return 1.5 if it's HDPI
// return 2.0 if it's XHDPI
// return 3.0 if it's XXHDPI
// return 4.0 if it's XXXHDPI

你可以用以下方法检查屏幕密度:

switch (getResources().getDisplayMetrics().densityDpi) {
case DisplayMetrics.DENSITY_LOW:
// ...
break;
case DisplayMetrics.DENSITY_MEDIUM:
// ...
break;
case DisplayMetrics.DENSITY_HIGH:
// ...
break;
case DisplayMetrics.DENSITY_XHIGH:
// ...
break;
}

EDIT 注意,随着 Android 的发展,其他值应该包含在 switch案例中。在此编辑时,这包括 DisplayMetrics.DENSITY_TVDisplayMetrics.DENSITY_XXHIGH。有关最新信息,请咨询 那些文件; 我不打算费心维护这个答案。

在一些设备上(我的设备是 Galaxy Tab3) ,犯罪分子的密度和密度 Dpi 都返回奇怪的值,比如1.33(密度) ,213(密度 Dpi)。因此,我的解决方案是添加这些标志:

< item type = “ bool” Name = “ is _ mdpi”> [ bool ] < br/> < item Type = “ bool” Name = “ is _ hdpi”> [ bool ] < br/> < item Type = “ bool” Name = “ is _ xhdpi”> [ bool ] < br/> < item Type = “ bool” Name = “ is _ xxhdpi”> [ bool ] < br/>

到4个 values.xml 文件,将这些文件放在相应的 res/value-[ xxx ]/文件夹下。

根据以上答案,我将它们组合在一起,创建了以下函数:

    public static String getDeviceDensity(Context context){
String deviceDensity = "";
switch (context.getResources().getDisplayMetrics().densityDpi) {
case DisplayMetrics.DENSITY_LOW:
deviceDensity =  0.75 + " ldpi";
break;
case DisplayMetrics.DENSITY_MEDIUM:
deviceDensity =  1.0 + " mdpi";
break;
case DisplayMetrics.DENSITY_HIGH:
deviceDensity =  1.5 + " hdpi";
break;
case DisplayMetrics.DENSITY_XHIGH:
deviceDensity =  2.0 + " xhdpi";
break;
case DisplayMetrics.DENSITY_XXHIGH:
deviceDensity =  3.0 + " xxhdpi";
break;
case DisplayMetrics.DENSITY_XXXHIGH:
deviceDensity =  4.0 + " xxxhdpi";
break;
default:
deviceDensity = "Not found";
}
return deviceDensity;
}

现在,您希望在哪个设备上获取密度信息,以及将使用哪个文件夹,只需在该活动中添加上述方法,并在 onCreate 中添加以下一行

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);


Log.d("Screen Density: ", Helper.getDeviceDensity(this));


}

截至2018年,您可以使用以下方法-

    public static String getDeviceDensityString(Context context) {
switch (context.getResources().getDisplayMetrics().densityDpi) {
case DisplayMetrics.DENSITY_LOW:
return "ldpi";
case DisplayMetrics.DENSITY_MEDIUM:
return "mdpi";
case DisplayMetrics.DENSITY_TV:
case DisplayMetrics.DENSITY_HIGH:
return "hdpi";
case DisplayMetrics.DENSITY_260:
case DisplayMetrics.DENSITY_280:
case DisplayMetrics.DENSITY_300:
case DisplayMetrics.DENSITY_XHIGH:
return "xhdpi";
case DisplayMetrics.DENSITY_340:
case DisplayMetrics.DENSITY_360:
case DisplayMetrics.DENSITY_400:
case DisplayMetrics.DENSITY_420:
case DisplayMetrics.DENSITY_440:
case DisplayMetrics.DENSITY_XXHIGH:
return "xxhdpi";
case DisplayMetrics.DENSITY_560:
case DisplayMetrics.DENSITY_XXXHIGH:
return "xxxhdpi";
}
}

但正如@Ted 所指出的,在使用之前,一定要查阅官方文件

用于 React Nativeto 检查当前设备的大小

import { PixelRatio } from 'react-native';
switch(PixelRatio.get()) {
case 1:
return "mdpi";
case 1.5:
return "hdpi";
case 2:
return "xhdpi";
case 3:
return "xxhdpi";
case 3.5:
return "xxxhdpi";
}

您应该总是检查间隔不仅断点值!

根据机器人文档: https://developer.android.com/reference/android/util/DisplayMetrics

在 Kotlin 你可以这样想:

    when {
val density: Float = context?.resources?.displayMetrics?.density


// ldpi
(density <= 0.75f) -> mulFactor = 0.75f


// mdpi
(density >= 0.75f && density <= 1.0f) -> mulFactor = 1.0f


// hdpi
(density > 1.0f && density <= 1.5f) -> mulFactor = 1.5f


// xhdpi
(density > 1.5f && density <= 2.0f) -> mulFactor = 2.0f


// xxhdpi
(density > 2.0f && density <= 3.0f) -> mulFactor = 3.0f


// xxxhdpi
(density > 3.0f) -> mulFactor = 4.0f


}
return mulFactor;