简述
为了避免 Android 设备的适配大坑,苹果提供一套适配自家产品不同尺寸的方案,让我们来探究一下像素与点的关系吧。
探究
从初代iPhone 到 iPhone 3GS,iPhone系列坚守 320 x 480 像素。开发人员采用绝对定位及像素模式进行处理。但是 iPhone 4之后就发生了改变,iPhone 4 采用Retina显示屏。即当前物理尺寸不变,但像素成倍增加,变成了640x960像素。
为了避免同行出现的大坑(屏幕适配难),苹果对开发人员提出了point (点) 的概念。(以一维方式进行探究)
1 在iPhone 3GS中, 1 个点 等于 1 个像素
2 在以后的设备中(非iPhone 6+/6s+/7+/8+/X) ,1个点等于2个像素
3 iPhone 6+/6s+/7+/8+/X 中 ,1个点等于3个像素
这样用户在使用iPhone 4 的时候,会感觉比iPhone 3GS 更加细腻。
由此,我们需要对市面上的一些单位及术语进行相关的总结:
1 英寸: 作为手机屏幕对角线的物理长度的单位。如 iPhone 8 Plus 为5.5英寸。
2 像素: 可以想象成屏幕上真正用来显示颜色的发光小点。如 iPhone 8 Plus 为 1080x1920 像素。
3 点: 针对开发人员,开发App时候用的单位,是一个虚拟的单位,用于屏蔽各个设备屏幕像素的不同,兼容以前的程序。
4 ppi(pixel per inch): 每英寸有多少个像素。 iPhone 4 的屏幕是 640x960像素,3.5英寸。那么根据勾股定理,对角线应该有 1154个像素,转换一下也就是 1154/3.5 = 330pi, 官方给出的数字是 326 ppi。
5 Retina屏: Retina翻译过来是视网膜。当像素太密超过 300ppi的时候,人眼就不能够区分出每个像素,因此 iPhone 4以后的屏幕都是Retina屏。
6 文字、颜色等矢量数据 放大是不会失真的。但是图片并非矢量数据,直接使用会产生问题。因此苹果对它采用不同的处理方式。
假设example.png 为 30x40 像素 (这里的单位为像素,数字图片的单位基本都为像素)。当example.png在 iPhone 3GS和 iPhone 4中使用的时候,都占据屏幕30x40个点。而iPhone 4中 1 个点等于 2 个像素,也就是30x40像素的图片,占据了60x80 像素的屏幕,因此这图片在iPhone 4中看起来会模糊。
为了对图片进行适配,需要准备三张内容相同的图片,放在同一目录下。
example.png // 30x40 像素
example@2x.png // 60x80 像素
example@3x.png // 90x120 像素
当程序中使用图片时,会根据屏幕模式自动选择对应的图片。 屏幕1x模式,就会选择example.png。 2x就会优先选择example@2x.png,假如example@2x.png不存在时,就会降级选择example.png。屏幕3x模式同理屏幕2x模式的降级选择。
附表 (至2017-11-06以来,iPhone 系列设备参数表)
机型 | 屏幕宽高(点) | 屏幕宽高(渲染像素) | 设备分辨率 | 屏幕模式 | 屏幕精度(ppi) | 屏幕对角线长度 |
iPhone 3GS | 320 x 480 | 320 x 480 | 320 x 480 | @1x | 162 | 3.5 英寸 |
iPhone 4 | 320 x 480 | 640 x 960 | 640 x 960 | @2x | 326 | 3.5 英寸 |
iPhone 4s | 320 x 480 | 640 x 960 | 640 x 960 | @2x | 326 | 3.5 英寸 |
iPhone 5 | 320 x 568 | 640 x 1136 | 640 x 1136 | @2x | 326 | 4.0 英寸 |
iPhone 5s | 320 x 568 | 640 x 1136 | 640 x 1136 | @2x | 326 | 4.0 英寸 |
iPhone 5c | 320 x 568 | 640 x 1136 | 640 x 1136 | @2x | 326 | 4.0 英寸 |
iPhone 6 | 375 x 667 | 750 x 1334 | 750 x 1334 | @2x | 326 | 4.7 英寸 |
iPhone 6 Plus | 414 x 736 | 1242 × 2208 | 1080 x 1920 | @3x | 401 | 5.5 英寸 |
iPhone 6s | 375 x 667 | 750 x 1334 | 750 x 1334 | @2x | 326 | 4.7 英寸 |
iPhone 6s Plus | 414 x 736 | 1242 × 2208 | 1080 x 1920 | @3x | 401 | 5.5 英寸 |
iPhone 7 | 375 x 667 | 750 x 1334 | 750 x 1334 | @2x | 326 | 4.7 英寸 |
iPhone 7 Plus | 414 x 736 | 1242 × 2208 | 1080 x 1920 | @3x | 401 | 5.5 英寸 |
iPhone 8 | 375 x 667 | 750 x 1334 | 750 x 1334 | @2x | 326 | 4.7 英寸 |
iPhone 8 Plus | 414 x 736 | 1242 × 2208 | 1080 x 1920 | @3x | 401 | 5.5 英寸 |
iPhone X | 375 x 812 | 1125 x 2436 | 1125 x 2436 | @3x | 458 | 5.8 英寸 |
iPhone Xs | 375 x 812 | 1125 x 2436 | 1125 x 2436 | @3x | 458 | 5.8 英寸 |
iPhone Xs Max | 414 x 896 | 1242 x 2688 | 1242 x 2688 | @3x | 458 | 6.5 英寸 |
iPhone XR | 414 x 896 | 828 x 1792 | 828 x 1792 | @2x | 326 | 6.1 英寸 |
iPhone SE | 320 x 568 | 640 × 1336 | 640 x 1336 | @2x | 326 | 4.0 英寸 |
iPhone SE(2) | 375 x 667 | 750 x 1334 | 750 x 1334 | @2x | 326 | 4.7 英寸 |
iPhone 11 | 414 x 896 | 828 × 1792 | 828 x 1792 | @2x | 326 | 6.1 英寸 |
iPhone 11 Pro | 375 x 812 | 1125 x 2436 | 1125 x 2436 | @3x | 458 | 5.8 英寸 |
iPhone 11 Pro Max | 414 x 896 | 1242 × 2688 | 1242 x 2688 | @3x | 458 | 6.5 英寸 |
iPhone 12 mini | 360 x 780 | 1080 x 2340 | 1080 x 2340 | @3x | 476 | 5.4 英寸 |
iPhone 12 | 390 x 884 | 1170 x 2532 | 1170 x 2532 | @3x | 460 | 6.1英寸 |
iPhone 12 Pro | 390 x 884 | 1170 x 2532 | 1170 x 2532 | @3x | 460 | 6.1 英寸 |
iPhone 12 Pro Max | 428 x 926 | 1284 x 2778 | 1284 x 2778 | @3x | 458 | 6.7 英寸 |
(注: iPhone 6+/6s+/7+/8+ 渲染像素与设备分辨率不一致,iPhone 3GS/6+/6s+/7+/8+/X除外,其他所有iPhone的ppi是一致的,都是326,用@2x的素材。
但是6+/6s+/7+/8+的实际ppi是401,理论上苹果应该用401/326 * @2x=@2.46x的素材。但是这个奇葩的比例对UI美工而言很难切图。所以苹果为方便开发者用的是@3x的素材,然后再缩放到@2.46x上,实际上是缩放到2.46/3=83%。实际上苹果选取了一个接近比例的87%。
这样算下来,物理分辨率和虚拟分比率的比例是87%,也就是1920/0.87=2208,1080/0.87=1242 。
好处就是开发者更方便,比如准备素材时,字号可以直接调成3x的。)
参考资料
1 http://www.zhihu.com/question/25421514
2 http://www.jianshu.com/p/ea0c362ed4b6
3 https://www.apple.com/cn/iphone/compare/
4 http://bbs.feng.com/read-htm-tid-8740473.html