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