android中 mdpi,hdpi,xhdpi,xxhdpi等文件的深入理解

mdpi               120~160dpi              48*48px

hdpi                160~240dpi              72*72px

xhdpi               240~320dpi             96*96px  

xxhdpi             320~480dpi             144*144px

xxxhdpi           480~640dpi              192*192px

比例   

1      :1.5  :   2   :    3      :   4  

mdpi:hdpi:xhdpi:xxhdpi :xxxhdpi

这个比例之前一直不明白具体含义:今天做了个demo,算是理解了。

设备:华为Mate7,屏幕尺寸为 6 inch,分辨率为1920*1080,首先计算出对角线分辨率为2202,除以6得到367,因此它的dpi就为367。 对应的分辨率文件夹就是 xxhdpi 。

在以上设备上,对应的xxhdpi文件夹中如果没有所需图片(取名为a.png),而在mdpi文件夹中有的话,那么系统会把该图片的宽和高都放大三倍,然后放在对应位置上。如果hdpi文件中有的话,那就放大两倍。如果两个文件夹都有的话,按照较高分辨率也就是hdpi的来。那如果xxxhdpi中也有呢?

我都亲自尝试了一遍,理出逻辑:

系统加载图片是,会优先寻找对应文件夹的图片,本例中就是xxhdpi文件,如果没有,则按照xxxhdpi ---> xhdpi ---> hdpi ---> mdpi 的顺序进行查找,直至找到为止。

另:如何知道手机是hdpi,xhdpi,还是xxhdpi?

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

public class DisplayUtil {

    /**
     * 屏幕宽度(像素)
     * @param ctx
     * @return
     */
    public static int getScreenWidthPx(Context ctx) {
        WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);
        return dm.widthPixels;
    }

    /**
     * 屏幕宽度(dp)
     * @param ctx
     * @return
     */
    public static int getScreenWidthDp(Context ctx) {
        WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);

        int width = dm.widthPixels;         // 屏幕宽度(像素)
        float density = dm.density;         // 屏幕密度(0.75 / 1.0 / 1.5)
        int screenWidth = (int) (width / density);  // 屏幕宽度(dp)

        return screenWidth;
    }

    /**
     *屏幕高度(像素)
     * @param ctx
     * @return
     */
    public static int getScreenHeightPx(Context ctx) {
        WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);
        return dm.heightPixels;
    }

    /**
     *屏幕高度(dp)
     * @param ctx
     * @return
     */
    public static int getScreenHeightDp(Context ctx) {
        WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);

        int height = dm.heightPixels;       // 屏幕高度(像素)
        float density = dm.density;         // 屏幕密度(0.75 / 1.0 / 1.5)
        int screenHeight = (int) (height / density);// 屏幕高度(dp)

        return screenHeight;
    }

    /**
     * 密度(0.75 / 1.0 / 1.5)
     * @param ctx
     * @return
     */
    public static float getScreenDensity(Context ctx) {
        WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);
        return dm.density;
    }

    /**
     * 像素密度dpi(120 / 160 / 240)
     * @param ctx
     * @return
     */
    public static float getScreenDensityDpi(Context ctx) {
        WindowManager wm = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);
        return dm.densityDpi;
    }





}

猜你喜欢

转载自blog.csdn.net/songzi1228/article/details/88972385