最全Android度量单位px dp(dip) ppi dpi sp pt的区别(屏幕尺寸,屏幕分辨率,屏幕兼容,屏幕适配)

1 Android屏幕适配相关概念

1.1 屏幕尺寸(Screen Size)

屏幕尺寸是屏幕的对角线的长度,单位是英寸,1英寸等于2.54厘米。比如常见的屏幕尺寸有3.5、4.0、5.5等。

1.2 屏幕分辨率(Screen Resolution)

屏幕分辨率是指在横向和纵向上的像素点数、单位是px(pixel),1px等于1个像素点,一般设备的屏幕分辨率以“纵向像素x横向像素”来表示,例如1920x1080。

1.3 度量单位px、dp(dip)、ppi、dpi、sp、pt

1.3.1 像素px(pixel)

像素,1px代表物理屏幕上面的一个像素点。由于Android设备分辨率繁杂、厂商过多的原因,px在实际的开发过程中不建议被使用。如宽高都为100px的图片,在不同分辨率的设备上可能显示的大小不一致,如下图(图片来自android_developer_screens_support):

在这里插入图片描述

1.3.2 密度无关像素dp/dip(Density-independent Pixels)

密度无关像素是一个基于屏幕物理密度的度量单位,在160dpi的屏幕中1dp大约等于1px。当在更高密度的屏幕上运行时,用于绘制1dp的像素数量会被一个适合屏幕dpi的density因子放大,例如在320dpi的屏幕中1dp大约等于2px。而在低密度屏幕上,1dp的像素数量会减少。

也就是说,dp与px的比值与屏幕物理密度正相关,但不一定是正比。dp度量单位可以在布局中适当地调整UI组件的大小,以适合不同的屏幕密度。换句话说,它为您在不同设备上的UI元素的真实大小提供了一致性。

Android官方文档《支持不同的像素密度》对于屏幕适配的观点是:必须避免的第一个陷阱是使用像素px来定义距离或尺寸。使用像素来定义尺寸会带来问题,因为不同的屏幕具有不同的像素密度,所以同样数量的像素在不同的设备上可能对应于不同的物理尺寸。

例如下方同样是4.0英寸的两部手机,左边那台手机的分辨率很低,是320x180,右边那台是960x540。如果将显示字母a的图片长宽都设置为100px,那么左边手机显示的a很大,而右边手机显示的a很小。

只有将显示字母a的图片长宽都设置为100dp,才能出现下面的效果,即该图片在两台分辨率不同的手机看起来大小差不多一致,而不是一大一小。

要在密度不同的屏幕上保持一个UI组件显示出相同的尺寸,您必须使用密度无关像素 (dp) 作为度量单位来设计界面。dp 是一个虚拟像素单位,1 dp 约等于在在基准密度160dpi屏幕上的1px。对于其他每个密度,Android 会将此值转换为相应的实际像素数。

1.3.3 像素密度ppi(pixels per inch)

像素密度是一个表示打印图像或显示器单位面积上像素数量的指数。一般用来计量电脑显示器、电视机和手机屏幕的精细程度,例如手机销售商一般会标识出售手机的ppi,例如淘宝店中小米K30Pro手机标识的ppi为395。通常情况下,ppi越高的屏幕,屏幕显示的内容更细腻和真实,其中ppi的计算公式如下:

以分辨率1280*720、屏幕对角线尺寸为4.3英寸的设备为例:ppi = √(12802+7202) / 4.3 = 341.5359……≈342。

1.3.4 屏幕密度dpi(dots per inch)

屏幕密度是一个用于点阵数位影像的度量单位,意思是每一英寸长度中取样点或可显示点的数目。为简便起见,Android 将所有屏幕密度分组为六种通用密度,具体如下表:

类别 屏幕密度dpi 密度无关像素dp的缩放因子density
ldpi ~120dpi 0.75
mdpi ~160dpi 1.0
hdpi ~240dpi 1.5
xhdpi ~320dpi 2.0
xxhdpi ~480dpi 3.0
xxxhdpi ~640dpi 4.0

1.3.4.1 密度无关像素dp的缩放因子density

在《Android官方文档-Reference-DisplayMetrics.density》中对屏幕密度dpi的缩放因子density有以下的解释:

density是密度无关像素dp的缩放因子,体现在android.util包中的DisplayMetrics.density 字段。将dp单位转换为px单位时,该字段是必须使用的缩放系数,160dpi屏幕的density是1,而240dpi屏幕的density是1.5,以此类推。利用density可以简单转换dp和px这两个度量单位:

px = dp * density = dp * (dpi / 160)

假设在某一应用中,用户的手指至少移动16px之后,系统才会识别出滚动或滑动手势。在160dpi基准屏幕上,用户必须移动 16 pixels / 160 dpi(等于一英寸的 1/10 或 2.5 毫米),系统才会识别该手势。而在配备高密度显示屏 (240dpi) 的设备上,用户的手指必须至少移动 16 pixels / 240 dpi,相当于 1 英寸的 1/15(1.7 毫米)。此距离短得多,因此用户会感觉应用在该设备上更灵敏。

要解决此问题,必须在代码中以 dp 表示手势阈值,然后再转换为实际像素。例如:

//以dp为度量单位的手势阈值
private static final float GESTURE_THRESHOLD_DP = 16.0f;
//获得当前设备的密度无关像素dp的缩放因子density
final float density = getResources().getDisplayMetrics().density;
//基于density将dp转化为当前设备适应的px,
mGestureThreshold = (int) (GESTURE_THRESHOLD_DP * density + 0.5f)
//使用以px为度量单位的mGestureThreshold变量值作为当前APP的手势阈值

DisplayMetrics.density 字段根据当前像素密度指定将 dp 单位转换为像素时所必须使用的缩放系数。在中密度屏幕上,DisplayMetrics.density 等于 1.0;在高密度屏幕上,它等于 1.5;在超高密度屏幕上,等于 2.0;在低密度屏幕上,等于 0.75。此数字是一个系数,用其乘以 dp 单位,即可得出当前屏幕的实际像素数。

1.3.4.2 ppi与dpi的区别

dpi(dots per inch)、ppi(pixels per inch),前者突出dot(物理像素点),后者突出pixel(像素),dot是一个物理的像素点,pixel就不一定了,一个pixel可能由很多个物理dot组成。

PPI描述了数字图像的像素分辨率,而DPI描述了打印图像上的墨点数量。尽管PPI在很大程度上是指屏幕显示,但它也会影响设计的打印尺寸,从而影响输出的质量。而DPI与数字化无关,主要涉及印刷。

对Android而言,dpi等同于ppi,具体可以参考PPI vs. DPI: what’s the difference?

1.3.5 缩放无关像素sp(Scale-independent Pixel)

在定义文本大小时,应该用可缩放像素sp作为单位。sp与dp很类似,但唯一的区别是:Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等),当文字尺寸是“正常”时,1sp=1dp,而当文字尺寸是“大”或者“超大”时,1sp>1dp。

1.3.6 点pt(point)

pt在两种环境中有两种不同的含义:在PhotoShop中,pt用来指定电子图像的尺寸并映射到印刷设备;而在iOS应用开发中,pt用来将指定电子图像的尺寸并映射到iOS设备。

但在上述两种环境下,pt都是逻辑单位,用来隔离输出设备的精度差异,保证输出结果的物理尺寸不会忽大忽小。

1.3.6.1 iOS设备中的点pt(point)

在iOS应用开发中,pt用来将指定电子图像的尺寸并映射到iOS设备。在163ppi的iOS设备中,1pt映射成1px,且1inch(英尺)等于163pt。而对于其他不同ppi的iOS设备,1pt可能会映射成2px、3px等像素,具体可参考下述表格:

1.3.6.2 PhotoShop中的点pt(point)

在PhotoShop中,pt用来指定电子图像的尺寸并映射到印刷设备。其中PhotoShop指定,当ppi为72时,PhotoShop中1pt映射成1px。且1inch等于72pt。

猜你喜欢

转载自blog.csdn.net/wq6ylg08/article/details/115417591