在android开发中,经常会看到dp、dip、dpi、px、sp这些单位,特别是dp和sp开发者会经常用到。很多人只是知道用,但是这些单位到底是什么、表示什么意思,相信很多初学者依然是云里雾里。今天就跟大家一起学习下这些单位。
在介绍这些之前首先简单了解下屏幕尺寸。屏幕尺寸是指屏幕对角线长度,单位是英寸,1英寸=2.54厘米
屏幕分辨率:在橫纵向上的像素点数。单位:px即1px=1个像素点。
一般以纵向像素*横向像素表示,如1920*1080
Dpi:屏幕像素密度,指每英寸上的像素点数,dot per inch的缩写,与屏幕尺寸和屏幕分辨率有关
以Nexus5为例,官方参数为1920*1080,dpi=445,4.95 inch 那么,这个445的dpi是怎么算出来的呢?由上面介绍可知,屏幕尺寸4.95是屏幕对角线的长度,而dpi是指每英寸上的像素点数,所以应该由对角线所占的像素值除以4.95,如下:
px:像素,构成图像的最小单位,这个比较简单,无需介绍。
dp/dip: dp和dip是一样的,密度无关像素,Density Independent Pixels的缩写,以160dpi为基准。在160dpi设备 上1dp=1px,在240dpi设备上1dp=1.5px,以此类推
sp :Scale-Independent Pixels,可以根据文字大小首选项进行放缩,常用于设置字体大小。最好使用12sp大小以上的尺寸,推荐使用12sp、14sp、18sp、22sp,尽量避免使用奇数或小数,因为容易造成精度的丢失
关于dp、px之间的换算:
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.getResource().getDisplayMetrics().density;
return (int)(pxValue / scale + 0.5f);
}
这里可能有人要说为什么要加0.5,其实加0.5主要是为了四舍五入,例如 1.1 转换成int是 1 ; 而1.9转换成int 也是1; 所有的数加了0.5后 就可以实现四舍五入了,1.1 + 0.5 = 1.6 -> 1;1.9 + 0.5 = 2.4 -> 2