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


Answers:


221
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

9
在以下
网址中

1
@SteD是否可以判断设备将是什么?例如,考虑在存储桶范围的中间dpi为140的情况下?它是向下还是向上?
2016年

tvdpi约为1.3
Ethan_AI

3
对于nexus 6p,我得到3.5,它将属于哪一类?
Manohar Reddy

2
oneplus3T有2.625,我们应该考虑什么呢?
Parth Anjaria

188

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

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

编辑请注意,随着Android的发展,switch案例中还应包括其他值。从此编辑开始,其中包括DisplayMetrics.DENSITY_TVDisplayMetrics.DENSITY_XXHIGH。请查阅文档以获取最新信息;我不会打扰保持这个答案。


它应该存在于SDK级别4(平台1.6)及更高版本中。您使用的是哪个SDK级别?(在SDK 3中,您可以density按照SteD的建议使用。)
Ted Hopp'2

我需要定位platform1.5。以下答案可能适合我的要求。
virsir 2011年

4
下面的答案现在是上面的答案,需要更通用;)
Neil 2012年

仅供参考,对于某些新设备(例如Nexus 7),您还应该包含DENSITY_TV。
安妮2012年

1
@annie-好点。谢谢。从API级别16开始,它还应包含DENSITY_XXHIGH。我在回答中添加了免责声明,以涵盖以后的所有案例。:)
Ted Hopp

10

自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所指出的,在使用前,请务必先查阅官方文档


4

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

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

}

2

让React Native检查当前设备的大小

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";
    }


这是行不通的。PixelRatio.get()将返回一个值范围,具体取决于Android设置中设置的显示尺寸和dpi。这些值将与您所确定的确切值不一致。
EnKrypt '19

0

在某些设备上(例如Galaxy Tab3),density和densityDpi都返回奇怪的值,例如1.33(density),213(densityDpi)。所以我的解决方案是添加这些标志:

<item type =“ bool” name =“ is_mdpi”> [布尔] </ item>
<item type =“ bool” name =“ is_hdpi”> [bool] </ item>
<item type =“ bool” name =“ is_xhdpi“> [bool] </ item>
<item type =” bool“ name =” is_xxhdpi“> [bool] </ item>

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


6
213dpi是一种众所周知的密度,“ tvdpi”:developer.android.com/guide/practices/…–
Christopher Orr
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.