Android屏幕适配

Android屏幕适配一直是Android开发们的一个痛点,各种各样的屏幕分辨率等,对Android的屏幕适配带来了很大的麻烦,而谷歌的解决方案也并不被所有人满意,所以笔者结合Android官方文档,来谈谈这个话题。

术语和基本概念

本节介绍Android屏幕单位等的一些基本概念。

屏幕尺寸

官方文档的解释是:

按屏幕对角测量的实际物理尺寸。 为简便起见,Android 将所有实际屏幕尺寸分组为四种通用尺寸:小、 正常、大和超大。

屏幕尺寸是指屏幕的物理尺寸大小,Android使用samll,normal,large,xlarge作为屏幕尺寸的限定符(3.2之后推荐使用sw<N>dp等来适配屏幕大小)。

屏幕密度

屏幕物理区域中的像素量,屏幕密度的单位是dpi(每英寸点数),粗略来说,屏幕密度越高的手机,看起来越清晰,我们通常放多组图片就是根据屏幕密度来划分的,Android将屏幕密度分为低、中、高、超高、超超高和超超超高,用字母表示是ldpi,mdpi,hdpi,xhdpi,xxhdpi,xxxhdpi。

分辨率

分辨率是指屏幕宽高的像素值。

密度无关像素

官方文档的解释是:

在定义 UI 布局时应使用的虚拟像素单位,用于以密度无关方式表示布局维度 或位置。

密度无关像素等于 160 dpi 屏幕上的一个物理像素,这是 系统为“中”密度屏幕假设的基线密度。在运行时,系统 根据使用中屏幕的实际密度按需要以透明方式处理 dp 单位的任何缩放 。dp 单位转换为屏幕像素很简单: px = dp * (dpi / 160)。 例如,在 240 dpi 屏幕上,1 dp 等于 1.5 物理像素。在定义应用的 UI 时应始终使用 dp 单位 ,以确保在不同密度的屏幕上正常显示 UI。

典型手机的屏幕

先看dp和px的信息:

dpi?px=1dp
ldpi120dpi0.75
mdpi160dpi1
hdpi2400dpi1.5
xhdpi320dpi2
xxhdpi480dpi3
xxxhdpi640dpi4

也就是说,屏幕像素密度越高的手机,1dp转换的像素数越大,成正比。 知道了dp的px转换,那么,Google引入dp来代替px究竟有什么用处呢?dp究竟是什么值呢? 看这个问题就要先看dpi,dpi是每英寸像素数,而dp与px的转换是与dpi成正比的,那么,对于一个dpi是x的手机来说,每英寸对应xpx,而对于这个手机来说,(x/160)px=1dp,那么每英寸对应x(160/x)dp=160dp。所以dp实际上反应的是实际的物理尺寸,和屏幕的分辨率,屏幕的像素密度等都无关。

Google推荐适配方案

了解了这些基本概念后,那么我们试着去理解Google的屏幕适配理念。首先,对用户来说,相同物理大小的屏幕肯定是一样的布局更好,而不该受限于屏幕的像素密度,所以Google用dp来解决这个问题,使用dp作为长度的单位,并配合Android的提供资源方案,能做到在相同物理大小的屏幕上有相同的布局。那么对于不同物理大小的屏幕,Google推荐对不同的屏幕进行专门的适配,而不是对布局进行简单的拉伸。

按比例适配方案

Google的方案固然是好,可是我们在做快速开发的时候,并不可能在屏幕的适配上下这么大的功夫,那有没有办法让所有屏幕的布局按比例看起来都是一样的呢。。。鸿洋的文章Android 屏幕适配方案给出了一个这样的方案。大致就是,根据UI给的切图,通过Java代码生成values文件,把所有的像素值替换成其余屏幕上的像素值。 例如UI切图是480320的分辨率,那么: 宽度为320,将任何分辨率的宽度分为320份,取值为x1-x320; 高度为480,将任何分辨率的高度分为480份,取值为y1-y480。 对于800480的宽度480:

其余分辨率类似。那么现在如果我们对所有的分辨率都做这个处理:
然后布局的时候使用xn,yn做单位,就可以做到按照百分比去适配屏幕了。

这么做是不是就完全没问题呢?

  1. 我们做头像的ImageView一般是正方形的,在上例中,UI给的切图可能是40*40像素的,我们就在布局中写x40*y40,可是其不不能保证在所有屏幕中都是正方形的。例如对于800*480的屏幕,x40=66.7px,y40=60px,这时候显示在屏幕上的就不是正方形的了。
  2. 使用px去适配是偏离Google的适配方案的,那么对于小屏幕高dpi的手机,Android会选择高精度图片,而由于屏幕小导致分辨率也不高,实际显示的像素可能低于选用的图片,造成内存的浪费(此时常规方式写的界面一般也会有适配问题)。也就是说Android的资源选取方案“不好用”了。

适配建议

以下是Google给的屏幕适配建议:

  1. 在 XML 布局文件中指定尺寸时使用 wrap_content、match_parent 或 dp 单位;
  2. 不要在应用代码中使用硬编码的像素值;
  3. 不要使用 AbsoluteLayout(已弃用);
  4. 为不同屏幕密度提供替代位图可绘制对象;

对于UI的切图,我们将其像素转换为dp写界面时,在xml文件中尽量不要使用较大的dp值,例如

我们写红色快的位置时,最好不要使用android:layout_marginRight="200dp",使用android:layout_alignParentRight="true" android:layout_marginRight="30dp"替代,因为200dp占屏幕的百分比更大,在不同屏幕下差异会比较大,对于宽400dp的屏幕,她左边对其50%的位置,对于宽600dp的屏幕,她左边对其67%的位置。当必须要使用大数值的dp时,如轮播图的高度等,可以对数值坐下屏幕适配。

写在最后的话

屏幕适配是个很繁杂的问题,可是一般也不用太受它困扰,我们只要使用dp去编写界面,就能满足大部分的适配要求,然后在针对测试出来的适配问题去专门适配就好。

参考

Android 屏幕适配方案 Android开发:最全面、最易懂的Android屏幕适配解决方案 官方文档

转载于:https://juejin.im/post/5aa7351e6fb9a028d3751116

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

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

相关文章

万维网www

WWW是环球信息网的缩写&#xff0c;&#xff08;亦作“Web”、“WWW”、“W3”&#xff0c;英文全称为“World Wide Web”&#xff09;&#xff0c;中文名字为“万维网”&#xff0c;"环球网"等&#xff0c;常简称为Web。 分为Web客户端和Web服务器程序。 WWW可以让W…

飞控计算机的作用,用于波音777飞机的主要飞控计算机

用于波音777飞机的主要飞控计算机飞行控制计算机容错技术本文介绍了在ERA1992年航空电子会议上介绍的波音777的主要飞控计算机。介绍了系(本文共1页)阅读全文>>在对无人机飞控计算机技术发展应用叙述的基础上,设计了一款基于Zynq平台的应用于小型无人机的飞控计算机硬件平…

Springboot,SSM框架的区别

参考文献&#xff1a;文章一 参考文献&#xff1a;文章二 总结&#xff1a; 1.Springboot 将原有的 xml 配置&#xff0c;简化为 java 注解 2.使用 IDE 可以很方便的搭建一个 springboot 项目&#xff0c;选择对应的 maven 依赖&#xff0c;简化Spring应用的初始搭建以及开发过…

Mysql导入excel数据,解决某些特殊字符乱码问题

问题 做项目需要从excel表格导入到mysql的数据库表中&#xff0c;excel表格中的“规格”字段的“”符号导入数据库表中&#xff0c;会出现部分数据的“”这个符号会乱码&#xff0c;成“&#xff1f;”的形式。 解决方法 打开excel表格&#xff0c;另存为csv文件&#xff1b;用…

Redis进阶实践之十六 Redis大批量增加数据

原文:Redis进阶实践之十六 Redis大批量增加数据一、介绍 有时候&#xff0c;Redis实例需要在很短的时间内加载大量先前存在或用户生成的数据&#xff0c;以便尽可能快地创建数百万个键。这就是所谓的批量插入&#xff0c;本文档的目标是提供有关如何以尽可能快的速度向…

项目经理沟通的四个好习惯

一名项目经理沟通的时间占到工作时间的80%&#xff0c;所以如何提高沟通效率就变成了项目经理提高工作效率的重点。 一名优秀的项目经理&#xff0c;无疑是一个好的沟通者。因为&#xff0c;专业的技能可以使你成为某个领域的专家&#xff0c;但出色的沟通技能&#xff0c…

u盘安装成功计算机里找不到文件夹,u盘里的文件不见了,详细教您U盘内容不显示怎么办...

在工作、学习中&#xff0c;我们需要把资料携带外出的时候&#xff0c;首选的存储工具基本上都是U盘。不过有用户在使用U盘时却遇到了U盘的所有的文件夹不见了的情况&#xff0c;但内存的明明文件还在&#xff0c;这到底是为什么呢&#xff1f;难道U盘的文件真的不见了吗&#…

五分钟实现SpringBoot快速入门

文章目录一、创建Maven工程二、添加SpringBoot的起步依赖三、编写SpringBoot引导类四、编写Controller五、测试六、SpringBoot工程热部署一、创建Maven工程 二、添加SpringBoot的起步依赖 文件位置&#xff1a;pom.xml SpringBoot要求&#xff0c;项目要继承SpringBoot的起步…

分布式系统开发工具包 —— 基于Kryo的Java对象序列化

Kryo是用于Java语言的一个快速和高效的对象图序列化框架。Kryo项目的目的是快速、高效、方便地使用API。当需要持久化对象的时候&#xff0c;不论是持久化到文件、数据库还是网络&#xff0c;都可以使用Kryo。 目前Kryo已经到了4.0.1版本以上了。本文的介绍适用于V2.0以上版本。…

代码编辑器Sublime Text 可以跨平台(linux,window,os x)

说到代码编辑器&#xff0c;大部分人首先会想到UltraEdit&#xff0c;EmEditor和notepad。但今天要介绍的是另一款功能非常强大的代码编辑器——Sublime Text。Sublime Text还是一款跨 OS X、Linux 和 Windows 三大平台的文字/代码编辑器。除了Sublime Text出色的功能&#xff…

计算机画图怎样更改文字,如何在图片上改字|超简单的修改图片里文字方法

这篇文章将要给大家介绍的是&#xff0c;不用联网&#xff0c;不用下载专业的图像处理软件&#xff0c;单纯用画图工具&#xff0c;就能修改表情包、图片上文字的方法&#xff0c;只适合简单的图片处理&#xff0c;复杂的还是交给专业的图像处理工具吧。下面系统吧就给大家带来…

软件维护

所谓软件维护就是在软件已经交付使用之后&#xff0c;为了改正错误或满足新的需要而修改软件的过程。可以通过描述软件交付使用后可能进行的4项活动&#xff0c;具体地定义软件维护。 1.改正性维护 因为软件测试不可能暴露出一个大型软件系统中所有潜藏的错误&#xff0c;所以…

【intellij idea】Project Structure 讲解

参考文章&#xff1a;戳这里 谢谢楼主分享

将以太坊封装为 ERC20

将以太坊封装为 ERC20 TOKEN 很多 DAPP 都是在处理 ERC20接口的 token, 其实很容易将以太坊封装为 ERC20,这样就可以统一处理, 至少我目前在做的雷电网络就是这么处理的. 主要内容复制在网络https://programtheblockchain.com/posts/2018/05/26/wrapping-ether-in-an-erc20-tok…

javascript高级程序设计学习之数值转换 |Number(),parseInt(),parseFloat()

2019独角兽企业重金招聘Python工程师标准>>> 将非数值转换成数值的函数有三个&#xff1a;Number(),parseInt(),parseFloat(); 小记tip&#xff1a;Number()可以用于任何数据类型&#xff1b;parseInt(),parseFloat()针对的是将字符串&#xff1b; Number()的转换规…

软件的可维护性

可以把软件的可维护性定性地定义为&#xff1a;维护人员理解、改正、改动或改进这个软件的难易程度。 提高可维护性是支配软件工程方法学所有步骤的关键目标。

服务器内存延迟,内存带宽、延迟性能测试

内存带宽、延迟性能测试华为FusionServer 2488H V5服务器主板集成了48个内存插槽&#xff0c;但送测机器配备有限。由于送测机型整合了四通道内存控制器&#xff0c;这样使得平台的内存带宽得到了明显的提升。SiSoftware Sandra Lite 2011中提供了内存带宽、内存延迟和缓存性能…

Git学习的最佳教程

身为网页设计师或者网页开发者的你&#xff0c;可能已经听说过Git这个正快速成长的版本控制系统。它由GitHub维护&#xff1b;GitHub是一个开放性的、存储众人代码的网站。如果你想学习如何使用Git&#xff0c;请参考本文。在文章最后&#xff0c;我们罗列了其他Git学习资源。 …

如何使用idea快速创建SpringBoot项目

文章目录一、二、三、四、五、一、 二、 三、 四、 五、