android适配方案

一, 关于适配的一些概念性的知识

1.1. 重要的概念解释

1.1.1. 屏幕尺寸:

屏幕尺寸指屏幕的对角线的长度,单位是英寸,1英寸=2.54厘米
比如常见的屏幕尺寸有2.4、2.8、3.5、3.7、4.2、5.0、5.5、6.0等

图片1.png

1.1.2.屏幕分辨率(px)

屏幕分辨率是指在横纵向上的像素点数,单位是px,1px=1个像素点。一般以纵向像素横向像素,如19601080。

图片2.png

1.1.3.屏幕像素密度(dpi)

屏幕像素密度是指每英寸上的像素点数,单位是dpi,即“dot per inch”的缩写。屏幕像素密度与屏幕尺寸和屏幕分辨率有关,在单一变化条件下,屏幕尺寸越小、分辨率越高,像素密度越大,反之越小。

图片5.png

1.2. 几个重要单位的计算和解释

2.1 px

我们应该是比较熟悉的,前面的分辨率就是用的像素为单位,大多数情况下,比如UI设计、Android原生API都会以px作为统一的计量单位,像是获取屏幕宽高等。

2.2 sp,

即scale-independent pixels,与dp类似,但是可以根据文字大小首选项进行放缩,是设置字体大小的御用单位。

2.3 dpi的计算:

首先,要明白dpi的含义。dpi 指的就是 一英寸屏幕上 到底有多少个像素点。
所以公式为: dpi = 屏幕总px / 屏幕大小。

图片6.png

4.0是屏幕的大小,980是斜线的像素总数,所以我的手机dpi就为240.

1.3 dp及dip的概念:

首先dp和dip是一个意思,也叫密度无关像素,是android用于衡量密度独有的一个计量单位。
dp的单位公式是: dp = ( dpi / 160 ) px
dp是什么东西? 为了解释这个问题,我画了几张图。
首先,android屏幕不同,最根本是两个变量,不同分辨率,不同尺寸。
那我们把条件恒定:
那就有三种情况,
条件一:同一分辨率,不同尺寸

图片7.png

图一说明:
如果两个屏幕同一分辨率,不同尺寸。 那它是可以设置像素单位为px的。 如上图所示: 同一设置为4px, 5寸的手机上显示的物理距离就要比4寸的手机上显示的大。

条件二: 同一尺寸,不同分辨率

图片8.png

图二说明:
如果两款手机尺寸相同,不同的分辨率上。设置单位时,如果要两张图显示的物理距离相同。 那么他应该设置的不同的px值,设置的比例是 6/4 = 480/320=1.5.
如果使用像素作为单位的话,那同一设置为4px, 在320x480寸的手机上显示2mm,在480x800的手机上显示就是1mm(只是个估值)!
所以,使用px值在同一尺寸,不同分辨率上显示有较大的误差。

条件三: 不同分辨率,不同尺寸

图片9.png

从图二中我们知道,我们可以用屏幕的像素比例来算两个不同屏幕的显示的px值。 但是如果是图三这种情况的话怎么办呢。有两个变量,1,屏幕的物理宽度、2,屏幕的像素宽度。
所以我们不能只用屏幕的像素宽度去计算它在不同屏幕中显示的px的比例值。 所以,google引入了dpi也就是屏幕的密度去计算。
我们设屏幕A密度为At,屏幕B,为Bt. 设?为x.
就有公式: 4px / At= x / Bt , 换算可得: x=4px *(Bt / At)
google规定:屏幕A为标准屏幕,参数为160dp . 1dp=1px. 所以公式也就是 dp=(Dpi(其他屏幕密度) / 160) px =density px
所以 屏幕A: 160dpi 也就是 1dp =1px. 屏幕B:320dpi 也就是 1dp=2px.
这个也是谷歌使用dp做为android的单位的原因,它是使用实现的就是不同分辨率,不同尺寸时候自动缩放布局的效果。
但是实际发现使用dp的两个问题:
1, dpi不是物理意思上的精确值,只是谷歌取得一个区间值。
2, 使用dp在同一分辨率,不同尺寸的手机上显示有问题。

dpi的计算公式:在单一变化条件下,屏幕尺寸越小、分辨率越高,像素密度越大。
也就是说,在同一分辨率下,尺寸越大。dpi 值就越小,density值越小。
比如:条件一,本来屏幕A, 1dp等于2mm. 在屏幕B 上也应该就是3mm. 对吧? 也就是说,density值应该相同。 也就是dp到px的转换要相同。 但是现在,5寸的手机的dpi值小,density值小。
也就是说本来都是1dp=2px的, 但是现在4寸的手机4dp=8px. 但5寸的是,4dp=2px. . 这个也就是问题出现的原因。
坦白了说,如果两种屏幕分辨率相同,尺寸大小不同。 用dp做单位,同样设置4dp. 4寸的手机显示2mm.,5寸的手机1mm (只是个估值)!
1,为什么不之前直接使用px做单位呢?
想象一下,如果屏幕尺寸相同,但是屏幕分辨率不同,设置距离单位为4px, 显示差值太大。
2,为什么谷歌取了一个区间值,做为dpi的值呢?
测试:
机型一:2.3的htc 240.0dpi, density=1.5dp.
机型二:nubiya屏幕分辩率:1280x720, 屏幕密度=320,dp和px的转换: 1dp=2.0px
机型三:5.0.1 小米: 屏幕分辩率:1280x720, 屏幕密度=320,dp和px的转换: 1dp=2.0px宽高比 9:16
机型四:4.2.2 oppo手机: 屏幕分辩率:1920x1080, 屏幕密度:480, dp和px的转换: 1dp=3px,宽高比 9:16
机型五:4.2.2 oppo手机,480.0dp, density=3.0
机型六:魅族 屏幕分辩率:1800x1080, 屏幕密度=400, density=2.5
机型七:coolpad 5879 屏幕分辩率:854x480, 屏幕密度=213, density=1.33125
机型八:Moto G(2代) 4G LTE, 屏幕分辩率:1184x720, 屏幕密度=320, density=2.0
机型九,vivo Xplay3S, 屏幕分辩率:2560x1440, 屏幕密度=640.0, density=4.0
机型十:夏新手机 N821----- 4.5,屏幕分辩率:960x540, 屏幕密度=240.0, density=1.5

api:注释:

图片10.png
图片11.png

测试结论:dpi,只是一个相对区间的取值,取值的原理之前说明。
对应的取值区间:

图片12.png

对应的一些值:

图片13.png

结论:dpi值只是一个相对的估值,那么不符合规格的屏幕中,那dp值其实就失去了他本来的概念(无关屏幕像素)。 适配只是做到相对差异较小而已.

二,当前适配方案的一些问题

2.1 适配之前的测试配图

同一尺寸,不同的分辨率(相对较少)。


微信截图_20170612150647.png

同一分辨率,不同尺寸(相对较多)


微信截图_20170612150727.png

同一分辨率,同一机型(排除机型的问题)


微信截图_20170612150806.png

不同的主流分辨率下的显示情况:


微信截图_20170612150838.png

2.2 测试结果说明

在适配方案的概念知识中我们知道。使用dp有两个问题:
1.使用dp时,在同一分辨率,不同尺寸的手机显示效果刚好相反
2.我们用dp和px进行转换的dpi,只是使用根据dpi区间获取到的值。例如:我的手机dpi为341,在dpi区间320-480之间。谷歌使用了320dp. 没有使用我们物理上真正意思的dpi.
结合dp的问题和测试结果:我们可以有以下三个结论。

  1. 因为使用精确的dp时不能解决在同一分辨率,不同尺寸上的显示问题。谷歌就没有使用dpi的精确值,而是使用的一个区间值去兼容这个问题(因为在测试配图(同一分辨流率,不同尺寸)中显示没有问题)。
  2. 因为dpi没有使用精确的值,所以使用dpi,是不能达到各种尺寸,分辨率手机上完美的等比例缩放的。
  3. 但是使用dp做单位的时候,在一些屏幕分辩率比(宽:高.例如:480x800)不为9:16的手机上显示出来的差异性较大。 例如:主流分辨类中的320x480,480x800,480x854等。

2.3 结合测试结果和调研整理当前适配的问题。

1.分辨率高的屏幕显示图片有些图片失真,有些图片显示较大出现拉伸现象。
2.屏幕不规则的手机的显示和标准机型的显示差异较大。
3.开发人员的一些不规则的代码写法导致不同界面显示的效果差异性较大。
4.UI设计人员和开发人员在效果图的标注问题。

三,适配方案和原理

3.1 适配方案的整体思路

3.1.1适配方案实现步骤五步

  1. 合理写作布局代码(使用wrap_content,weight属性等)。
  2. 不用dp直接指定外层布局的宽高。
  3. 需要指定布局的宽高时,动态设置(其实就是使用百分比的形式)或者用自定义布局的形式。
    4: 使用相对分辨率较高的图片,使用.9图用于防止拉伸变形。
    5:维护三套不同value的文件夹,960x540,480x800,480x320 分辨率的,在该密度下统一调整下

3.1.2 适配方案实现的核心思路

沿用dp值为距离单位,维护不同的value值文件夹以适配显示差异较大的屏幕等。
该适配方案是基于之前的适配方案,并对其适配时出现的问题进行解决之后,综合整理出来的一套方案。所以这套适配方案的核心就是整理当前适配方案的优点,进行整理归纳,以供开发人员进行对照。对于当前适配中出现的问题进行整对性的解决

3.2 适配方案的原理说明

3.2.1 使用较高分辨率图片的原理

资源匹配的规则(把drawbale资源称为deafult资源):。
1,如果存在唯一资源,以唯一资源作 为最佳资源,匹配结束。
2,如果当前dpi资源不存在,而高dpi资源大于1个时,选择更接近设备的的资源(即较低dpi的资源),并根据缩放比缩小合适的比例使用。
3,当最佳dpi资源或高dpi资源都不存在,而且dpi的资源大于1个时,选择更接近设备的低dpi资源,并根据缩放比放大合适的比例后使用。
4,对于高于hdpi的资源来说,default资源的优先级高于ldpi 但是低于mdpi, 并且缩放比等于mdpi(anroid是以mdpi做基准的)
5,如果所有的资源下找不到,就会找nodpi资源下的。
结论:设备优先使用符合设备的dpi的资源,其次使用的是dpi较低的高dpi的资源,再次使用的是dpi较高的高dpi资源。最后采用nodpi资源

3.2.2 使用.9图片防止拉伸

我们都知道.9图有两个作用,1.控制图片的拉伸区域。2.控制内容在图片中的显示区域。也就是说如果图片的显示范围如果可能超过图片的本身的大小,就要使用.9图片进行适配。

3.2.3 values文件夹的加载规则

测试记录:
1, 只有默认(deaflut)文件夹,就使用默认(deaflut)文件夹中的。
2, 如果有1280x720,480x800,和默认的,那么分辨率480x800的手机使用480x800的。(如果分辨率有刚好匹配的,就使用刚好匹配的)
3, 如果当前有480x800的文件夹和默认的文件夹, 1800x1080及1280x720的手机会使用480x800文件夹的的 (默认的优先级最低)
4, 如果有1280x720,480x800,和默认的,分辨率1800x1080的手机会使用1280x720文件夹下的。
5,如果有1280x720,1800x1080,480x320,默认,480x800的手机使用的是默认。(deafult>480x320)
6 , 如果有1920x1200,1920x1080,480x320, 默认,1800x1080和1280x720的手机匹配的是480x320的。
结论:资源匹配是向下的,如果没有会向下查找和自己分辨率最相近的, 找到则匹配。
注意:deafult文件夹的优先级最低,也就是说如果配置的values文件夹,只有在完全匹配不上的时候,才会使用默认的。 在480x800分辨率的手机上,deafult的优先级>480x320的。

3.2.4 效果图标注的问题的补充

1,美工以1280x720或者1920x1080进行出图(去掉状态栏),在效果图中标注px。开发人员根据不同的1dp=2px或者1dp=3px进行转换(也可相对调整一下,比如25px, 也可以写13dp或者12dp)。
2,图片在效果图中切出来以后,根据px和dp的转换,在项目中设置为定值。

3.3 适配方案的测试结果说明及配图

3.3.1 适配方案的测试结果配图

适配方案在(六款)主流分辨率中的测试结果:

微信截图_20170612151255.png

适配方案在(五款)非主流分辨率中的测试结果:

微信截图_20170612151339.png

3.3.2 适配方案的测试结果说明

从测试结果来看,在主流的几款分辨率中显示的效果相对差异性较小,但是非主流的分辨率上的不规则的屏幕分辨率上显示也没有较大的差别。只要不是平板,整体的样式就不会有较大的转变。

推荐阅读更多精彩内容