android 屏幕分辨率 屏幕密度,Android屏幕适配——多分辨率多屏幕密度

为什么要适配,适配的好处等等这里就不说了,直接说我们要怎么适配,请看下面的内容。

1.重要概念

px:pixel,像素Android原生API,UI设计计量单位,如获取屏幕宽高。

屏幕分辨率:指在纵向和横向方向上的像素点数,单位是px,一般显示方式是纵向像素数量*横向像素数量,如1920*1080。

屏幕尺寸:一般是屏幕对角线长度,单位是英寸,常见尺寸有3.5,4.0,4.3,4.7,5.0,6.0等。

屏幕像素密度:ppi pixel per inch的缩写,意思是每英寸屏幕上的像素数,因为屏幕尺寸是商家生产时就规定好的,屏幕尺寸一样的手机,屏幕宽高却不一定一样,所以通常取屏幕对角线像素数量和屏幕尺寸(屏幕对角线长度)来计算屏幕像素密度,计算公式就是通过勾股定理和分辨率计算得到屏幕对角线像素数量,再除以屏幕尺寸。手机参数上也会有这个数值。

dpi:dot per inch点像素密度,它的计算方法也和ppi一样,但从很多方面上,dpi是和ppi有区别的,ppi是用在设备上的单位,比如显示器;而dpi是用在印刷品上的单位,比如要打印一幅地图;在图像上的像素看起来是一个个点或者方块,这时候通常就将两者混用。要注意的是,我们并不能在Android适配时直接使用手机参数上的ppi值,而是使用dpi,Android对dpi根据大小做了规定的分档,以160dpi为基准,分为ldpi(120dpi)、mdpi(160dpi)、hdpi(240dpi)、xhdpi(320dpi)、xxhdpi(480dpi)等,当然现在手机的分辨率和尺寸更加多,像560dpi,600dpi也有,举个例子,Nexus 6 ppi是493,那按道理我们计算出来的dpi也是493,但Android的分档里面并没有493dpi,所以实际上它的dpi是560,而这个值我们是可以在手机的系统文件里面修改的。一定程度上,我们甚至可以说分辨率和适配没有关系,我们需要考虑的是dpi值,而这个值是可以与分辨率没有关系的,是手机厂家设的。

dp/dip:density independent pixels密度无关像素,Android设计的一个单位,它与px存在一个换算关系,Android规定,在160dpi时,1dp等于1px,那么320dpi时,1dp就等于2px,

所以当px换算为dp时,dp =160 * px / dpi;dp换算为px时,px = dp * dpi /160。换算方法代码:

ba8778c2c016?nomobile=yes

px与dp的相互换算

sp:scale independent pixels比例无关像素,是Android推荐使用的字体大小单位,同样是密度无关,而且看上去似乎使用dp也没问题(以前的Android开发很多是这样写)但是,原因就在比例上,字体除了数值设置外,还受到系统字体大小设置的影响,而使用sp是适应这种变化的,dp则不会跟随系统字体大小设置的变化而变化,所以除非你想字体大小不随着系统字体大小设置变化,字体大小单位都使用sp。但是sp与设计图上px的转换可以使用dp与px的换算公式。

2.适配

适配方案有很多种,比如百分比布局,比如根据每个要适配的屏幕都写一套布局,比如分辨率等比缩放等。但都有这样那样的问题,Apk体积增大,难以维护……我个人比较推荐以下的做法:

多个demins(dp写法)

我们可以把控件的大小数值写在多个dimens xml文件中,让应用显示控件大小的时候像获取图片资源一样,根据规则选择具体的值。而dimens文件在values文件夹下,其实就是应用到不同的values文件夹下的dimens文件中读取到需要的值。但这个“规则”的设置就是最考验适配技巧的时候了,诀窍在于我们怎么去命名values文件夹和对设计稿上控件大小进行符合“规则”的单位换算。让我们来看一下怎么去做?

values文件夹根据限定符去命名

屏幕尺寸:指最短的可用屏幕区域。如sw480dp,表示适配可用屏幕尺寸起码为480dp的情况。

屏幕分辨率:必须较大数值在前,较小数值在后,如1920x1080,表示适配分辨率为1920x1080的情况,其中x是英文字母x而不是乘号。

屏幕像素密度:如mdpi,表示适配屏幕像素密度值近似或等于mdpi(160dpi)的情况。

屏幕方向:如land(横向)、port(竖向)表示适配屏幕方向为land或者port的情况。

版本:vX(X代表版本号,现在是1到23),表示适配SDK版本为X的情况。

还有很多这里就不一一细说了。

限定符可以组合起来使用来限定更精确的情况如:values-mdpi-land-1920×1080-v19,表示适配SDK版本为19,分辨率为1920×1080的横向屏幕的mdpi手机。

学过组合的都知道这里能有多少种限定符组合,而且其中分辨率的值还是不定的,只要有厂家生产不同分辨率的手机,我们就可以有无数种限定符组合,然而,我们并不用惧怕,限定符的适配是向下匹配的,譬如:有values-port-1920x1080的手机屏幕需要适配,当我们建立的values文件夹里面没有一样的时候,就适配到下一级,比如values-port-1280x720(如果有而且是最接近目标的话),如果还没有,一直向下,最后起码能适配到values这个没有限定符的。

这里现在只考虑竖屏的时候(横屏就是增加land限定符,而且数值变化太大,布局也可能需要专门去写,适配的原理还是一样的,这里就以竖屏为例)根据以下的例子:

1.UI给我们做了一套1920x1080的图片,通常将该分辨率的图片放在drawable-xxhdpi的文件夹下,应为通常分辨率为1920x1080的屏幕都是xxhdpi(480dpi)的。

2.这时候,图片上有一个90x30(px)的控件,在1920x1080的机子的布局里面根据换算方法转换成30x10(dp)而xhdpi(320dpi)的1280x720上是多少呢?设在该屏幕上的长为A像素(px),根据比例式,A/720=30/1080,那么就知道A为20px,那么根据换算公式,dp还是10!

3.我们再来看看两个机子它们的sw是多少dp?选短边计算,1080/480/160=360,720/320/160=360,那么结合第二点来看,只要sw相同,无论具体的在屏幕上显示的px是多少,dp都是相同的,dp相同,代表视觉大小是相同的,意味着我们看到的布局效果是一样的,适配解决!

所以我们只需要使用规则给values文件夹命名如下:values-swXXXdp,就可以了。大概像这样:

ba8778c2c016?nomobile=yes

values文件夹命名

可能有人有疑问了,那么如果遇上一些超级奇葩的厂家给机子设置了很奇葩的dpi值呢,单靠这个规则就真的OK吗?

譬如:遇上分辨率为1980x1080,但dpi是mdpi的屏幕时,这台机子的尺寸就是短边1080/160/160=1080dp,那么我们只需要建立一个values-sw1080dp的文件夹,具体的dp值就是控件长的px值B = 30/1080*1080 = 30,dp = 30 / (160/160 )= 30,这并没有什么问题。

其实可以看出来,这不是分辨率等比缩放的写法吗?只不过把等比缩放之后的分辨率再根据换算方法将px换成dp罢了。但是!分辨率可以有无穷多种,而以下是可以使用的通用屏幕尺寸的一些值:

1.320,针对以下屏幕配置的设备:

240x320ldpi(QVGA手持设备)

320x480mdpi(手持设备)

480x800hdpi(高分辨率手持设备)

2.480,针对480x800mdpi的屏幕(平板或手持设备)

3.600,针对600x1024mdip的屏幕(7英寸平板)

4.720,针对720x1280mdip的屏幕(10英寸平板)

注意:当应用程序提供了多个带有不同值的最小宽度限定符资源目录时,系统会使用最接近(不超出)设备最小宽度的那个资源。这个限定符被添加在API级别13中。还要看android:requiresSmallestWidthDp属性,它声明了与你的应用程序兼容的最小的最小宽度,并且smallestScreenWidthDp配置字段会持有这个设备最小宽度的值。

那么我们的灵活性就大大提高的同时,相对于少则十几多则数十的分辨率种类,会使用近似值的sw-XXXdp写法就只需要少于十种的就可以搞定了。

当然,按照前面说的限定符规则,在sw-XXXdp的基础上,我们还可以加上版本号,屏幕方向去针对某些系统版本的手机或者平板,同样是比使用分辨率的少很多。

最后的问题就是就算要处理的只有几个dimens文件,但每个里面可能有十分多的值,一个个换算,新建,修改,简直是折磨人的,但既然我们知道了换算的规则,知道了dimens的调用规则,写个方法去修改xml的文件内容是很简单的,代码请下载(这里要感谢柯铿!):Android屏幕适配

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

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

相关文章

操作系统锁的实现方法有哪几种_「从入门到放弃-Java」并发编程-锁-synchronized...

简介上篇【从入门到放弃-Java】并发编程-线程安全中,我们了解到,可以通过加锁机制来保护共享对象,来实现线程安全。synchronized是java提供的一种内置的锁机制。通过synchronized关键字同步代码块。线程在进入同步代码块之前会自动获得锁&…

cocos2dx标准容器_cocos2dx[3.2](24)——内存管理机制

【唠叨】整合参考文档。【参考】【内存管理机制】在3.x版本,Cocos2d-x采用全新的根类 Ref,实现Cocos2d-x 类对象的引用计数记录。引擎中的所有类都派生自Ref。1、引用计数Cocos2d-x 提供引用计数管理内存。> 调用 retain() 方法 &#xf…

android长按加入购物车,《Android APP可能有的东西》之UI篇:加入购物车动画

很多电商app的加入购物车的动作会要求加上动画效果:飞进购物车,想来也合理,在listview界面时商品快速加入购物车,一直toast用户加入成功好像不太正常,所以添加一个动画,用户自然就懂了,而且也挺…

python里的shell是什么_python中的shell操作

http://blog.csdn.net/meng_tianshi/article/details/6682317 首先介绍一个函数: os.system(command) 这个函数可以调用shell运行命令行command并且返回它的返回值。试一下在python的解释器里输入os.system(”ls-l”),就可以看到”ls”列出了当前目录下的…

基于android 定位系统,基于Android平台定位系统设计和实现

2 0 1 3牟第 1 2期文章编号: 1 0 0 9— 2 5 5 2 ( 2 0 1 3 ) 1 2— 0 1 8 7— 0 4 中图分类号: T P 3 1 6 . 8 9 文献标识码: A基于 A n d r o i d平台定位系统设计和实现李瑞宣,王山东,徐志远,王伶俐(河海…

集合竞价如何买入_集合竞价买入法 如何在集合竞价中买入股票?

集合竞价买入法、 如何在集合竞价中买入股票?要想集合竞价买入涨停板,要做到如下3点:快、准、狠!文章将为你盘点这几个方法的具体做法,希望对股民有所帮助。快:就是利用9:15-9:25这1…

python 公众号爬虫_python_爬虫_微信公众号抓取

importrequests,pymysqlimportjson,jsonpath,random,re,time,datetime,os,imghdrfrom lxml importetreefrom selenium importwebdriverfrom urllib importrequestimportssl ssl._create_default_https_contextssl._create_unverified_context注意点:如果同一时间内刷…

开发工评价程师自我_常见“自我评价”写作范例

“自我评价”在找工作的时候是一个非常重要的内容,优秀的“自我评价”不仅就可以让别人对你有一个全面的认识,更可以通过寥寥数语就让别人对你产生浓厚的兴趣,让你的求职之路事半功倍。但是怎么写“自我评价”,却是让很多人犯愁的…

android调用服务器端口,更改运行adb服务器的默认端口(即5037)

使用环境variablesANDROID_ADB_SERVER_PORT选择端口。以下在bash下工作:$ export ANDROID_ADB_SERVER_PORT12345 $ adb start-server * daemon not running. starting it now on port 12345 * * daemon started successfully * $ adb devices List of devices attac…

visual studio 调试python_Visual Studio Code Python 调试设置

很意外Visual Studio Code居然支持Python代码的断点调试。一起来配置一下。工具/原料 Visual Studio Code 1.1 Python 2.7.11 方法/步骤 1 首先,当然是要先安装插件,配置Python环境。这个大家看这个文章 2 环境配置完成后,我们点击调试按钮&a…

cad图纸比对lisp_CompareDWG|CAD图纸比较软件(CompareDWG)下载v2018 官方版 - 欧普软件下载...

CompareDWG是一款免费的CAD图纸比较软件,可以帮助用户快速找到两个dwg图像之间的差异,使用不同的颜色进行标注,生成详细的报表,相比人工查找效率更高,准确率也高,支持几乎所有的autocad版本,适用…

android 电话 快捷键,Android studio开发常用快捷键详解

最常用快捷键1.Ctrl+E可以显示最近编辑的文件列表2.Shift+Click(点击)可以关闭文件3.Ctrl+[或者ctrl]可以跳到大括号的开头结尾4.Ctrl+Shift+Backspace可以跳转到上次编辑的地方5.Ctrl+F12可以显示当前文件…

leetcode c程序总提示主函数_Matlab系列之函数嵌套

昨天的那一篇讲的几个函数,不知道你们理解的如何,是否懂得怎么去使用了,如果还没懂,一定要再多看几遍,并且去在软件上进行实操,今天的话,将要介绍一下函数的嵌套,不过在正式讲嵌套之…

alibab仓库 idea_01.微服务架构编码、构建

教学视频传送:springBoot和springCloud的版本选型https://start.spring.io/actuator/info查看json串返回结果这就是我们的选型依据本次开发选用版本如下:cloud : Hoxton.SR1boot : 2.2.2.RELEASEcloud alibaba : 2.1.0.RELEASEjava …

华为手机出现android啥意思,传华为正研发手机系统,如果脱离安卓系统,还有啥能阻止华为前进...

原标题:传华为正研发手机系统,如果脱离安卓系统,还有啥能阻止华为前进自从国产手机正式进入了智能手机时代之后,中华酷联的中兴、酷派、联想早已经被华为甩在了身后。虽然现在国产手机已经呈现出华为、小米、OPPO、vivo四足鼎立的…

sql 数据库前两列值乘_Sql语句常用关键字

最近接触sql比较多,发现自己已经遗忘的也差不多,要用到的时候迟迟拿不出来,今天开始会在知乎上纪录一些sql语句学习的内容,内容重在说明查询语句的用法。一、sql查询语句的初始介绍1、查询语句的一般写法:select .....…

kayui进行添加_关于layui 实现点击按钮添加一行(方法渲染创建的table)

目标:layui 实现点击按钮添加一行解决方案:方案1、table 是用转换静态表格的方式创建的,写一个button,每次点击按钮,就添加一个 标签;方案2、table 是用方法渲染的方式创建的,写一个button,每次…

android怎样添加图片锐化功能,如何在android处理图片(图像二值化锐化转换格式).doc...

如何在android处理图片(图像二值化锐化转换格式)链接:如何在android处理图片( 图像二值化、锐化、转换格式)/thread-36559-1-1.htmlpackage net.wealthgod.client.center.ocr;import java.awt.Graphics2D;import java.awt.color.ColorSpace;import java.awt.geom.Af…

python的open方法_Python os.open() 方法

Python os.open() 方法 概述 os.open() 方法用于打开一个文件,并且设置需要的打开选项,模式参数mode参数是可选的,默认为 0777。 语法 open()方法语法格式如下: os.open(file, flags[, mode]); 参数 file -- 要打开的文件 flags -…

postforobject 设置代理_OAuth2RestTemplate中的代理配置

我需要使用由OAuth2保护的API.为此我使用OAuth2RestTemplate.但我得到以下错误:java.net.ConnectException: Connection timed out: connect由于代理问题,这种情况正在发生.我知道如何在RestTemplate中设置代理:SimpleClientHttpRequestFactory clientHt…