屏幕适配原理解析

        想写这篇文章很久了,一直手懒,不想整理,毕竟这块内容比较枯燥,要想完全掌握不只要理清,还得记得住。比如我就根本记不住,但是只要掌握了核心原理,应用完全不是问题。写这个的原因跟大多数人一样,主要是因为刚开始学习UI得时候不熟悉安卓和iOS屏幕适配,于是曾经在网上做了大量的资料搜集,但是没有一篇可以讲的通彻的,不甘心,于是一狠心从屏幕工作原理开始研究起来,整理网上查到的资料,最后不只掌握了安卓和iOS的适配,也了解到PC和MAC屏幕的区别。

        温馨提示,本文相当枯燥晦涩,不具有专业性,只是个人理解,我不是大神,但是比许多大神理解的更透彻。该文章只讲原理,不讲规范(规范有啥意思),UI设计规范来的请出去,吓吓侬!

        记得刚开始学习UI设计的时候,培训班的老师会给我们讲:由于安卓系统的开源特性,导致各大手机厂商推出了由自己设定的尺寸的屏幕,这就是屏幕的碎片化;同样iOS也在其不断更新迭代中,不断产生新的尺寸的屏幕出来。如下图:

屏幕适配原理解析_第1张图片
数据来自友盟
屏幕适配原理解析_第2张图片
数据来自友盟

这一现象对用户的选择增加了多样性,促进了消费,但是对手机APP的设计和开发人员造成了不小的麻烦,要知道手机只是承载获取信息的工具,内容才是主导消费的中坚力量。如果没有一个合适的解决办法,app设计师和工程师就需要对每一种屏幕都进行适配,这是相当消耗人力物力的。好在,人类是伟大的,我们有办法。

一、名词解释

先来熟悉一下我们会用到的单位和名词:

像素

像素是图像元素的简称,英文Pixel来自picture+Element的组合,像素没有单位,或者说像素的单位是“个”,也可以说像素本身就是一个单位。

一、物理意义:

屏幕中显示图像的最小发光单位,由三个红绿蓝三种颜色的子像素组成,具有物理体积,由于体积极小实际物理体积对适配没有意义,通常用比较宏观的单位 “分辨率” 来描述大小(后面会解释)。像素点不一定是正方形的,这跟不同的屏幕技术、色域等有关。如下图:

LCD屏微观照https://www.bilibili.com/video/av18010287/
AMOLED屏幕像素微观https://www.bilibili.com/video/av17119321/

插一段:随着技术的不断进步,像素点是可以继续缩小的,就是说屏幕的精度也将继续提高,LCD屏幕采用背发光,需要白色发光板来照亮带颜色的像素晶体,通过液晶层调节通光阀门控制白光的通光亮从而控制三色晶体的不同程度的明暗度,最终混合成我们所需要的图像颜色,它的黑是耗电且发亮的黑;相比之下AMOLED屏幕就牛逼了,每个子像素都可以自己发光,自己关闭,因此它的黑就是真正的不通电的黑,这就是AMOLED比LCD屏鲜亮轻薄省点的原因,不仅如此AMOLED的屏幕因为没有背光板和液晶层所以可以弯曲折叠,而不影响最终成像,这就是曲面屏技术。

这根我们要讲的屏幕适配没有直接关系,只是你需要明确了解像素这个物理实体。

二、虚拟意义:

1.  屏幕中一张图片的像素大小是100x100px,说的是屏幕里这幅位图是由10000个色点 空间混合而成的,注意:这里的另一层含义是图片的像素大小是 虚拟量,是供计算机识别的单位。图片像素大小是描述图像尺寸的唯一因素,没有任何场景的情况下说一幅图片分辨率是72ppi或者300ppi都是完全错误的,分辨率将在下面讲到。参考https://www.jianshu.com/p/e7a53ac55454


屏幕适配原理解析_第3张图片
远看


屏幕适配原理解析_第4张图片
近看

稍微提一下,可能不完全正确:为什么说像素是描述图像尺寸的唯一因素,这要说到图片的来源--数码相机

数码相机通过感光元件CCD电荷耦合器件来接受镜头折射来的光线,我们常说2000万像素后置柔光双摄照亮你的美,就是说这台手机的CCD上有两千万个感光元件颗粒(也叫做像素),这个东西比屏幕上的像素更牛逼更细小,这就说的是摄像头的解析度,而不是分辨率(错误说法),因为每个颗粒只能记录一种颜色,所以通过这个元件生成的图像就有两千万个像素点生成,这种图像也叫做位图,每个元件摄取的颜色方块是可以无限放大的,所以位图可以无限放大缩小,没有固定的物理尺寸,但是放大后看到的是密密麻麻的小方格,离远了看就成了一幅图像,这涉及到眼睛的成像原理,艺术中也叫空间混合,有兴趣可以继续深究(我是懂了,不解释)。位图可以被细化像素数,也就是改变图像像素大小(ps就可以做)但是不会提高清晰度,因为相机已经决定了他的清晰度(包括通光亮、色值、像素数),现在谷歌AI算法可以通过卷积神经网络深度学习技术balabala来重新成像,极高的提高清晰度,不解释(我是懂了)。

2.  像素作为屏幕解析度的单位来使用,例如:

iPhone8的解析度为:750x1334px,意思就是iPhone8的屏幕上有750x1334=1000500个发光二极管(解析度下面讲)。

三、与其他基础单位的区别(px、pt、dp、sp)

pt与px

a.    Point 磅、点,缩写pt:描述字体大小的物理单位,用于印刷行业,1pt=1/72in。

插一段:Apple公司最初的Mac屏幕分辨率只有72ppi,所以Mac上显示的72px的图像就是1inch那么长,只不过苹果把px改成了pt(所以这里的pt是虚拟单位),与印刷行业保持一致(与当时市场环境有关);微软是个人电脑的先驱,最初将屏幕做成96ppi,就是说96px大小的图片显示出来就是1inch那么长,但是微软仍然使用px做虚拟单位;

b.    pt是iPhone屏幕的专用单位,这里的pt就不再是“磅”或“点”了。

初代iPhone 3GS的对角线为3.54inch,解析度为320x480px,分辨率为163ppi。Apple将该机型的屏幕分辨率定义为基准分辨率,因此在该机型上1px图像会显示的长度就是1/163inch,更丧心病狂的是,乔布斯将这个显示出来的1/163inch的长度定义为1pt(我就是牛逼你能拿我怎么样),也是用了pt这个字母做长度单位,因此在基准分辨率下的iPhone屏幕上1px=1/163in=1pt。(同理:安卓将初代安卓机型160ppi的屏幕上的1/160inch定义为1dp),所以以后在给iPhone标注一倍图的时候不要再用dp和px了,你要打的过开发小鸽鸽也行。

px是虚拟单位用来描述屏幕中图像的大小,是计算机识别单位,而inch是物理单位,用来描述人视线中的大小,只有在经过虚实匹配的标准电脑所显示的情况某种意义下才会保持数值一致(比如现在pc机的设置里有分辨率这一项,里面的推荐分辨率就是虚拟与现实一对一的像素对齐,讲到最后大家可以自己理解一下)

dp与px

为了保证相同的图片在不同分辨率的屏幕上显示的大小基本一致和清晰,微软、苹果、谷歌都提出了一个概念叫:与设备(密度)无关的像素(独立设备像素)Density(Device)- Independent Pixel,简称 DIP 或 DP,也叫逻辑像素。

仔细理解一下这句话“与设备无关的像素”,首先可以知道dp也被叫做像素,似乎跟px差不多;然后说“与设备无关”,这点就牛逼了,也就是说我不管在哪台设备上,不管是在window还是MacOs还是iOS还是Android的设备上,不管是大屏还是小屏,1dp都是一样的长,你看到的那么长。例如在iPhone上用尺子量是1cm的一个图片,放到pc机上还是1cm,要知道iPhone屏幕的精度是远高于pc机的好吧!

那这个单位是怎么想出来的呢?总不能就这么悬着没有一个标准吧!别急,且听老夫慢慢忽悠,我们下面会讲,这里需要大家记住dp的意义是:

“适配中控制变量,即保持最终显示图像的物理大小一致,dp是人为定义的实际的物理单位。“,移动设备中,dp和pt意义是一样的,只不过dp是安卓使用的,pt是iOS使用的,下面还会讲。

所以先记住:pt、dp和px是两种不同意义的单位,就像“米”和“个”。

sp与px

放大像素:Scaled Pixel简称sp,只用于描述字体的大小,基于基准分辨率来缩放的,也是一个中间单位,可以实现与dp一样的作用,但是其实质是不同的。(慢慢感受)

sp是与缩放无关的抽象像素(Scale-independent Pixel)。sp和dp很类似但唯一的区别是,Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),当文字尺寸是“正常”时,1sp=1dp=0.00625英寸,而当文字尺寸是“大”或“超大”时,1sp>1dp=1英寸/160dp=0.00625英寸。类似我们在windows里调整字体尺寸以后的效果——窗口大小不变,只有文字大小改变。https://blog.csdn.net/aa971644/article/details/77583961就是说如果你字体使用dp做单位的话,用户就不能再设置中自行把字体放大(老年人使用手机就得放大几号)

解析度  Resolution

米尺的分段数,例如:

长度为1m的尺子平均分成10段,解析度就是10段;

1㎡的木板平均分成100格,解析度就是100格 ////(懵逼了吧!)

同理:我们常说iPhone8的屏幕分辨率为750x1334px,其实是指,iPhone8的屏幕解析度是750x1334px即1000500px,是指屏幕像素的个数。(国内常把解析度和分辨率都叫做分辨率。现在分辨率的使用真的非常混乱,我们只好将错就错)

分辨率 (密度、精度)

复合单位,解析度的倒数,也指单位刻度的长度,例如:

1m的尺子平均分成10段,分辨率就是10段/m,即每段0.1m;

2m的尺子平均分成10段,分辨率就是5段/m,即每段0.2m;

1㎡的木板平均分成100格,分辨率就是100格/㎡ ,即每格0.01㎡////(懵逼了吧!)

屏幕分辨率(Pixel density),即屏幕像素密度:Pixel Per Inch 简称 ppi(打印分辨率:Dot Per Inch 简称 dpi),为了不与现在的广泛说法冲突,下面的分辨率全称为屏幕像素密度。

屏幕上单位长度所含像素个数,想表达的是屏幕的显示精度,是联通现实与虚拟的桥梁,为什么不是单位面积内的像素数呢?因为算面积数值太大容易出错还很麻烦。

我们常说iPhone8的分辨率为:326ppi,指的是,iPhone8屏幕上每英寸分布约有326个像素点。

算法:计算屏幕对角线上像素的数量

屏幕适配原理解析_第5张图片

简单来写就是:ppi=px/in

why?

为什么屏幕大小以对角线长度为标准? - 知乎https://www.zhihu.com/question/19640648

我的理解

1、为了屏幕多样性,这样屏幕长款是不受限制的,不然都做成方屏多简单;

2、前面提到像素点不一定就是方形的,反而不同尺寸的矩形子像素可以更好的将三原色平均分布到屏幕中,例如上面的AMOLED屏,因此造成长度上的分辨率和宽度上的分辨率不一致,两个数值都不能来描述屏幕像素密度,只有权重均值的对角线可以担此大任。

3、下面讲到的适配关系式也有助于理解。

英寸:inch

1inch=2.54cm  物理单位,用于有描述屏幕物理尺寸

为什么显示屏的大小用英寸而不是厘米衡量? - 知乎https://www.zhihu.com/question/20452297



二、原理剖析



1、设备无关像素:与设备或密度无关的像素(Density(Device)- Independent Pixel,简称DIP或者DP)

上面我们提到dp的意义是:

“适配中控制变量,即保持最终显示图像的物理大小一致,dp是人为定义的实际的物理单位。“

那么该问题主要解决同一幅图像在不同大小的屏幕上看起来一样大的问题。我们先说原理后举例(放大招了)


屏幕适配原理解析_第6张图片
如上图:假设有两台不同屏幕大小和屏幕像素密度的手机A与B,屏幕像素密度分别是Appi与Bppi,显示出了同样大小的图片(边长为μin的正方形),

设图像在A手机中的边长为apx,B手机中的边长为bpx,(注意:这里就是体现px这个虚拟单位意义的时候,它指的是手机识别的图片大小,到后面你会知道这个值就是你为不同手机做设计时所需要的尺寸)

先称述一个事实;

根据:ppi=px/in 可得出如下关系式:

apx/Appi=bpx/Bppi=μin  ,变形可得:b/a=B/A,这里B/A就是两设备屏幕分辨率的比值α

如果已知A手机中的图片大小a,就可以知道B手机中图片的大小  b=a(B/A)  ∴ b=aα

这个事实其实已经解决了屏幕倍率的问题。如果我们知道两台设备的分辨率(上他的官网查找),和其中一台设备屏幕设计稿的大小,就可以确定另一台屏幕应该采用多大的设计稿。

例如:iphone3GS的屏幕像素密度为163ppi,iphone8的屏幕像素密度为326ppi,∴α=326/163=2,在3GS上有一个100px的方形按钮需要适配到iPhone8上,那么给iPhone8的设计尺寸就应该是100α=200,所以α就是我们说的倍率,

重点来了,上面我们已经提到

苹果将分辨率为163ppi的屏幕分辨率定为基准分辨率,即,在163ppi的屏幕中,1px=1pt=1/163in,

安卓将分辨率为160ppi的屏幕分辨率定为基准分辨率,即,在160ppi的屏幕中,1px=1dp=1/160in,

所以公式:b=a(B/A)就是核心原理了,变成我们需要的单位就是:PXb=DP(PPIb/PPIa),PPIb/PPIa就是屏幕间的倍率。

运用一下:

1:已知iPhone8的屏幕解析度是750x1334px,那逻辑像素是多少?

答:因为iphone8的屏幕像素密度是326ppi,是基准屏幕像素密度163ppi的两倍,所以逻辑像素=屏幕解析度➗2,最后得出逻辑像素是:375x667pt

2:已知Huawei P20的屏幕解析度为2248x1080px,屏幕尺寸为5.8inch,求屏幕宽度的逻辑像素是多少?

屏幕适配原理解析_第7张图片
安卓并没有严格按照像素密度比例来作为倍率,而是规定了不同范围的密度属于何种倍率。

答:先根据屏幕像素密度计算方式,求得屏幕像素密度为430ppi(实际为428ppi,因为有刘海),参考安卓屏幕像素密度区间划分可知,该屏幕属于3倍屏XXHDPI,所以,该机型宽度的逻辑像素=1080/3=360dp。

OK,到这里pt和dp就完全具备了实际的物理意义,都叫做与设备无关的逻辑像素,二者的实际长度不一样,但是谈两者的长度没有意义,只能说明两家的第一代手机苹果的比安卓的分辨率高一点点而已,我们说了dp是与设备无关的像素,并不影响屏幕图像的清晰度,所以不要在意pt和dp的具体长度,除非有一天你建立了自己的移动系统帝国,你定为1/10000in都没关系,只要你不嫌麻烦。

插一段:有同学就问了,你不是说px是虚拟单位,dp是物理单位,两者不能混谈吗?是的,两者确实意义不一样,但是你要知道,px是可以看的见数的清的数量单位,而dp是人为约定的单位,就像为什么1m就是1m那么长,在m诞生前是没有衡量标准,同样,kg也是人为定义的质量单位,千克是一个实实在在的金属块,百年前科学家做了一块可以放置很久不会产生质量变化的金属玻璃罩内,以他的质量为标准定位1kg,直至今日仍然放在各国博物馆内,每年都会有人专门去测量该物体的质量是否发生了变化(已经确定该金属质量已经低于最初的数值),他决定着所有物体的质量数值变化(现在科学家识图采用量子技术重新定义各种基本单位,例如銫原子钟可保一秒的时间几亿年都不会变),同样谷歌公司这样约定在160ppi的屏幕上的1个像素长度就是1dp,1dp=1/160in。明白了吗?(呼,费劲)所以不要死磕为什么要这样定,我就这么定了你管得着吗?

回顾一下:

屏幕适配原理解析_第8张图片

这就是屏幕的适配原理,嗯就酱,简单吧!


三、屏幕分辨率和系统分辨率如何影响图片的显示(装逼部分)



大家一定在windows系统上体验过这两个选项

屏幕适配原理解析_第9张图片

根据我的理解:

第一个框“更改文本、应用等项目的大小”是系统分辨率(windows默认96ppi)

第二个框“分辨率”是模拟不同机型的屏幕解析度

讲一下(呱唧呱唧):

电脑在屏幕输出图像需要经过几个过程(纯属个人臆想):

屏幕适配原理解析_第10张图片

计算机摄入图片,系统解析图像像素数据(像素数、色值等),系统将解析出的图片像素分发到屏幕中的像素点,最终屏幕呈现解析效果

所以这里有两个名词:系统分辨率和屏幕像素密度。

屏幕像素密度就是屏幕上的像素颗粒密度,而系统分辨率则是各系统自行规定的数值(其实就是逻辑分辨率),例如windows系统系统分辨率默认为96ppi,Mac系统默认系统分辨率为72ppi,不受任何物理因素的影响,完全是虚拟量。一开始上面在讲pt与px的时候已经提到了这一点,与当时的市场环境有关

假设有一台显示器屏幕中显示图片:

屏幕尺寸:Sin

屏幕解析度:Rpx

屏幕像素密度:Pdpi

图片像素大小:npx

图片显示大小:Fin

则有:

Pdpi=  Rpx / Sin  (屏幕解析度对屏幕像素密度的影响)

Fin=  npx / Pdpi (图片显示大小得出公式)

∴  Fin=  npx / (Rpx / Sin)

      =  (npx Sin) / Rpx

综上所述:当屏幕尺寸不变,屏幕解析度缩小时,屏幕显示的图像会放大,所对应的就是上图中的“分辨率”,只不过,这里的“分辨率”是系统模拟不同机型的屏幕解析度。

如何引入系统分辨率?系统分辨率是用来解析电脑语言的,例如电脑不知道1pt有多长,但是他可以决定在在这个长度上安排多少个像素,所以,我们将上面的图片改为文字(因为文字是用磅来计量的),通过系统的解析将系统分辨率带入函数。如下

系统分辨率:sdpi

文字显示大小:Fin

文字输入大小:Npt(point)

文字像素大小:npx

则有:

npx=(Npt / 72)sdpi  (求出了文字的像素大小)

∴  Fin=  (npx Sin) / Rpx

    =  (Npt sdpi Sin) / (72Rpx)

综上所述:当屏幕尺寸和解析度不变的情况下,系统分辨率越大,显示的图像越大,所对应的就是上面的缩放百分比。怎么理解,系统分辨率越高意味着可以将同一幅图像拆分成更多个像素点,比如,72ppi的系统分辨率解析1pt的文字,可以解析成1x1个像素点,那144ppi的系统分辨率就可把1pt的文字解析成2x2个像素点,因此提高后,同一幅图像占用了更多的像素点,即占用了更大的显示面积。所以显示的图像越大。

举个栗子:

我有一台屏幕解析度为1600x1200px的显示器,想调成800x600的解析度,有两种办法:

1、调整设置中的“分辨率”为800x600px,这样,图像会用当前的屏幕像素一对一显示800x600的图像像素(现在的显示器会放大到屏幕最大高度,单击游戏设置中可以体验小屏视窗),图像缩小居中于屏幕显示出来;

2、调整“缩放”为200%,意味着系统分辨率提高了两倍,图像相应的放大了两倍,这种效果跟前一种的情况把显示区域放大到完整屏幕的效果是一致的,也就是仿真显示。

大概就这些,基本都逼逼完了,不知道大家可以理解多少。以上内容不具有专业性,本人也并非技术人员,如果有不正确的地方欢迎指出,彼此共勉。

感谢

你可能感兴趣的:(屏幕适配原理解析)