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关键字同步代码块。线程在进入同步代码块之前会自动获得锁&…

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

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

基于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平台定位系统设计和实现李瑞宣,王山东,徐志远,王伶俐(河海…

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

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

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

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

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

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

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

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

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

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

谷歌fuchsiaos和华为鸿蒙,华为鸿蒙最大的对手现身!谷歌正式推送Fuchsia OS,或替代安卓...

原标题:华为鸿蒙最大的对手现身!谷歌正式推送Fuchsia OS,或替代安卓可能是看到了华为鸿蒙的进展神速,谷歌在近日也正是开始了Fuchsia OS的推送。5月25日,谷歌Fuchsia OS项目负责人在社交媒体上公开喊话:“今…

c html转为datatable,C#中DataTable导出为HTML格式的方法

前言在C#中DataTable导出数据的时候,我们需要HTML格式的输出数据, 这时候就需要使用将DataTable导出为到HTML格式的方法了,以下代码就可以帮助我们达到目的。首先,我们要绑定DataTable和 DataGridView。一、通过DataTable绑定DataGridView1. 创建DataTab…

mybatis insert 忽略 联合唯一索引_MySQL实战中,Insert语句的使用心得总结

提到MySQL的Insert语句,你肯定不陌生,或许已经张口就来:不就是insert into table values(xxx,xxx,xxx)嘛!没错,但在实战中,根据不同的需求场景,插入操作在语法、执行方式上的用法多种多样。今天…

eureka集群只注册一个_Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇

Spring cloud系列教程第十篇- Spring cloud整合Eureka总结篇本文主要内容:1:spring cloud整合Eureka总结本文是由凯哥(凯哥Java:kagejava)发布的《spring cloud系列》教程的总第十篇:本文是几个维度中的第一个维度:注册与发现维度…

html鼠标滚轴后下一页,鼠标滚动有一页ppt不能马上下翻,而是上下移动,移动到一定位置后才翻到下一页,这是怎么回事?怎么解决?...

一般是这张幻灯片里有图片才会出现这种问题,你的图片格式有问题,点击图片,再点击格式,把图片格式换一下就好了同问,但不是下面两个原因,都试过没用1,ppt的比例太大,缩小比例即可。Ct…

resnet keras 结构_Day146:第二讲 ResNet

出处论文:Deep Residual Learning for Image Recognition作者:Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian SunImageNet Top5错误率: 3.57%主要思想主要体现在 Residual(残差),从名字就可以看出,不学绝对值&#x…

html5内容切换特效,html5+jQuery图片和文字内容同时左右切换特效

html5jQuery图片和文字内容同时左右切换特效,点击图片或者点击左右按钮进行切换,图片转动以及文字内容动画效果切换。查看演示下载资源:22次 下载资源下载积分:20积分js代码 (function(){var bannerIndex 0;var $bannerBgs $(.j…

asp向不同的用户发送信息_【asp.net core 系列】 1 带你了解一下asp.net core

0. 前言 这是一个新的系列,名字是《http://ASP.NET Core 入门到实战》。这个系列主讲http://ASP.NET Core MVC,辅助一些前端的基础知识(能用来实现我们需要的即可,并非主讲)。同时这个系列也会在后续介绍http://ASP.NE…

html 怎么使用http请求数据类型,HTTP请求方式中8种请求方法(简单介绍)

HTTP工作原理HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行…

上行30m下行200m是多少宽带_套餐内有多少流量,就加送多少流量!电信流量攻势太凶猛!...

虽然6月6日国内发放了5G商用牌照,5G时代正式开启。但是对于用户来说,要想用上5G服务尚需等待一段时间,因为现在5G手机终端尚未普及、5G资费套餐也未出炉、运营商的5G网络还需要通过建设进一步扩大覆盖范围。在5G真正走近用户的前夕&#xff0…

vue项目html引入css,vue项目引入自定义.css的样式文件

ES6的引入方式:.vue文件中css文件引入import "../assets/common/common.css";//自定义.css的样式路径js文件的引入在main.js中:import API from ./assets/api/api.config.jsVue.prototype.$API API;P.S.:传统上,引入cs…

485通信原理_上位机开发之单片机通信实践

经常会有一些学员会问到上位机与单片机之间通信的问题,而我们经常会讲上位机与PLC之间通信,那么其实对上位机开发来说,不管是和PLC通信,还是和单片机通信,通信原理都是一样的。PLC的本质就是单片机,在单片机…