一、dp,dip,ppi,dpi,px基本概念
px,即是像素。
dp(Density-independent Pixels)即dip (Density-independent Pixels)每英寸像素数,一般使用语境是手机屏幕。
ppi(Pixel per inch)——像素分辨率,其实就是分辨率的意思。
dpi(dot per inch)每英寸有多少点,一般使用语境是在印刷领域中。
我一开始看这些概念的时候,被搞得很晕,经常分不清楚。下面我三个公式,两个问题来说明这些概念。
公式1:dpi = sqrt((width ^ 2 + height ^ 2 )) / 英寸,如图:
首先,dp和sp是android开发的概念,在实际进行渲染之前,它们都会先转变为px。
在Android中,dp的概念为,在dpi为160的屏幕上的一个物理像素。意思就是,在dpi为160的屏幕上,1px = 1dp。以此类推,在dpi为320的屏幕上,1dp = 2px。
因此公式2:density = dpi / 160
公式3:px = dp * density = dp (dpi / 160)
也就是说,dp在不同dpi的屏幕下,对应的是不同的px,所以dp是具有适配的能力的。
问题1.那我们用dp就好啦,为什么dp不能适配呢? 其实从公式中就可以看出,px = dp (dpi / 160),px是由dp和dpi共同决定的,各种手机的dpi各不相同,android厂商碎片化严重,各式各样的dpi。
举个例子,屏幕分辨率为480 * 800。dpi 为 233dpi,我们写了一个imageview,我们希望宽度为屏幕一半,现在代码里假设写了android width = 160dp。实际显示的时候的px为,160 * 233 / 160 = 233,差不多为屏幕一半。
但是换一个1920*1080,屏幕尺寸为5寸的话,那么dpi为440。此时的px = 160 * 440 / 160 = 440,而屏幕宽度应该为540,整整差了100px。
问题2: 那dp到底解决什么问题呢? 就如我们上面所说,dp会在不同屏幕下对应不同的px。160dpi时,1px = 1dp,占一个英寸。320dpi时,2px = 1dp,占一个英寸。480dpi,3px = 1dp,占一个英寸。发现了吗?dp的作用是,能保证你的控件,时刻都能占一个英寸,但是这个对我们是没有意义的。 偷一张官网的图,这个绿色的icon会在不同的屏幕上,始终保持同样的英寸。