背景
做移动App开发的同学,应该都被分辨率相关的概念或适配问题困扰过。甚至于设计人员,面对技术提到的dp,dip,sp等词汇时,也许也要懵上一会。在此,对开发中常用的一些概念做一个梳理。
基础概念
- 英寸(inch)
是英制的长度单位,1inch=2.54cm
我们通常用英寸来描述手机屏幕的尺寸。如iPhone6屏幕尺寸为4.7英寸,iPhone 6 Plus屏幕尺寸为5.5英寸,指的是显示屏对角线的长度。如下图:
- 像素(Pixel)
百科上给的定义,指基本原色素及其灰度。可以理解为屏幕上的一个最小物理显示单位。无论代码里使用哪一种单位,最终都要转化为像素单位,并显示出来。
- 屏幕像素密度 ppi(Pixels Per Inch)
由它的名称可以看出,ppi指每英寸长度上含有的像素数目。只是这里的测量方式是沿着对角线的。
那ppi怎么算出来呢?其实就是很简单的一个勾股定理公式:
举个例子,iPhone 5的分辨率是640px*1136px, 屏幕为4inch,代入上述公式可得到ppi=326。
- dpi(Dot Per Inch)
dpi指每英寸有多少个点。对手机、平板屏幕来说,dpi=ppi
iOS中的尺寸单位
pt 即point,是iOS里绘图时坐标系使用的抽象单位。我们应该把它和排版印刷中的point单位区别开来。
iPhone 3GS手机的逻辑分辨率是320pt *480 pt,屏幕的实际物理分辨率是320px * 480px,所以1pt刚好对应1px;
-
到了iPhone 4,苹果采用了Retina的显示技术,逻辑分辨率仍然是320pt * 480 pt,物理分辨率变成了640px * 960px (326ppi), 意味着1pt会被渲染为2*2的像素矩阵。如下示意图:
iOS中的scale(缩放因子),阐述了pt与px之间的一个映射关系:
1 point = scale * pixel
(3GS的scale=1, iPhone4、5、6的scale=2, iPhone 6 Plus的scale = 3)
对于iPhone 6 Plus机型,逻辑分辨率选用了414pt * 736pt,按照scale=3来计算,完美1:1映射的设备物理分辨率应该是1242px * 2208px。但实际上手机的物理分辨率没有那么大(1080px * 1920px),个中缘由我们就不探讨了,对开发者来说,就按照@3x来准备素材,剩下的工作由渲染时自动压缩完成。具体可参考如下链接中的一张示意图 https://www.paintcodeapp.com/news/ultimate-guide-to-iphone-resolutions
Android中的尺寸单位
大家都知道Android生态圈内的设备碎片化比较严重,出现了各种分辨率的屏幕。如果按屏幕密度(即ppi)来划分,广义上可以分为四种大小:低(120ppi)、中(160ppi)、高(240ppi)和超高(320ppi)。
- dp,也叫dip,Density-independent Pixels的简写,字面意思就是密度无关的像素单位。dp是基于屏幕密度的一个抽象单位,这点上跟iOS里的pt本质上其实是一样的。Android引入这个概念,也就是为了解决在不同ppi的设备上,能够得到相同的显示效果。
之前我们讲到,任何单位显示时都要转化为像素Pixel。那么dp和px的换算关系是怎样的呢?
px=dp*ppi/160
即在160ppi的屏幕上,1dp=1px;而320ppi的屏幕上,1dp=2px,可以理解为1dp的单位将以2个像素来渲染。
屏幕密度(ppi) | dp | px |
---|---|---|
mdpi(160ppi) | 1 | 1 |
hdpi(240ppi) | 1 | 1.5 |
xhdpi(320ppi) | 1 | 2 |
xxhdpi(480ppi) | 1 | 3 |
- sp,Scale-independent Pixels,是google建议的对字号使用的单位,比如在TextView里。为什么有了dp,还要引入sp呢?因为Android允许用户在“设置"里自定义文字尺寸大小(比如小,标准,大,超大,特大)。如果App功能上需要和系统这里的字号设置有联动关系,那使用sp就有意义了。实际开发中,如果没有这个必要,字号的地方使用dp也是没问题的。
以上简单总结了iOS和Android实际开发中的尺寸单位的概念。有不正之处,欢迎指正。