android dp sp px_Android屏幕适配★★重点盘点★★

引言

屏幕适配是 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. 屏幕尺寸,分辨率,像素密度 三者之间的关系

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

7030d263d115d660e9a89b1169c62233.png

比如下图所示:

230ccdc01725eff2e70508f534aaa751.png

我这里有一块1920*1080的5寸屏幕,通过上面的公式计算得出,它的像素密度为 440dpi .
可见,px是和像素密度有直接关系的 像素单位。

6. 密度无关的像素单位(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 不再是占屏幕宽的一半,而是略微超过。

7. 独立比例像素 (sp)

全英文为: scale-independent pixel (简称sp或者sip) 专门用于字体大小表示。 推荐使用12sp以上的偶数作为 字体大小, 不要使用奇数,或者浮点型小数,因为容易造成精度丢失。

面试点

Q: sp和dp有什么区别? A: 通常情况下,dp和sp效果类似,但是有一点,如果用户 调整了手机字体,比如 从标准,变成了 超大,那么,1dp 原本等于1px依然不变,但是1sp就会从1px变成3px(只是举个例子,数值不必认真). 因此,在用户调整字体的情况下,同样的布局,可能出现 窗口大小不变,但是文字尺寸发生变化的情况。


屏幕适配攻略↓↓↓

1. 布局适配

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

5d20a30e01e53fec24105ffa26f78d1c.png

限定符: 在原本的layout后面加上横杠,然后加上限定名。形成 layout-XXX的形式,具体规则请参考谷歌官网: https://developer.android.google.cn/training/multiscreen/screensizes, 重点摘录如下:

c35ceb9d9737acbfd7272e3115c45051.png
b53c051c6f69b86592311616076f6d09.png

使用上面的限定符,几乎可以解决所有的适配问题,但是另外还有一个小技巧帮我们节省工作量 :布局别名.
适用情形为:当多个加了限定符的 layout.xml中都引用了同一个 子布局,而子布局的内容可能相同,也可能不同。
这个时候,使用布局别名,可以节省操作量。

a711fa96c446771f011027a9a353b8dc.png
f8ef42b58e85f883df8ea0cf3b779b07.png

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

2 代码适配

我们通过java代码去获取屏幕的宽高,动态去指定控件的宽高 。 获取屏幕宽高的方式我不想在这里占篇幅,读者可自行百度。

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

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

3. 布局组件的适配

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

使用像素密度无关的单位 dp sp 杜绝使用绝对布局,多使用相对和线性布局 多使用 wrap_content match_parent 以及线性布局的权重 多用 minWidth minHeight,lines 等属性 使用多套限定的 dimens中定义的尺寸

可能面试点

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

结语

屏幕适配,工作中并不困难,但是面试多会问到。 现今主流的两种完美适配方案,有头条方案(直接变更DisplayMetrics中的density),以及 多套dimens适配方案,两者各有千秋。

在这我也分享一份自己收录整理的Android学习PDF+架构视频+面试文档+源码笔记,还有高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这些都是我闲暇还会反复翻阅的精品资料

总之也是在这里帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习

如果你有需要的话,可以点赞+评论+转发关注我,然后私信我【进阶】我发给你

70ea8b0d2660b8a525f4d865d8507beb.png
ac7e677bc05aeffecb9a0398a03c91db.png
31a32aee7d462ae3f9b1e788b03c264e.png
013554bc5a62aa69c06c2b4974e4ba79.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/489758.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI与网络安全的未来:数据集与协同能力

来源:安全牛有关 AI 优势与风险的争论如今已成媒体日常,很多此类讨论都集中在潜在负面影响上,话题范围从工作自动化导致广泛失业到 AI 用于创建 “深度伪造” 视频。但另一方面,我们已经在享受 AI 自动化助手的正面效果所带来的种…

ucinet计算聚类系数大于1怎么办_聚类性能评估-ARI(调兰德指数)

注意:ARI取值范围为[-1,1],值越大越好,反映两种划分的重叠程度,使用该度量指标需要数据本身有类别标记。用C表示实际的类别划分,K表示聚类结果。定义a 为在C中被划分为同一类,在K中被划分为同一簇的实例对数…

这才是未来真正的风口,一文看清13种硬科技投资趋势

来源:资本实验室如果非要说“风口”,那么在未来10年乃至20年,硬科技就是最大的风口。近期,由麻省理工学院创建的非盈利投资机构The Engine与投资研究机构Pitchbook联合发布了一份名为《2019硬科技图景》的研究报告。该报告将硬科技…

mysql 滚屏查看查询结果_MySQL_查询操作(select)

查询操作1、别名查询select id 序号,name名字from test_1209ryc;2、条件查询(between)select * from test_1209ryc where id between 2 and 5;3、条件查询(in)select * from test_1209ryc where id in(1,2,3);4、子查询select * from test_1209ryc where id in (select id from…

new arraylist内存_如何避免内部类中的内存泄漏

我先假设读者已经熟悉在Java代码中使用嵌套类的基础知识。在本文里,我将展示嵌套类的陷阱,内部类在JVM中引起内存泄漏和内存不足错误的地方。之所以会发生这种类型的内存泄漏,是因为内部类必须始终能够访问其外部类。从简单的嵌套过程到内存不…

马斯克:“星链”卫星已能提供服务

来源:一财网美国太空探索技术公司首席执行官埃隆马斯克22日称,该公司发射的“星链”卫星已能提供天基互联网服务。马斯克当天在社交媒体推特上发布的一条推文中说,“正在通过‘星链’卫星发送这条推文”。2分钟后,他发推文表示&am…

sqlplus连mysql库_sqlplus连接数据库

sqlplus连接到远程数据库我一直以为sqlplus是服务器端的软件,今天我才知道sqlplus是客户端软件,用sqlplus也能连接到远程数据库。windows下具体连接方法如下:如果已经配置过tnsname方法一.在运行或者命令窗口里面先输入sqlplus/n...文章张振磊…

OpenGL ES入门

OpenGL ES渲染管线概述 渲染管线一般是由显示芯片GPU内部处理图形信号的并行处理单元组成,这些并行处理单元之间是独立的,从另一个角度看,渲染管线实际上也是一系列绘制过程,这一系列过程的输入是待绘制物体的相关描述信息&#x…

【前沿】MIT搞了个进取型机器人!能研究学习对象操纵的基础

来源:中国机器人网 前言:MIT的研究让数据有了机器人的方向麻省理工学院的研究人员已经汇编了一个数据集,该数据集捕获了物理上推动数百个不同对象的机器人系统的详细行为。研究人员可以使用数据集(同类中规模最大,种类…

java进度条_自学java你需要知道的,适合编程小白

1. java学习网站之前在很多学习网站上学习过Java,踩过很多坑,今天给大家推荐一个比较好用的Java学习网站,希望大家能少踩坑Java教程 | 项目实践一站式java学习这个网站的针对性强,如果你是想学习Java,在这个网站学习就…

软考考前冲刺第一章计算机硬件基础知识

1.原码表示法和补码表示法是计算机中用于表示数据的两种编码方法,在计算机系统中常采用补码来表示和运算数据,原因是采用补码可以简化计算机运算部件的设计。 在计算机中,各类运算都可以采用补码进行,特别是对于有符号数的运算。在…

既然使用神经网络也可以解决分类问题,那SVM、决策树这些算法还有什么意义呢?...

来源:Jerry的算法和NLPJerry的算法和NLP先说下结论:没有一个模型是万能的,需要根据数据选择适合的模型。在机器学习中,数据大概可以分成四大类:图像 (Image),序列(Sequence),图(Graph) 和表格(T…

使用python处理子域名爆破工具subdomainsbrute结果txt

近期学习了一段时间python,结合自己的安全从业经验,越来越感觉到安全测试是一个体力活。如果没有良好的coding能力去自动化的话,无疑会把安全测试效率变得很低。 作为安全测试而言,第一步往往要通过爆破目标站的一级域名开始。作为…

美陆军将在2020年军演中测试人工智能新应用

▲美陆军利用人工智能技术探测隐藏的目标,例如这辆伪装的M109A6自行榴弹炮来源: 美国《防务快讯》/图片来自互联网 编者按美陆军人工智能工作组负责人表示,陆军已开发出可检测“侦察照片”中隐藏目标的人工智能技术,并将在明年举行…

Nature:1000种植物的测序揭示10亿年来的进化

来源:生物通千种植物转录组计划(1,000 Plants Project,1KP)是由加拿大科学家在2008年11月发起的,召集了将近200名植物学家对1,100多种植物的基因进行测序和分析。如今,这个项目的研究成果发表在《Nature》杂…

java 通过反射得到命名空间_利用反射得到一个命名空间下的所有类,并调用?...

当年话下Assembly.LoadFrom("assemblyName").GetTypes();Assembly.Load("assemblyName").GetTypes();遍历, 再通过Type.GetInterface(""),如果结果不为null,那就说明找到了再Activator.CreateInstance(“”)即可还是写段代…

量子霸权之争

来源: 原理这一个月以来,量子计算机领域吸引了许多人的关注,因为关于谷歌已经实现了人们期待已久的里程碑——“量子霸权”(也被称为”量子优越性“)的消息不胫而走。“量子霸权”是加州理工学院的理论物理学家John Pr…

主成分分析法案例_因子分析案例及操作解析

分析一个省的科技创新能力受哪些潜在因素的影响?(本数据来源于网络收集,x1~x15代表各省市相关经济指标)第一步:数据输入(如下图)第二步:操作步骤:分析——降维——因子分…

date js 半年_js Date 日期使用上的一个坑

作者:坚强一点链接:https://zhuanlan.zhihu.com/p/22253858来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。在写js 日历插件的时候遇到一个奇怪的情况。日历当前的日期是 2016-08-31 号 用 js Da…

IBM人工智能将“掌舵”全球首个跨大西洋自主驾驶船舶

来源:IBM中国IBM提供IBM Systems、AI、云以及边缘计算技术,“掌舵”全球首个跨大西洋的自主航行任务目标是拓展人类对于海洋的认识,以及消除海洋研究的障碍此次航行将帮助科学家们了解海洋塑料堆积这一重大社会问题日前,IBM THINK…