我们在编写代码的时候,经常会遇到这样的问题,我们定义的尺寸,在不同尺寸的设备上,会显示不同的大小?这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。dp也就是dip,这个和sp基本类似。如果设置表示长度、高度等属性时可以使用dp 或sp。但如果设置字体,需要使用sp。dp是与密度无关,sp除了与密度无关外,还与scale无关。
其中他们的转换关系为
mdpi 160 1dp=1px 320*480 一英寸=2.53cm
hdpi 240 1dp=1.5px 480*800
xhdpi 320 1dp=2px 720*1280 标清
xxhdpi 480 1dp=3px 1080*1920 高清
xxxhdpi 640 1dp=4px 1440*2560 2k
将sp值转换为px值,保证文字大小不变
public static int sp2px(Context context ,float sp)
{
Resources resources=context.getResources();
//Metric 度量
DisplayMetrics displayMetrics=
resources.getDisplayMetrics();
//scale 缩放
//Density 密度
float density=displayMetrics
.scaledDensity;
return (int)(density*sp+0.5f);
}
将px值转换为dip或dp值,保证尺寸大小不变
public static int px2dip(Context context, float pxValue)
{
final float scale =context.getResources()
.getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
将dip或dp值转换为px值,保证尺寸大小不变
public static int dip2px(Context context, float dipValue)
{
final float scale = context.getResources()
.getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}
将px值转换为sp值,保证文字大小不变
public static int px2sp(Context context, float pxValue)
{
final float fontScale = context.getResources()
.getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
其中0.5f是为了保证四舍五入。