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

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的问题和测试结果:我们可以有以下三个结论。

因为使用精确的dp时不能解决在同一分辨率,不同尺寸上的显示问题。谷歌就没有使用dpi的精确值,而是使用的一个区间值去兼容这个问题(因为在测试配图(同一分辨流率,不同尺寸)中显示没有问题)。

因为dpi没有使用精确的值,所以使用dpi,是不能达到各种尺寸,分辨率手机上完美的等比例缩放的。

但是使用dp做单位的时候,在一些屏幕分辩率比(宽:高.例如:480x800)不为9:16的手机上显示出来的差异性较大。 例如:主流分辨类中的320x480,480x800,480x854等。

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

1.分辨率高的屏幕显示图片有些图片失真,有些图片显示较大出现拉伸现象。

2.屏幕不规则的手机的显示和标准机型的显示差异较大。

3.开发人员的一些不规则的代码写法导致不同界面显示的效果差异性较大。

4.UI设计人员和开发人员在效果图的标注问题。

三,适配方案和原理

3.1 适配方案的整体思路

3.1.1适配方案实现步骤五步

合理写作布局代码(使用wrap_content,weight属性等)。

不用dp直接指定外层布局的宽高。

需要指定布局的宽高时,动态设置(其实就是使用百分比的形式)或者用自定义布局的形式。

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 适配方案的测试结果说明

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

android 适配最佳方案,android适配方案相关推荐

  1. android屏幕适配的目的,Android 不同分辨率下屏幕适配的实战方案与经验总结

    Android 开发中,屏幕适配是一大考点,几乎每一场面试,都不会落下这个问题,这个问题说简单也简单,说难也难,当然对于有过真实的适配经验的人来说,这个根本不算什么问题,从坑里爬过的人,自然知道这其中 ...

  2. 今日头条Android适配方案,android 今日头条的屏幕适配理解

    前一段时间无意中看到今日头条的适配方案,使用到项目中,感觉真的是无比丝滑.所以特意写一篇文章分享给小伙伴们! 本文知识点: 为什么要做屏幕适配 今日头条的适配方案(划重点) 今日头条的适配方案的一些问 ...

  3. android新版本适配-android13最全适配方案

    前言: 适配Android13事不容缓 2022年9月14-2022年9月15日,Google中国开发者大会在上海举办,大会上,演讲嘉宾大约抽出了半个小时时间讲解android13的新特性.这也意味着 ...

  4. android 最新头条适配,今日头条屏幕适配方案终极版正式发布!

    以下是 骚年你的屏幕适配方式该升级了! 系列文章,欢迎转发以及分享: 前言 我在前面两篇文章中详细介绍了 今日头条适配方案 和 SmallestWidth 限定符适配方案 的原理,并验证了它们的可行性 ...

  5. android多分辨率多密度,android多分辨率多密度下界面适配方案

    前言 Android设计之初就考虑到了UI在多平台的适配,它本身提供了一套完善的适配机制,随着版本的发展适配也越来越精确,UI适配主要受平台两个因素的影响:屏幕尺寸(屏幕的像素宽度及像素高度)和屏幕密 ...

  6. Android8.1 ifw方案,Android 8.1适配规范及常见问题处理方式

    对于这个最新的系统,谷歌强调,Android Oreo 拥有更好的安全性,同时8.1系统中还新增画中画.桌面角标.通知分组等功能.另外,Android 8.1续航还进行了特别的优化,谷歌加入了后台程序 ...

  7. android smallestWidth 限定符屏幕适配方案dimens.xml

    简介 smallestWidth 限定符适配方案 这个方案的的使用方式和我们平时在布局中引用 dimens 无异,核心点在于生成 dimens.xml 文件,但是已经有大神帮我们做了这 一步 ├── ...

  8. Android 8刘海屏特性,Android 8.0刘海屏适配方案 小米和华为根据官方api即可获取隐藏显示转态,oppo和Vivo没有公开API...

    /** * @return 判断Android O的刘海屏 */ private boolean hasNotchInScreen() { boolean ret_all = false; ret_h ...

  9. Android app启动白屏适配方案

    至于app启动时候为什么会白屏,咱们不多赘述,相关的文章以及启动时间优化文章多了去了.咱们这里主要讲述优化完成后如何解决白屏问题. app启动时候黑屏或者白屏是还没加载到布局文件,就已经显示了wind ...

  10. 【原】android【手机】屏幕适配解决方案,完美适配适配hdpi,xhdpi,xxhdpi的做法。...

    1.先说要怎么做,后面在慢慢讲解: 2.现在来讲解为什么要放这三套: 这三套其实按内容来说就两种,为什么这两种可以适配hdpi,xhdpi,xxhdpi呢? 那么两种类型的dimens就可以了,为什么 ...

最新文章

  1. 测试开发人员与开发人员_如何升级为开发人员
  2. 年度盛宴——2012年最精彩的15个 CSS3 教程
  3. 逆袭!? 期待下一个“BCH”出现
  4. sql 判断分钟是偶数数据_使用SQL交换座位(奇偶数的用法)
  5. python教程:将一个列表切分成多个小列表
  6. python学习(十八) 程序打包
  7. 【Kick Algorithm】十大排序算法及其Python实现
  8. 北京沙龙报名 | 关于Dubbo开源的那些事儿
  9. 在Tomcat上跑东西时遇到的对我这样新手来说很难找到的问题
  10. 基于插件架构的简单的Winform框架(下)
  11. 正则表达式 (入门)
  12. 无人机倾斜摄影测量土方计算
  13. Android shape属性大全
  14. google scholar 使用不了的问题——已解决
  15. tex的bib引用时出现 empty ’thebibliography' environment
  16. android中如何让动画停止,让Android AnimatorSet停止制作动画
  17. 安全牛联合世平信息共同发布《数据防泄密 (DLP) 业务应用指南》
  18. ofo“卖身”滴滴?共享单车开始进入下半场
  19. Java中HashMap常见问题 -- 扩容、树化、死链问题
  20. 用C语言实现简单的猜数字小游戏

热门文章

  1. 【小技巧】提取PDF中某一页或多页并保存为新pdf
  2. 计算机科学加急审稿300元,计算机四区sci期刊加急发表sci正刊审稿20天录用
  3. 黑苹果 台式机 Z390-p i7 9700 uhd630
  4. 已经在此计算机安装版本的,电脑安装iTunes时提示这台电脑已安装了更高版本怎么解决...
  5. 历代魅族旗舰手机主要参数对比,更新于2021年5月
  6. 【转】Java面试资源----百度Java面试题前200页大汇总
  7. 外贸新人,如何寻找和触达潜在客户?
  8. Latex上下标及相对位置
  9. OpenSSL密码库算法笔记——第1.2.2章 comba乘法
  10. Java八大基本数据类型(至臻详解)