屏幕适配

Posted 孙晓凯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了屏幕适配相关的知识,希望对你有一定的参考价值。

最近在找工作,通过面试,自己也学习到了很多的东西,虽然都是移动端,但是不同的公司对技术的侧重点差别还是非常大的,比如,常见的一般应用类app,游戏类app,甚至是最近兴起的AR/VR类型的app,对技术的要求差别非常的大,但是在android这种放荡不羁的设备上,大家都有一个共同的问题—-屏幕适配!

啥是屏幕适配?

说白了,屏幕适配就是让我们的应用可以在很多类型的设备上正常的显示,管你是480*320,960*540,1920*1080的手机,甚至是平板什么东西,做到我的应用都可以在上面显示,要达到这个效果,我们就需要在开发的过程中进行适配。

为啥要进行适配呢?

在回答这个问题之前,先放一张图:

这就是android设备的各种屏幕尺寸,组成的图,有没有感受到android的放荡不羁?反正我是感受到了!

再来一张图:

这是ios的屏幕(不包括6和6s),是不是体会到了当年乔帮主的设计理念—-简约美,你以为简约之针对用户啊?

所以,一般来说,屏幕适配的难点主要是在android平台,今天就来对android平台下的屏幕适配方案做一个总结,可能不能包含所有的方法,但都是一些有用的方法。

什么是屏幕尺寸,分辨率,像素密度

  • 屏幕尺寸:不是指我们手机屏幕的宽或者高,而是指我们的设备屏幕的对角线的长度,单位是英寸(inch),1in=2.5cm.
  • 屏幕分辨率:其实就是指我们的手机又多少个像素,通常以480*320这种方式来表示,480就是竖直方向上有480个像素,水平方向上有320个像素,像素单位 px。
  • 像素密度:就是没英寸有多少的像素(dot per inch),有水平方向的像素数目,有竖直方向的像素数目,用勾股定理算出斜边的像素数目,然后除以屏幕尺寸,得到的就是像素密度,单位 dpi.

什么是dp

在上面我们知道了像素px和密度dpi,那么假设现在有这么一种情况:
有两个物理尺寸一样大的屏幕A,和屏幕B,但是屏幕A的分辨率是480*320,而屏幕B的分辨率是960*640,也就是B的像素点在水平和竖直方向上都是A的二倍,现在在A上画一条直线,占满整个屏幕,也就是设置长度为320个像素,然后在B上也画同样的直线,长度也设置为320像素,一运行,我们可以发现,嗯?A上面的直线可以占满整个屏幕宽度,B却只占了屏幕的一半,但是都是设置的宽度为320个像素啊,这是怎么回事呢?不知道你有没有理解,我们可以这样来理解,A水平方向有320个点,B水平方向有640个点,只是A的点与点之间离得比较远,B的点之间离得比较近,现在我们按照点的多少来设置,当然会出现不同的结果。

因为存在上述所说的情况,我们要进行适配,因为存在密度的原因,直接用像素肯定是不行的。

所以就定义了一个跟像素无关的单位—-dp,它是以160dpi为基准,也就是当屏幕密度是160的时候,1dp=1px,那如果是320dpi呢?那就是1dp=320/160(px)=2px,说到这,我们就明白了,就是我们在用dp的时候,可以忽略密度的影响。

注意:当物理尺寸一样,或相差不大的时候,dp可以有效的解决屏幕适配的问题,否则,不能解决适配问题,举一个极端的例子:密度都是160dpi,但是A屏幕宽320dp,B宽160dp,我们即使都设置宽度为160dp,最终的结果很明显,A占屏幕一半,B占屏幕整个宽度.

什么是mdpi,hdpi,xdpi,xxdpi?

A set of six generalized densities:
ldpi (low) ~120dpi
mdpi (medium) ~160dpi
hdpi (high) ~240dpi
xhdpi (extra-high) ~320dpi
xxhdpi (extra-extra-high) ~480dpi
xxxhdpi (extra-extra-extra-high) ~640dpi

=================================================
好了,概念都清楚了,接下来就是解决屏幕适配的各种方法了。

  1. 使用wrap_content,match_content,weight,用weight时要注意,如果是在宽度上用就把宽度设为0,反之亦然。weight的换算关系是:当前的宽度+剩余的宽度*(当前权重/总权重).

  2. 使用相对布局,因为相对的是控件,所以即使屏幕不同,适配效果也比较好;但是在效率方面在层级少的时候会比相对布局低;绝对不要使用绝对布局。

  3. 使用限定符:也就是建立不同的文件夹,定义不同的文件夹名字,系统会根据情况自动的找相应文件夹中的文件。

    • 尺寸限定符:在3.2之前的写法,
      如res/layout/main.xml;
      res/layout-large/main.xml

    • 最小宽度限定符:3.2之后的写法
      res/layout/main.xml;
      res/layout-sw600dp/main.xml

    • 屏幕方向限定符
      res/layout-sw600dp-land/main.xml;
      res/layout-sw600dp-port/main.xml

  4. 使用9patch图片

  5. 使用dp

  6. 设置不同像素密度的图片,分别放在对应的文件夹中。低于这一点,还有关于Drawable的一些细节.

参考资料:Supporting Multiple Screens

以上是关于屏幕适配的主要内容,如果未能解决你的问题,请参考以下文章

Android 屏幕适配屏幕适配通用解决方案 ① ( 定义 dimens.xml 方案 | 使用 ScreenMatch 插件生成不同屏幕分辨率的 dimens.xml 配置 )

Android 屏幕适配屏幕适配通用解决方案 ① ( 定义 dimens.xml 方案 | 使用 ScreenMatch 插件生成不同屏幕分辨率的 dimens.xml 配置 )

android 屏幕适配

Android屏幕适配总结

Android屏幕适配总结

屏幕适配