浅谈屏幕适配 dp dip sp dpi ppi px sp

一、Drawable资源文件夹之间的关系
Android开发中,UI一般会制作多种图片素材,根据素材的分辨率大小,放在如下几个文件夹中:
Android 工程里 res 目录下的 drawable-hdpi, drawable-xhdpi, drawable-xxhdpi 等文件夹。我们知道 Android 会根据屏幕的 dpi 去选择对应的 drawable 文件夹,Android项目的资源文件下存在以下目录:

drawable-ldpi ( 当dpi为120时,使用此目录下的资源),如QVGA (240x320)
drawable-mdpi ( 当dpi为160时,使用此目录下的资源),如HVGA (320x480)
drawable-hdpi ( 当dpi为240时,使用此目录下的资源),如WVGA (480x800),FWVGA (480x854)
drawable-xhdpi ( 当dpi为320时,使用此目录下的资源),如720P:1280x720(标清,standard definition,SD)
drawable-xxhdpi ( 当dpi为480时,使用此目录下的资源),如1080P:1920x1080(高清,high definition,HD)
drawable-xxxhdpi ( 当dpi为640时,使用此目录下的资源)
为基准可以看出系数比例关系:0.75:1:1.5:2:3:4

Android 正是根据设备DPI值得不同,选择清晰度不同的资源使用,完成屏幕的适配, 但手机屏幕千奇百怪,因此上述文件夹不是指定具体的分辨率,而是一个范围:

drawable-ldpi(value <= 120 dpi)
drawable-mdpi(120 dpi < value <= 160 dpi)
drawable-hdpi(160 dpi < value <= 240 dpi)
drawable-xhdpi(240 dpi < value <= 320 dpi)
drawable-xxhdpi(320 dpi < value <= 480 dpi)
drawable-xxxhdpi(480 dpi < value <= 640 dpi)

所以 420 dpi 会优先加载 xxhdpi 中的资源文件,如果对应 dpi 目录下没有找到该资源文件,遵循先高再低原则,然后按比例缩放图片
举个例子:当前为 xhdpi 设备,则 drawable 的寻找顺序为:
xhdpi -> xxhdpi -> xxxhdpi (直到最高dpi资源文件目录都没有该资源文件) -> nodpi (如果低dpi有) -> hdpi -> mdpi
1.在高dpii资源文件目录找到
如果在 xxhdpi 中找到目标图片,则压缩(480/320) =2/3 使用
2.在低dpii资源文件目录找到
如果在 mdpi 中找到图片,则放大 (240/120)=2 倍使用。

二、分别率级别
换算关系

ldpi 的手机 1dp=0.75px
mdpi 的手机 1dp=1.0px
hdpi 的手机 1dp=1.5px
xhdpi 的手机 1dp=2.0px
xxhdpi 的手机 1dp=3.0px

在这里插入图片描述
三、 dp dip sp dpi ppi px sp
1.px (pixels)像素,就是屏幕上实际的像素点单位,也是屏幕物理上的最小显示单位。比如我的手机分辨率是1080*1920,就是宽度有1080个像素点,高度有1920个像素点。不同的设备不同的显示屏显示效果是相同的,这是绝对像素,不会改变。像素的大小是没有固定长度的,不同设备上一个单位像素色块的大小是不一样的。尺寸面积大小相同的两块屏幕,分辨率大小可以是不一样的,分辨率高的屏幕上面像素点(色块)就多,所以屏幕内可以展示的画面就更细致,单个色块面积更小,而分辨率低的屏幕上像素点(色块)更少,单个像素面积更大,可以显示的画面就没那么细致。

2.ppi (pixels pe inch),就是每英寸有多少个像素。比如一个手机是420像素/英寸。根据定义可以知道,同一个屏幕,同一个分辨率,这个值是固定的。关于ppi和dpi这两个措辞的差别,表面上看来只是 dot和 pixel,但实际上 dot 可以是打印的墨点,可以指扫描仪的采样点,可以指数字图像的最小单位(即 pixel),可以指屏幕的物理像素,可以指操作系统的抽象像素……在不同的语境下可以指不同的概念,而同样 pixel 也可以指数字图像的数据 pixel,可以指屏幕物理像素,也可以指代操作系统的抽象像素……在不同语境下的意义也不同。这两个单位完全就是时常混用的,在电子屏幕显示中提到的 ppi 和 dpi 可以认为是一样的,所以你可以忽略在措辞上用 dpi 或者 ppi 有什么不同,不过在 Android 平台上常用 dpi 这种表述方式。
在这里插入图片描述

3.dpi(Dots Per Inch)是屏幕像素密度。就是1英寸上像素点的个数。所以这个和 ppi 其实是一样的东西。常见的数值有160像素/英寸,240像素/英寸。对于屏幕来说,dpi越大,屏幕的精细度越高,屏幕看起来就越清楚。也就是当设备的dpi为160的时候1px=1dp;实际上dpi的计算是通过勾股定理算出屏幕对角的像素数再除以对角的尺寸就是最终的dpi。
以手机举个例子:
尺寸:5.0英寸(一般所说的尺寸就是机器的对角线尺寸。)
分辨率:1080*1920
DPI = sqrt((长度像素数² + 宽度像素数²)) / 屏幕对角线英寸数
tip:sqrt为开平方根

4.sp (scaled pixels-best for text size):类似dp,放大像素(比例像素),与刻度无关,可以根据用户的字体大小首选项进行缩放,主要用来处理字体的大小。 主要处理字体的大小。sp由于是放大像素,主要是用于字体显示,由此根据google的建议,TextView的字体大小最好用sp做单位。

5.density:density表示每英寸有多少个显示点(逻辑值),它的单位是dpi。谷歌规定,一块160像素/英寸的屏幕,密度就是1。那么320像素/英寸,密度就是2。也就是说:密度 = dpi / 160像素/英寸。

6.dip (density independent pixels)设备独立像素,大概就是一个抽象的像素,像素是一个具体的不变的东西,但是dip会根据屏幕的像素密度变化。不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。
dip的换算: dip(value)=(int) (px(value)/1.5 + 0.5)

7.dp(Density-independent pixel)设备独立像素 就是dip,一种基于屏幕密度的抽象单位,在每英寸 160 点得显示器上,1dip = 1px,但随着屏幕密度的改变,dip 与 px 的换算会发生改变。因为 不同设备中有不同的显示效果,所以 为了解决在不通分辨率手机上运行不至于相差太大的问题,引入了 dip 计量单位,这种计量单位与移动设备硬件无关。当dpi=160像素/英寸,则1dp=1px。当dpi=320像素/英寸,则1dp=2px。标准是160dip.即1dp对应1个pixel,屏幕密度越大,1dp对应的像素点越多。
dp是与密度无关,sp除了与密度无关外,还与

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘子先生z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值