引子

屏幕适配是 android 开发/面试 绕不开的一个问题。本文 将屏幕适配的知识要点完整展现给各位读者。

正文大纲

android需要做屏幕适配的原因

基础知识点(很重要)

屏幕适配攻略

正文

android需要做屏幕适配的原因

关键字:android碎片化

android面世以来,google开源了android系统,各家厂商各自为政,导致屏幕尺寸没有统一标准,屏幕的宽高比各种各样,屏幕密度也是各个厂家攀比的资本, 导致Android开发者想要用一套代码来适配所有的设备变得格外的困难,虽然 谷歌出了 dp单位来替代px,但是 dp依然有它无法完全适配的地方。

这个也就是需要我们利用其他手段去 完成适配的地方。

面试点

Q: 关于屏幕适配,为什么 有了dp单位,依然要适配呢?

A: dp虽然能够解决大部分情况下的适配问题,但是针对少数机型,无法适配,

原因 是: google提供的dp单位,在现有的android市场环境下,是不可靠的,编码时的 dp,在运行时会转化成 px,此时的px不能准确对照UI的原本设计。

最直观体现就是: 同样300dp,在A手机上可以占满全宽,但是在B手机上,占不满,或者会超出全宽。

至于为什么dp不可靠? 后面会解释。

基础知识点(很重要)

以下概念很基础,但是也很重要,基础知识缺少一个环节,后面复杂的攻略理解起来就有障碍。

1. 像素点

像素点是物理概念,用术语来解释,就是如下这段话:

通常所说的像素,就是CCD/CMOS上光电感应元件的数量,一个感光元件经过感光,光电信号转换,A/D转换等步骤以后,在输出的照片上就形成一个点,我们如果把影像放大数倍,会发现这些连续色调其实是由许多色彩相近的小方点所组成,这些小方点就是构成影像的最小单位“像素”(Pixel)。简而言之,像素就是手机屏幕的最小构成单元。

简单来说,像素点就是屏幕上色彩区域的最小单位。在所有的设备上,1px 都是等同的。UI小姐姐作图一般都会以px为单位。

2. 分辨率

比如:19201080 分辨率,表示当前设备的屏幕是由 横向1080 纵向1920 个像素点 组合而成。

3. 屏幕尺寸

屏幕对角线的长度。 一般以英寸为单位,常见的屏幕尺寸有 4.7 , 5.5 ,6.0 。

4. 屏幕像素密度

定义: 一平方英寸面积内,存在多少个像素点。

同样是 1920*1080 的分辨率,存在两款手机,一个是4.7英寸,一个是6.0英寸,这两者的 像素密度是不一样的。

屏幕密度的单位: dpi(dots per inch).

标准屏幕分辨率 :160dpi 。即:一平方英寸面积,存在160像素点。(mdpi).

5. 屏幕尺寸,分辨率,像素密度 三者之间的关系

像素密度,可以由屏幕尺寸和分辨率计算得出。

计算公式为:

比如下图所示:

我这里有一块1920*1080的5寸屏幕,通过上面的公式计算得出,它的像素密度为 440dpi .

可见,px是和像素密度有直接关系的 像素单位。

5. 密度无关的像素单位(dp,或者dip)

全英文为:density-independent pixel.

(注意此处是dip,上面的像素密度是 dpi, 千万不要因为这个,在面试的时候出丑 )

使用dp作为长度单位,可以保证在不同的屏幕像素密度的手机上显示 很相似的效果。

比如: 使用480x800的手机上,要画一条长度为一半屏幕宽的线条,我们可以设置线条的长度为 240px,而在320x480的屏幕上,我们只需要160px,但是我们可以直接使用160dp,来同时让两个屏幕上的这条线占全宽的一半。

px和dp的换算公式为:px = dp * (dpi / 160)

公式解读:

如果有一个屏幕密度为 160dpi的手机,在它上面,1px=1dp;

而如果是 320dpi的手机,则 1px = 0.5dp.

简而言之规律就是: 屏幕像素密度(dpi)越高的手机,1dp所代表的px就越多.

下面解释为什么dp有时候靠不住.

如果UI小姐姐以320*480 dpi160的屏幕为标准,画了一条长度为160px的线,长度为屏幕宽度的一半,这个时候,你直接用 160dp,一般就能完成适配。但是如果这样的布局 运行在320x480分辨率,但是屏幕密度为150dpi 略小于 160dpi,这个时候 你布局里面写的160dp就会实际超过160px 不再是占屏幕宽的一半,而是略微超过。

6. 独立比例像素 (sp)

全英文为: scale-independent pixel (简称sp或者sip)

专门用于字体大小表示。

推荐使用12sp以上的偶数作为 字体大小, 不要使用奇数,或者浮点型小数,因为容易造成精度丢失。

面试点

Q: sp和dp有什么区别?

A: 通常情况下,dp和sp效果类似,但是有一点,如果用户 调整了手机字体,比如 从标准,变成了 超大,那么,1dp 原本等于1px依然不变,但是1sp就会从1px变成3px(只是举个例子,数值不必认真).

因此,在用户调整字体的情况下,同样的布局,可能出现 窗口大小不变,但是文字尺寸发生变化的情况。

屏幕适配攻略

1. 布局适配

使用多套布局适应不同屏幕。此方法必须要了解 布局限定符的概念。

如图:

限定符: 在原本的

layout后面加上横杠,然后加上限定名。形成 layout-XXX的形式,具体规则请参考谷歌官网:

https://developer.android.google.cn/training/multiscreen/screensizes, 重点摘录如下:

使用上面的限定符,几乎可以解决所有的适配问题,但是另外还有一个小技巧帮我们节省工作量 :

布局别名.

适用情形为:当多个加了限定符的 layout.xml中都引用了同一个 子布局,而子布局的内容可能相同,也可能不同。

这个时候,使用布局别名,可以节省操作量。

方案评价: 讲道理,这个是下下策,因为在你需要修改布局的时候,你可能需要修改多套布局,这个要多恶心就多恶心,懂的人都懂.

2 代码适配

我们通过java代码去获取屏幕的宽高,动态去指定控件的宽高 。

代码适配,一般用于动态创建 控件,或者自定义view自己绘制图形的时候。

特别提一下接口适配:当你去向后台请求图片的时候,我们可以在参数中带入屏幕的宽高,或者是控件的宽高,来获取我们想要的图片,在图片返回之后直接就能显示得最优,而不需要我们app代码中多动手脚。

方案评价:这个比下下策稍微好一点,但是 控件大小直接进入了代码,还是让代码不够雅观.

3. 布局组件的适配

尽量直接通过一套布局解决所有的麻烦,这个就叫布局组件的适配。这个是上上策.

包含如下手段:

使用像素密度无关的单位 dp sp

杜绝使用绝对布局,多使用相对和线性布局

多使用 wrap_content match_parent 以及线性布局的权重

多用 minWidth minHeight,lines 等属性

使用多套限定的 dimens中定义的尺寸

可能面试点

Q:同一个布局文件中,我使用线性布局和相对布局都可以达成目的,那么如何抉择?

A: 使用相对布局,很有可能出现 第一次测量"不满意"的情况,从而会测量第二次。如果两者都可以达成目的,并且两者的布局层级相同,并且线性布局中没有使用到权重(权重可能也会触发第二次测量),此时,优先使用线性布局。 除此之外,都选择相对布局。

结语

屏幕适配,工作中并不困难,但是面试多会问到。

现今主流的两种完美适配方案,有头条方案(直接变更DisplayMetrics中的density),以及 多套dimens适配方案,两者各有千秋。

最后

如果你看到了这里,觉得文章写得不错就给个赞呗!欢迎大家评论讨论!如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足,定期免费分享技术干货。喜欢的小伙伴可以关注一下哦。谢谢!

android 多套布局适配,Android屏幕适配 重点盘点相关推荐

  1. 【Android 屏幕适配】屏幕适配基础概念 ④ ( 屏幕适配限定符 | 手机/平板电脑设备屏幕适配 )

    文章目录 一.屏幕适配限定符 二.手机/平板电脑设备屏幕适配 平板电脑市场占有率 密度无关像素计算 手机设备限定符 平板设备限定符 参考文档 : 设备兼容性概览 屏幕兼容性概览 支持不同的像素密度 声 ...

  2. android百分比布局适配,安卓屏幕适配-百分比布局

    屏幕适配-百分比布局 原理:以父容器尺寸作为参考,在View的加载过程,根据当前父容器实际尺寸换算出目标尺寸,在作用在View上. 百分比布局实际是对容器的一中扩展,扩展的是宽高等比例的设置. 1.自 ...

  3. android大屏适配_Android屏幕适配

    Android屏幕适配 2020-04-20 09:07:33  By: 琛恋柏 随着安卓手机的样式越来越多,屏幕的大小也不一致,分辨率大小也多规格化,所以在开发中就遇到很多关于屏幕适配的问题,当然前 ...

  4. Android中获取屏幕宽度(利于屏幕适配)

    一.在adapter中获取屏幕宽度 WindowManager windowManager = (WindowManager) getContext().getSystemService(Contex ...

  5. android中自适应布局教程,Android自适应布局设计技巧

    由于目前在做的一款app需要适配手机和平板,所以我在研究怎么构建可适应所有屏幕尺寸的布局方法. 在web的自适应布局上我有很多经验,比如使用网格流,CSS3中的media queries属性等等,这些 ...

  6. ios 纯代码怎么适配ipad_iOS屏幕适配(纯代码)

    在iOS实际项目开发中, 我们经常要适配不同尺寸的屏幕,如iPhone4s,iPhone5/s,iPhone6/s,iPhone6Plus等. 在代码中创建一个控件如: UILabel *label ...

  7. Android中相对布局是,Android之相对布局

    Android中的布局分为六种,分别是相对布局.线性布局.表格布局.网格布局.帧布局.绝对布局,良好的布局设计对UI界面至关重要,下面先来看看先相对布局. 相对布局(RelativeLayout): ...

  8. android 模仿微信布局,【Android初学者】框架布局:仿微信页面制作

    学习Android有一段时间了,跟大家分享一下经验吧! 如果有错误的地方,有更好的方法,麻烦大家留言指导! 工具:studio2.2,虚拟机版本:4.3,API 18(感觉比5.1的稳定啊!) 例子是 ...

  9. android中帧布局效果,Android开发实现布局帧布局霓虹灯效果示例

    本文实例讲述了android开发实现布局帧布局霓虹灯效果.分享给大家供大家参考,具体如下: 效果图: 实现方式: framelayout中,设置8个textview,在主函数中,设计颜色数组,通过有序 ...

最新文章

  1. PHP无法编译undefined reference to `libiconv_open
  2. redis 系列25 哨兵Sentinel (高可用演示 下)
  3. sencha touch tabsidebar 源码扩展
  4. java中输出时间12小时制转换为24小时制显示
  5. 【HihoCoder - 1268】九宫 (dfs,深搜)
  6. python飞机大战实训报告200_飞机大战实训报告.doc
  7. cad布局打印出图-01-模型空间打印
  8. python 字典(dict)
  9. 中国计算机学会推荐国际学术期刊--数据库/数据挖掘/内容检索
  10. 随机游走分割算法(Random Walk Segmentation Algorithm)
  11. xuperchain部署合约Select utxo error, details:NOT_ENOUGH_UTXO_ERR
  12. 科技文献检索与计算机应用试卷,科技文献检索试卷
  13. ESP32 EC11 制作电脑音量调节旋钮
  14. 线性分式变换(linear fractional transformation)
  15. Windows10数据线连接坚果手机SmartisanTNT
  16. html怎么所有按钮没效果图,点击按钮没反应?所有按钮都没反应
  17. 程序员群嘲红芯浏览器:注释过度很业余 创新混淆视听
  18. RK3568-SPI
  19. 金蝶使用mysql_金蝶财务软件中的数据库如何进入?
  20. 匪夷所思!意念「返生」熟鸡蛋论文引争议,新华社:一个敢写一个敢发

热门文章

  1. SICK Visionary-T 固体激光雷达初始设置
  2. CPU和cache之间,cache和主存之间,主存和辅存之间数据交换的单位分别是什么?
  3. login as admin 01
  4. python预测比赛_快手活跃用户预测竞赛的第一名解决方案
  5. 960000-byte external allocation too large for this process VM won't let us allocate 960000 bytes jav
  6. 如何使用 Performance API
  7. 怎么把txt转为html,怎么把TXT转化为HTML格式?
  8. Three.js初识:渲染立方体、3d字体、修改渲染背景颜色
  9. 西电2014计算机研究生,西电2014年计算机研究生833考试大纲
  10. 西电-2019模式识别研究生考试