getting the screen density programmatically in android?

后端 未结 19 2649
感动是毒
感动是毒 2020-11-22 01:56

How to get the screen density programmatically in android?

I mean: How to find the screen dpi of the current device?

相关标签:
19条回答
  • 2020-11-22 02:34

    You can get info on the display from the DisplayMetrics struct:

    DisplayMetrics metrics = getResources().getDisplayMetrics();
    

    Though Android doesn't use a direct pixel mapping, it uses a handful of quantized Density Independent Pixel values then scales to the actual screen size. So the metrics.densityDpi property will be one of the DENSITY_xxx constants (120, 160, 213, 240, 320, 480 or 640 dpi).

    If you need the actual lcd pixel density (perhaps for an OpenGL app) you can get it from the metrics.xdpi and metrics.ydpi properties for horizontal and vertical density respectively.

    If you are targeting API Levels earlier than 4. The metrics.density property is a floating point scaling factor from the reference density (160dpi). The same value now provided by metrics.densityDpi can be calculated

    int densityDpi = (int)(metrics.density * 160f);
    
    0 讨论(0)
  • 2020-11-22 02:37

    Try this...

    In kotlin

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

    You can call by println("density: ${determineScreenDensityCode()}") and the output will be System.out: density: xxxhdpi

    0 讨论(0)
  • 2020-11-22 02:39

    In Android you can get the screen density like this:

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

    And in Kotlin like this:

    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
    }
    

    Make sure to regularly check if new densities are added.

    0 讨论(0)
  • 2020-11-22 02:41

    Here are some density constants, source:

    There are, in addition to the standard densities, 5 Intermediate ones. Taking into account this fact, the following code will be a complete working example:

    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 
    }
    

    Alternatively, you can find density constants using the 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;
    }
    
    0 讨论(0)
  • 2020-11-22 02:41

    If you want to retrieve the density from a Service it works like this:

    WindowManager wm = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
    DisplayMetrics metrics = new DisplayMetrics();
    wm.getDefaultDisplay().getMetrics(metrics);
    
    0 讨论(0)
  • 2020-11-22 02:43

    To get 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;
    
    0 讨论(0)
提交回复
热议问题