之前对他们之间的关系还算了解,但是有时候还是会被绕进去(可见还是没有真正理解,或者理解的角度不对),这次经过自己思考再加上一些
博文阅读,对他们之间的认识有清晰了一些,故写篇博客记录一下。
一:物理单位和虚拟单位。
首先我们要知道,我们在android上进行布局的单位一般要求的不是真正的物理单位,而是像dp这样的虚拟单位,这些虚拟单位是将物理单位
按照一定的比例来进行折算的,所以说他们其实是没有单位的,而仅仅是相对于物理单位的一个比例而已,不是物理单位。
我们先来复习一下物理单位,物理单位分为基本单位,和推算单位,如:长度的:毫米,厘米,米,这些单位就是基本单位,为什么这些是基
本单位,因为这些单位是人为固定的,这么长就是一厘米,那么长就是一米。那什么是推算单位呢?如速度:m/s(米/秒)等等,他们是由基本
单位之间通过运算得来的,他们的一个特点是:由两个基本单位组成。所以,所有物理单位要么是基本单位要么是推算单位,例如:我们将
5cm记作虚拟单位Y,那么1m=20Y,我们也可以将10cm记作一个虚拟单位Y,那么1m=10Y,虚拟单位相对于物理单位的值可以是变化的,下
面我们要讲的dp,他的值相对于px就是变化的。了解了这些,接下来我们进入正题。
二:android的单位划分。
px:即我们通常所说的像素,他是一个基本的物理单位。我们通常所说的屏幕分辨率,如:320.480,是指屏幕宽有320个像素点,长有480个
像素点,屏幕总共有320*480,即153600个像素点。
dpi:记住不是dip,他们之间是有区别的。dpi 是一个推算单位,他的单位为px/inch,即像素/英寸,通常我们称作为像素密度。
dip:即我们上面简称的dp,他是一个虚拟单位,专业术语即我们常说的:与设备无关的像素值,通俗来讲就像我们上面所定义的单位Y,他是
基于基本物理单位的,也就是他相对于物理单位来说的话,就是多少个px,不同设备这个多少就可能不一样,为什么不一样,android中是这样
规定的:dp=dpi/(160px/inch)px,就像我们上面定义Y的值一样,这个是人为规定的,虽然也可以另外一种定义法,但是这样定了就定了。因为
他是基于dpi的值来的,而不同设备的dpi值是不一样的,所以不同设备的dp值是不一样的。
inch:即英寸,他是基本的物理单位。我们通常所说的手机屏幕多少英寸是指这个屏幕的对角线长度。如:5英寸屏幕,那么这个屏幕的对角线
就是5英寸长。
density:这是一个比例值,他不依赖于基本单位,如:1m=100cm,这个100就是一个比例值,density就相当于这个100。他的比例值换算方
式为:dpi/(160px/inch),由这个换算方式,由于我们知道dpi的物理单位,最后所有的单位都会相互抵消,于是就只剩下一个比例值了。
三:各个单位之间的换算。
dpi:dots per inch,像素密度。dpi和density都可以通过android的API进行获取:
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int dpi = dm.densityDpi;
float desity = dm.density;
由以上的单位公式我们可以得出:
1dp = 1 dpi/(160px/inch)px = density px;
所以假设一个手机的像素密度(dpi)为400,那么可以就算出density=2.5,所以在这个手机上dp=2.5px,即2.5个像素。
那么1dp怎么换算成基本的物理单位呢?很简单,我们知道dpi了,dpi的单位就是px/inch,也就是每英寸有多少像素,我们前面已经将dp换算成
了px,上面的1dp=2.5px,而1px=1/400(inch),故1dp=2.5/400(inch),这样就将dp换算成了基本的物理单位。
参考连接:
http://blog.csdn.net/dinko321/article/details/7992776
http://www.cnblogs.com/see2851/archive/2011/11/28/2266642.html
http://zaodula.com/archives/2709.html