32 X 32
48 X 48
72 X 72
96 X 96
144 X 144
1-1
1-1.2
1-1.5
1-2
1-2.2
public class DisplayUtil {
public static int dip2px(Context context, float dipValue){
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(dipValue * scale + 0.5f);
}
public static int px2dip(Context context, float pxValue){
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(pxValue / scale + 0.5f);
}
}
基于屏幕密度的抽象单位,设备无关的点,用于说明与密度无关的尺寸和位置。这些单位是相对于一个160dpi的屏幕,所有一个dp是160dpi屏幕上的一个点。
屏幕密度为160
1dip=1px
density = densityDpi /160
px = dip * (densityDpi / 160)
DisplayMetrics dm =getResources().getDisplayMetrics();
宽
int w_screen = dm.widthPixels;
高
int h_screen = dm.heightPixels;
密度
int dpi = dm.densityDpi;
log:
….. 160
……….. 240
720 , 1280, 320
1080 , 1920 , 480
low=120
Medium =160
High = 240
xH =320
xxH = 480
计算代码缘由:
android系统转换代码
// TypedValue 中的这个函数负责将dp,sp,px等维度信息转换成像素
public static int complexToDimensionPixelSize(int data,
DisplayMetrics metrics)
{
final float value = complexToFloat(data);
final float f = applyDimension(
(data>>COMPLEX_UNIT_SHIFT)&COMPLEX_UNIT_MASK,
value,
metrics); // 这个函数负责完成转换,其实现请往下看
final int res = (int)(f+0.5f); // 这里做了一个四舍五入
if (res != 0) return res;
if (value == 0) return 0;
if (value > 0) return 1;
return -1;
}
// 从这个函数的实现可以看出android系统对dp和sp处理的区别
public static float applyDimension(int unit, float value,
DisplayMetrics metrics)
{
switch (unit) {
case COMPLEX_UNIT_PX:
return value; // px不需要做转换
case COMPLEX_UNIT_DIP:
return value * metrics.density; // dp转换成px
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity; // sp转换成px
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}