代码之家  ›  专栏  ›  技术社区  ›  Praveen

在android中通过编程获得屏幕密度?

  •  486
  • Praveen  · 技术社区  · 16 年前

    如何在android中通过编程获得屏幕密度?

    16 回复  |  直到 8 年前
        1
  •  546
  •   Ωmega    8 年前

    DisplayMetrics 结构:

    DisplayMetrics metrics = getResources().getDisplayMetrics();
    

    metrics.densityDpi DENSITY_xxx 常量( 120 , 160 , 213 240 , 320 , 480 640 dpi)。

    实际的 lcd像素密度(也许对于OpenGL应用程序)您可以从 metrics.xdpi metrics.ydpi 水平和垂直密度的属性。

    metrics.density 密度dpi 可以计算

    int densityDpi = (int)(metrics.density * 160f);
    
        2
  •  389
  •   Blundell    6 年前

     getResources().getDisplayMetrics().density;
    

    0.75-低密度聚乙烯

    1.5-hdpi

    2.0-xhdpi

    3.0-xxhdpi

    4.0-xxxhdpi

    enter image description here

    ref: density

    enter image description here

    ref 2

        3
  •  147
  •   Neerajlal K    8 年前
    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及更高级别。

        4
  •  63
  •   Community Mohan Dere    9 年前

    Blundell's 作为静态助手方法回答:

    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";
    }
    
        5
  •  45
  •   Wizist matt_h    14 年前

    试试这个:

    DisplayMetrics dm = context.getResources().getDisplayMetrics();
    int densityDpi = dm.densityDpi;
    
        6
  •  40
  •   Ayaz Alifov    6 年前

    这是一些密度常数, source

    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;
    }
    
        7
  •  38
  •   Jere.Jones    16 年前

    要获取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;
    
        8
  •  29
  •   San    11 年前

    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
    }
    
        9
  •  20
  •   cyborg86pl    12 年前

    实际上如果你想 真实显示dpi 如果查询显示度量:

    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    int dpiClassification = dm.densityDpi;
    float xDpi = dm.xdpi;
    float yDpi = dm.ydpi;
    

    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应该是密度*xdpi。。但我不确定这样做是否正确!

        10
  •  17
  •   j0k gauthamp    13 年前

    这应该对你的活动有帮助。。。

    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
    
        11
  •  13
  •   Felipe    14 年前
    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;
    }
    
        12
  •  11
  •   Display name    14 年前

    WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
    DisplayMetrics metrics = new DisplayMetrics();
    wm.getDefaultDisplay().getMetrics(metrics);
    
        13
  •  8
  •   Avinash Verma    10 年前

    你应该试试这个。刚刚添加了一个方法,它将查找并显示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;
     }
    

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

        14
  •  7
  •   Robby Pond    16 年前

    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);
    int width = dm.widthPixels; //320
    int height = dm.heightPixels; //480
    
        15
  •  7
  •   Jared Rummler mehmoodnisar125    10 年前

    /**
    * @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";
        }
    }
    
        16
  •  3
  •   Pierre    6 年前

    另一种获取设备加载密度的方法:

    创建 values

    • 值(默认mdpi)
    • hdpi值
    • 值xhdpi
    • 值xxhdpi

    在各自的目录中添加字符串资源 strings.xml :

    <string name="screen_density">MDPI</string>    <!-- ..\res\values\strings.xml -->
    <string name="screen_density">HDPI</string>    <!-- ..\res\values-hdpi\strings.xml -->
    <string name="screen_density">XHDPI</string>   <!-- ..\res\values-xhdpi\strings.xml -->
    <string name="screen_density">XXHDPI</string>  <!-- ..\res\values-xxhdpi\strings.xml -->
    <string name="screen_density">XXXHDPI</string> <!-- ..\res\values-xxxhdpi\strings.xml -->
    

    String screenDensity = getResources().getString(R.string.screen_density);
    

    XXXHDPI ,它将默认为 XXXHDPI码 或者低于 HDPI MDPI

    R.strings.screen_density values

    我漏掉了 LDPI ,因为对于我的用例来说这是不必要的。

        17
  •  2
  •   Silambarasan Poonguti    7 年前

    试试这个。。。

    在科特林

    fun determineScreenDensityCode(): String {
          return when (resources.displayMetrics.densityDpi) {
             DisplayMetrics.DENSITY_LOW -> "ldpi"
             DisplayMetrics.DENSITY_MEDIUM -> "mdpi"
             DisplayMetrics.DENSITY_HIGH -> "hdpi"
             DisplayMetrics.DENSITY_XHIGH, DisplayMetrics.DENSITY_280 -> "xhdpi"
             DisplayMetrics.DENSITY_XXHIGH, DisplayMetrics.DENSITY_360, DisplayMetrics.DENSITY_400, DisplayMetrics.DENSITY_420 -> "xxhdpi"
             DisplayMetrics.DENSITY_XXXHIGH, DisplayMetrics.DENSITY_560 -> "xxxhdpi"
             else -> "Unknown code ${resources.displayMetrics.densityDpi}"
         }
    }
    

    你可以打过去 println("density: ${determineScreenDensityCode()}") 输出将是 System.out: density: xxxhdpi

        18
  •  0
  •   Jan Málek    7 年前

    我使用以下代码从模块访问DPI(无需访问上下文对象):

    (Resources.getSystem().getDisplayMetrics().xdpi
    Resources.getSystem().getDisplayMetrics().ydpi)/2
    
        19
  •  0
  •   Wirling    6 年前

    在Android中,你可以得到如下屏幕密度:

    public static String getScreenDensity(Context context)
    {
        String density;
        switch (context.getResources().getDisplayMetrics().densityDpi)
        {
            case DisplayMetrics.DENSITY_LOW:
                density = "LDPI";
                break;
            case DisplayMetrics.DENSITY_140:
                density = "LDPI - MDPI";
                break;
            case DisplayMetrics.DENSITY_MEDIUM:
                density = "MDPI";
                break;
            case DisplayMetrics.DENSITY_180:
            case DisplayMetrics.DENSITY_200:
            case DisplayMetrics.DENSITY_220:
                density = "MDPI - HDPI";
                break;
            case DisplayMetrics.DENSITY_HIGH:
                density = "HDPI";
                break;
            case DisplayMetrics.DENSITY_260:
            case DisplayMetrics.DENSITY_280:
            case DisplayMetrics.DENSITY_300:
                density = "HDPI - XHDPI";
                break;
            case DisplayMetrics.DENSITY_XHIGH:
                density = "XHDPI";
                break;
            case DisplayMetrics.DENSITY_340:
            case DisplayMetrics.DENSITY_360:
            case DisplayMetrics.DENSITY_400:
            case DisplayMetrics.DENSITY_420:
            case DisplayMetrics.DENSITY_440:
                density = "XHDPI - XXHDPI";
                break;
            case DisplayMetrics.DENSITY_XXHIGH:
                density = "XXHDPI";
                break;
            case DisplayMetrics.DENSITY_560:
            case DisplayMetrics.DENSITY_600:
                density = "XXHDPI - XXXHDPI";
                break;
            case DisplayMetrics.DENSITY_XXXHIGH:
                density = "XXXHDPI";
                break;
            case DisplayMetrics.DENSITY_TV:
                density = "TVDPI";
                break;
            default:
                density = "UNKNOWN";
                break;
        }
    
        return density;
    }
    

    在科特林就像这样:

    fun getScreenDensity(context: Context): String {
        val density: String
        when (context.resources.displayMetrics.densityDpi) {
            DisplayMetrics.DENSITY_LOW -> density = "LDPI"
            DisplayMetrics.DENSITY_140 -> density = "LDPI - MDPI"
            DisplayMetrics.DENSITY_MEDIUM -> density = "MDPI"
            DisplayMetrics.DENSITY_180, DisplayMetrics.DENSITY_200, DisplayMetrics.DENSITY_220 -> density = "MDPI - HDPI"
            DisplayMetrics.DENSITY_HIGH -> density = "HDPI"
            DisplayMetrics.DENSITY_260, DisplayMetrics.DENSITY_280, DisplayMetrics.DENSITY_300 -> density = "HDPI - XHDPI"
            DisplayMetrics.DENSITY_XHIGH -> density = "XHDPI"
            DisplayMetrics.DENSITY_340, DisplayMetrics.DENSITY_360, DisplayMetrics.DENSITY_400, DisplayMetrics.DENSITY_420, DisplayMetrics.DENSITY_440 -> density =
                "XHDPI - XXHDPI"
            DisplayMetrics.DENSITY_XXHIGH -> density = "XXHDPI"
            DisplayMetrics.DENSITY_560, DisplayMetrics.DENSITY_600 -> density = "XXHDPI - XXXHDPI"
            DisplayMetrics.DENSITY_XXXHIGH -> density = "XXXHDPI"
            DisplayMetrics.DENSITY_TV -> density = "TVDPI"
            else -> density = "UNKNOWN"
        }
    
        return density
    }
    

    一定要定期检查 check if new densities are added