由于Android厂商众多,各自进行深度定制之后,导致Android碎片化严重,从屏幕尺寸就可见端倪,市场上现存超过一万种屏幕,要让app在这么多个性化的屏幕尺寸上正常显示,对于开发者来说是一个很大的挑战。
一,基础知识
1,屏幕单位之--------寸、dpi、px
先把dip、sp丢一边,搞清楚dp、dpi、px。
我们先来看看常说的关于手机尺寸的几个概念。
现实生活中,通常描述手机屏幕大小用“寸”,比如华为mate8是6寸屏,指的是对角线的长度是6英寸。
另外一个表示手机屏幕大小的是分辨率,比如1280*720,指的是屏幕高度是1280个px,宽度是720个px。
可以看出,px和寸都是物理单位,绝对单位,长度单位。
2,dpi是什么鬼?
dpi就是上述两个物理单位结合生出来的东西,是他们的孩子。
数学上的意义是:对角线上每英寸包含的像素数量。
3,无中生有dp
用px做单位有何不好呢?
主要原因是Android屏幕大小不一,分辨率差异大,即使同一尺寸的手机,分辨率也可能相差很大,这就导致同一套以px为单位的布局即使在相同尺寸的屏幕上显示出来的大小也不一样。(此处缺图)
如果有一个和屏幕大小无关的度量单位就好了,于是dp应运而生。
说他无中生有,主要是因为他本质是一个相对单位,我们规定160dpi的屏幕为标准屏幕(别问为什么),这种屏幕上1px=1dp。
而在其他屏幕上比方说320dpi的屏幕上,dp与px 的关系是怎样的呢?
首先计算出像素比,320/160 = 2,相对于标准屏幕,320dpi的屏幕的像素比是2,即在这种屏幕上,1dp=2px
二,屏幕适配的常用方案
1,dimens
dimens的原理是根据不同尺寸的屏幕预先设计好尺寸,放在不同的文件夹下,Android系统在运行时会根据实际屏幕尺寸到对应的文件夹中获取相应的尺寸。
2,自定义控件
自定义控件的原理是:
① 选定某个尺寸(比如1920*1080)的屏幕作为基准屏幕,针对基准屏幕进行布局
② 自定义一个控件,控件的尺寸在运行时根据实际屏幕尺寸和基准屏幕尺寸的比例进行缩放,从而达到适配的目的。
三,dimens
1,使用ScreenMatch插件
2,生成基于dp单位的不同尺寸文件夹