Android 开发中 dp、dpi、px 的区别

一、基本概念

  • dp:安卓中的相对大小
  • dpi:( dot per inch )每英寸像素多少
  • px:像素点

二、详细说明

px和dpi

px

平常所说的 1920×1080 只是像素数量,也就是 1920px×1080px, 代表手机高度上有 1920 个像素点,宽度上有 1080 个像素点。

dpi

要想判别手机屏幕的显示好坏,还要考虑屏幕的宽高(英寸),也就是用 dpi 即每英寸多少像素来评价屏幕的显示效果。(不然假如手机分辨率是 1920×1080, 但是屏幕是几十寸的,那显示效果将不会很好,甚至你有可能看到小的像素块,那将更影响视觉效果。)

dp

怎样理解 dp 才好呢 ?

  • 其实 dp 就是为了使得开发者设置的长度能够根据不同屏幕( 分辨率/尺寸也就是 dpi )获得不同的像素 ( px ) 数量。比如:我将一个控件设置长度为 1dp, 那么在 160dpi 上该控件长度为 1px, 在 240dpi 的屏幕上该控件的长度为 1 * 240 / 160 = 1.5 个像素点。
  • 也就是dp会随着不同屏幕而改变控件长度的像素数量。
  • 关于dp的官方叙述为当屏幕每英寸有 160个 像素时( 也就是 160dpi ),dp与px等价的。那如果每英寸 240 个像素呢?1dp —>1*240/160=1.5px,即 1dp 与 1.5px 等价了。
  • 其实记住一点,dp 最终都要化为像素数量来衡量大小的,因为只有像素数量最直观。

计算dp的方法:

  • 通常来说,我们写程序时几乎没用到计算dp,就是直接凭着自己的感觉写的。此处计算dp只是为了大家更好理解dp,如果有的人想精确设置控件大小,也可以这样计算的。
  • 我直接画张图吧:
  • 计算dp往往是由程序员完成的,是创造的过程,顺叙的过程。但是写程序总会有两个历程的,一个是进行写,一个是返回读,这个读的话就用到了将 dp 转换了。

dp转px—(最常用的方法):

  • 前面已经看到一个例子了如下(注:等号都是等价,是理解上的等于,不是直接的等于的):安卓中如果手机每英寸有 160px,即手机是 160dpi,那么此时1dp就可以理解为1px,假如现在手机是240dpi,那么1dp=240/160 px=1.5px,
    从上可以看出dp转px只与屏幕的dpi有关。
  • 对于 Android 来说,最终我们能读懂或者衡量的都是px,所以最后我们都将dp化为px好理解一点。我总结了dp转px的公式如下:
  • 公式:dp值×(当前dpi/160dpi)=>得出当前的像素数目

手机屏幕dp最大值是多少?

  • 那么问题来了,一个手机屏幕最大有多大的dp呢,我能不能设置成 100000dp 呢?其实这也是我所思考的,下面我慢慢来讲。
  • 假如现在将控件宽度设置为 160dp, 那不同 dpi 的手机所得到的像素是多少呢?

    从中可以看出最后所得像素值与dpi值相同,也就是说不管什么屏幕160dp,就相当于1英寸。
  • 所以要得到全屏最长的的dp,就等于160*宽(或者高英寸长)
    如第三个 1080*1920例子,160*3 = 480dp,所以 0-480dp 就是宽的 dp 范围。因为480*360/160=1080 个像素,正好等于宽的最大像素数量。

http://img.godjiyi.cn

苟且一下