dp,dip,sp,px,pt,mm,in区别与作用,getDimensionPixelSize,getDimension,getDimensionPixe区别

关于Android的测量单位

下面这段关于Android度量单位的解释摘抄自博客:博客

px: 

即像素,1px代表屏幕上一个物理的像素点;

px单位不被建议使用,因为同样100px的图片,在不同手机上显示的实际大小可能不同。

dp:

这个是最常用但也最难理解的尺寸单位。它与“像素密度”密切相关,所以首先我们解释一下什么是像素密度。假设有一部手机,屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们可以计算出在这部手机的屏幕上,每英寸包含的像素点的数量为240/1.5=160dpi(横向)或320/2=160dpi(纵向),160dpi就是这部手机的像素密度,像素密度的单位dpi是Dots Per Inch的缩写,即每英寸像素数量。横向和纵向的这个值都是相同的,原因是大部分手机屏幕使用正方形的像素点。

不同的手机/平板可能具有不同的像素密度,例如同为4寸手机,有480x320分辨率的也有800x480分辨率的,前者的像素密度就比较低。Android系统定义了四种像素密度:低(120dpi)、中(160dpi)、高(240dpi)和超高(320dpi),它们对应的dp到px的系数分别为0.75、1、1.5和2,这个系数乘以dp长度就是像素数。例如界面上有一个长度为“80dp”的图片,那么它在240dpi的手机上实际显示为80x1.5=120px,在320dpi的手机上实际显示为80x2=160px。如果你拿这两部手机放在一起对比,会发现这个图片的物理尺寸“差不多”,这就是使用dp作为单位的效果,见下图。

dip:

与dp完全相同,只是名字不同而已。在早期的Android版本里多使用dip,后来为了与sp统一就建议使用dp这个名字了。

sp:

与缩放无关的抽象像素(Scale-independent Pixel)。sp和dp很类似但唯一的区别是,Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),当文字尺寸是“正常”时1sp=1dp=0.00625英寸,而当文字尺寸是“大”或“超大”时,1sp>1dp=0.00625英寸。类似我们在windows里调整字体尺寸以后的效果——窗口大小不变,只有文字大小改变。

还有几个比较少用到的尺寸单位:

mm:

即毫米;

in:

即英寸,1英寸=2.54厘米(约);

pt:

1pt=1/72英寸=0.035厘米;



可以看到这些测量单位的实际尺寸,但实际开发中,根据GOOGLE建议,建议大家:
布局使用dp作为基本单位
文字使用sp作为基本单位
这样更有利于适配不同分辨率大小的手机,大家都知道Android的布局都是以像素点为单位,
为了更好让大家了解下这些具体的尺寸,下面我们测试下这些尺寸转换成px后数值为多少。

getDimension,getDimensionPixelOffset,getDimensionPixelSize这个三个方法可用来取dimen.xml的值。
getDimension返回一个float,值乘以密度。
getDimensionPixelOffset返回一个int,值乘以密度,舍去小数位直接截取为int。
getDimensionPixelSize返回一个int,值乘以密度,四舍五入转为int。



在Android项目res/values/dimens文件下输入如下代码: 
    16dp  
    16px  
    16sp
    16pt
    16mm
    16in

在Activity的OnCreate()方法中输入如下代码: 
int a1 = getResources().getDimensionPixelSize(R.dimen.dp_01);
int a2 = getResources().getDimensionPixelSize(R.dimen.px_01);
int a3 = getResources().getDimensionPixelSize(R.dimen.sp_01);
int a4 = getResources().getDimensionPixelSize(R.dimen.pt_01);
int a5 = getResources().getDimensionPixelSize(R.dimen.mm_01);
int a6 = getResources().getDimensionPixelSize(R.dimen.in_01);
		
float b1 = getResources().getDimension(R.dimen.dp_01);
float b2 = getResources().getDimension(R.dimen.px_01);
float b3 = getResources().getDimension(R.dimen.sp_01);
float b4 = getResources().getDimension(R.dimen.pt_01);
float b5 = getResources().getDimension(R.dimen.mm_01);
float b6 = getResources().getDimension(R.dimen.in_01);
		
int c1 = getResources().getDimensionPixelOffset(R.dimen.dp_01);
int c2 = getResources().getDimensionPixelOffset(R.dimen.px_01);
int c3 = getResources().getDimensionPixelOffset(R.dimen.sp_01);
int c4 = getResources().getDimensionPixelOffset(R.dimen.pt_01);
int c5 = getResources().getDimensionPixelOffset(R.dimen.mm_01);
int c6 = getResources().getDimensionPixelOffset(R.dimen.in_01);
		
Log.d("XXX", "getDimensionPixelSize()  dp=" + a1 + ", px=" + a2 + ", sp=" + a3 + ", pt=" + a4 + ", mm=" + a5 + ", in=" + a6);
Log.d("XXX", "getDimension()  dp=" + b1 + ", px =" + b2 + ", sp=" + b3 + ", pt=" + b4 + ", mm=" + b5 + ", in=" + b6);
Log.d("XXX", "getDimensionPixelOffset()  dp=" + c1 + ", px=" + c2 + ", sp=" + c3 + ", pt =" + c4 + ", mm=" + c5 + ", in=" + c6);


测试结果如下:
dp,dip,sp,px,pt,mm,in区别与作用,getDimensionPixelSize,getDimension,getDimensionPixe区别_第1张图片

getDimensionPixelSize()  dp=44, px=16, sp=37, pt=80, mm=227, in=5775
getDimensionPixelOffset()  dp=44, px=16, sp=37, pt =80, mm=227, in=5775
getDimension()  dp=44.0, px =16.0, sp=37.4, pt=80.21044, mm=227.36818, in=5775.152



声明

欢迎转载,但请保留文章原始出处
作者:Jaiky_杰哥 
出处:http://blog.csdn.net/jaikydota163/article/details/52006209


你可能感兴趣的:(Android)