密度独立的意思就是:图片实际显示的物理大小,在不同密度的设备上,是相同的,是和设备的密度级别无关的。android的设计是保持密度独立,因为人手指接触屏幕的面积是固定大小的。
设备的密度级别:就是设备的dpi,也可以说是ppi,就是每英寸内的像素的点数。比如我的手机屏幕2160*1080,5.99寸,那么我的手机dpi就是√2160²+1080²/5.99≈403。android的密度级别:ldpi:120dpi,mdpi:160dpi,hdpi:240dpi,xhdpi:320dpi,xxhdpi:480dpi。
缩放因子:以mdpi为基准,mdpi是1,对应的是0.75,1,1.5,2.0,3.0。
图片的大小单位:
px:像素,不是密度独立的,在不同密度设备上会显示不同的物理大小。基本不用。
in:英寸,mm:毫米,pt:点,屏幕上普通字体大小单位。这3个单位是密度独立的,精确的,比如设置宽度1in,那么在不同设备上都显示1in。1in是大概2.54厘米。
dp:这个是最常用的,它虽然是密度独立,但是在不用设备上显示的大小有略微差异。因为dp的计算规则是这样的,它以mdpi也就是160dip作为标准,也就是在mdpi的设备上 1dp就是1px,也就是160dp大约显示为1in,dp可以说是在160 dpi上的px。那么显示xxhdpi设备上时会显示为3像素,从而保证密度独立。但是设备的屏幕密度不是正好是密度级别对应的数字,比如403,那么用换算得来的px/设备实际dpi,得到的尺寸就会略有差异。dp的计算是先用密度级别算出px,再除以实际屏幕密度,最终得到实际显示物理尺寸。
为什么"dp"允许这种物理尺寸的变化?从根本上来说,android在物理尺寸上会牺牲一些精确度,目的是为了保持性能和显示质
量。由于利用android的密度桶比率(0.75:1.0:1.5:2.0:3.0)让"dp"缩放到"px",这就允许有极小的"px"舍入和简单的
估计。同时,由于缩放因子与密度桶比率成比例,“dp”会按比例显示为各种密度提供的图片资源。最后,当缩放图行的时候,最好保持接近整数和简单的分数,因为复杂的分数会导致图片颜色过渡异常和走样。
sp:跟dp一样,不过是仅仅用来设置字体大小。
这些单位最终都会被换算成px,在设备上显示出来。比如1in*设备屏幕密度=在设备上显示的像素数量。