自Android系统发布以来,似乎一直绕不开屏幕适配这个话题。毫无疑问,Android系统能发展到今天,离不开其开放性,而随着国内手机厂商的崛起,任何用户、开发者、OEM厂商、运营商都可以对Android进行定制,于是导致长期以来一直诟病的碎片化严重的问题。
例如:
Android系统碎片化,比如基于Google原生系统定制:小米的MIUI系统、魅族的Flyme系统等等。
Android屏幕尺寸碎片化,比如5寸、5.99寸、6寸等等。
Android屏幕分辨率碎片化,比如320x480、480x800、720x1280、1080x1920等等。
而当Android系统、屏幕尺寸、屏幕密度出现碎片化的时候,就很容易出现同一元素在不同手机上显示不同的问题,为了保证某一元素在Android不同尺寸、不同分辨率的手机上具备相同的显示效果,这个时候就需要对屏幕进行适配啦。
屏幕适配相关概念:
屏幕尺寸
屏幕尺寸指屏幕的对角线的物理长度,单位是英寸,1英寸=2.54厘米。
比如常见的屏幕尺寸:5.0、5.99、6.0等等
屏幕分辨率
屏幕分辨率是指手机在横向、纵向上的像素点数总和,单位是px,1px=1个像素点,一般以纵向像素*横向像素。
比如分辨率2160x1080的手机,表示高度上有2160个像素点,而宽度上有1080个像素点,屏幕分辨率为:2160*1080。
Android手机比较常见的分辨率为:320x480、480x800、720x1280、1080x1920。
屏幕像素密度
屏幕像素密度是指每英寸上的像素点数,单位是dpi,即“dot per inch”的缩写。
比如设备内每英寸有320个像素,那么该设备的屏幕像素密度=320dpi。
屏幕尺寸、分辨率、像素密度三者关系
屏幕像素密度与屏幕尺寸和屏幕分辨率有关,在单一变化条件下,屏幕尺寸越小、分辨率越高,像素密度越大,反之越小。
手机的屏幕分辨率是宽x高,屏幕大小是以寸为单位,那么三者的关系是:
这里举个例子:假如手机的屏幕分辨率是2160x1080,屏幕大小是5.99英寸,对于一部手机来说这些都是已知的,求这手机的像素密度是多少?
即该手机每英寸有403个像素。
px
px即像素,是屏幕上显示数据的最基本的点,上面介绍屏幕分辨率的单位就是px,包括UI设计图、Android原生API都会以px作为统一的计量单位。
dpi
dpi即屏幕像素密度,每英寸上的像素点数,计算方式上面已经介绍过了,这里就不重复啦。
dp、dip
dp应该比较熟悉,我们设置固定数值的时候都是以dp为单位,而dp和dip是一个意思,都是Density Independent Pixels的缩写,即密度无关像素,与终端上的实际物理像素点无关,可以保证在不同屏幕像素密度的设备上显示相同的效果。
举个例子:比如我们想设置一张图片的宽度为屏幕的一半,那么
如果以像素px为单位,那么我们需要在320x480分辨率的手机上设置宽度为160px,而在480x800分辨率的手机上设置宽度为240px,两者的设置宽度就不一样了。
而如果以dp为单位,在这两种分辨率下,设置宽度为160dp都显示为屏幕的一半。
sp
sp即scale-independent pixels,与dp类似,通常用于指定字体的大小,当用户修改手机显示的字体时,字体大小会随之改变。
dp与px的转换
通常UI设计师给的设计图是以px为单位的,Android开发则是使用dp作为单位的,那么我们需要进行转换,换算关系为:
px = dp * (dpi / 160)
密度类型代表的分辨率(px)屏幕密度(dpi)换算(px/dp)比例
低密度(ldpi)240x3201201dp=0.75px3
中密度(mdpi)320x4801601dp=1px4
高密度(hdpi)480x8002401dp=1.5px6
超高密度(xhdpi)720x12803201dp=2px8
超超高密度(xxhdpi)1080x19204801dp=3px12
在Android中,规定以160dpi(即屏幕分辨率为320x480)为基准:1dp=1px
以上的概念梳理一遍过后,下面就要开始讲解适配方案啦,由于篇幅过长,就分开几篇更新,敬请期待。