屏幕适配最全方案

来源:互联网 发布:在js中引入html页面 编辑:程序博客网 时间:2024/06/15 20:24

1. 写在前面

本人项目使用的如下适配方式,已经迭代了几个版本,从开始的各种适配问题,到现在很少有人反馈手机适配问题,自己也在4-5个真机测试没什么问题。这种适配方式的理论支持我最开始是跟着鸿洋大神 一步步操着的,所以对于理论有什么不了解的先看他的文章,我这直接说步骤以及其中的问题。

这种适配方式的优缺点也很明显,优点不用说适配很成功,从开始的大部分手机到现在一步步完善,我几乎没有收到关于适配的反馈了。缺点,就是适配文件太多,会增加apk大小,我现在这些适配xml文件有1.4M,而且万一碰到个奇形怪状的手机(注意不是手机分辨率) 分辨率其实就那么多,但是有些厂家手机上面标着是常见分辨率实际并不是那么样,所以碰到这种手机,不能适配是小事,如果不处理有可能报错闪退,至于处理方式后面说。

2.原理

主要看这里 
Android 屏幕适配方案 
Android屏幕适配全攻略(最权威的官方适配指导)

我的理解,直接举个例子,如图因为我们ui的设计为了方便,Android和iOS用的是6s的分辨率,750*1334.加入ui图上有这样一条线,ui标尺375px,根据设计,所以我选择以750 1334为标准。将屏幕宽分为750份,这样1份刚好是1px,而375px是375份,因为其他分辨率都是以750 1334为基准生成的,所以他们宽也是750份,而这一份代表多少px我们就不用管,反正我们希望不管在哪种分辨率(比如 720 1280 或者 1080 1920)上我们都需要占375份,这样就达到了适配要求。 
这里写图片描述

3.实践

在整个项目的适配实践过程中我可以分为三个阶段, 
第一个阶段:通过他们的文章,最后几乎可以适配85%的手机 
确定我们的设计图分辨率,以它为基准,比如我们的设计图是750 1334 
然后通过工具,然后使用命令生成如图所示的各常见的分辨率xml适配文件 
这里写图片描述 
我将这这套文件命名标准文件,然后应用到项目中,几乎大部分手机可以适配,但是部分手机比如我手上两部华为手机 720 1280 和 1080 1920都不行,虽然他们手机信息上标明着分辨率是这样多,但是华为手机因为导航栏或者虚拟按钮或者其他原因(因为我后面发现貌似不是下方导航栏的原因),适配不成功。这时候到了第二个阶段。

第二个阶段:解决部分如华为手机适配问题 
我开始以为他们是导航栏上的虚拟按键,因为确实我将按键隐藏后可以成功适配,然后我就在网上通过如下代码来获取他们的真实分辨率 
方法来源 
DisplayMetrics metrics = new DisplayMetrics(); 
Display display = getWindowManager().getDefaultDisplay(); 
display.getMetrics(metrics); 
Log.d(TAG, “display is ” + metrics.widthPixels + “*” + metrics.heightPixels);

这里我用了三部华为手机通过上面的方法获取分辨率 
华为荣耀8 1080 1920 得到1080 1812 
华为畅享5 720 1280 得到720 1184 
华为畅玩5x 108 1920 得到 1080 1776

看到没,两个手机上说是这样的分辨率,但是实际不是这么多,更奇葩的两个分辨率一样的手机为什么得到不一样的分辨率 1和3,正如我上面说的不是分辨率的原因导致很多手机难适配,其实是各厂家手机,其实不止华为。但是不管那么多, 我通过提供的工具 额外生成了上面三个分辨率,得到如下适配文件,我命名为额外文件

java -jar autolayout.jar 750 1334 720,1184_1080,1812_1080,1776
  • 1
  • 1

这里写图片描述 
然后替换以前的,测试了下,好像用三个华为手机测试下那个720和一个1080可以适配,还有个1080不能,所以这里我也不知道到底是不是因为下方导航栏的原因导致不能适配,其实这里就发现这三个额外加的文件夹确实可以解决一部分问题,其他手机不能适配的原因主要是适配分辨率文件不全的原因,所以只要找更多的手机然后通过如上的方法得到分辨率,在生成文件夹添加就可以适配更多的手机。 
但是因为公司条件原因,所以我在网上通过腾讯优测 获取了很多手机的分辨率(不止华为,通过如上的方法),得到如下的文件夹,这个是现在比较全的了,当然大部分额外的适配分辨率都来自上面的测试,还有几个是用户反馈得到的。 
这里写图片描述 
到现在为止是第二个阶段,这两个阶段主要是我们开发过程中做的事,还没上线通过一步步测试完善的。但是我图样图森破了。上线后接到部分(很少,但是为了突出写个部分…)用户反馈说app登陆不进去,闪退。这时候就进入第三个阶段。

第三阶段:解决最后的顽石以及处理万一万一万一不适配的手机闪退 
闪退的原因无非我们给的适配率文件不匹配用户手机分辨率,找不到到底选择那个文件夹,所以最好能用个万能的文件夹适配找不到我们提供的适配文件,这里有点绕口。仔细看应该懂意思。这归根到底还是android设备碎片化以及厂家的原因。 
前面我们知道,在屏幕像素密度dpi=160时(dpi != dip(dp)) 1dp =1px。 
同时手机分辨率越大,基本屏幕像素密度越大(不一定,因为dpi不止与分辨率有关还与其他东西有关),但是这些主流的分辨率是这样的。 
比如 
320x480 160 
480x800 240 
720x1280 320 
1080x1920 480 
又因为根据公式

px = dp * (dpi / 160),屏幕密度越大,1dp对应 的像素点越多
  • 1
  • 1

所以如果我们根据ui上面来,多少px然后使用多少dp,不一定准确,有一定的误差,比如130px 我们使用130dp,但是至少保证不会因为找不到分辨率闪退,又因为我们工具生成的文件都是x1~x750的,所以我们给定的默认也要这样,不然怎么使用尺寸。所以我们需要将两个默认的x y文件以同样的形式放到默认的values中,这样就保证了不闪退。 
这里又有个新问题了,到底选择那个比例呢 ,因为上面那个公式我们基本可以知道常见分辨率 dp和px换算比例。

320x480 160 1dp=1px480x800 240 1dp=1.5px720x1280    320 1dp=2px 1080x1920   480 1dp=3px
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

1dp =1px 还是 1dp =1.5px还是其他? 
其实无所谓 当然为了准确选个最平均的1dp=1.75px是最好的,只要是以dp结尾的都可以,但是貌似没得工具提供来修改,一个个修改太累了。我就使用了最简单的修改的1dp =1px,因为我们基准是x1=1px,所以我只要将单位替换下就可以了。如下图 
这里写图片描述 
然后将修改的lay_x 和lay_y放到values下面。

ok整个适配到现在为止已经差不多解决了,已经更新了几个版本没有在听到适配的问题了,所以感觉这种方法还是可以的。 
当然我写这些主要针对分辨率的适配,毕竟真正的适配还包括其他很多东西,比如其他的布局 图片资源的适配 竖直和平板等等。

适配文件

我将三个阶段使用的一些适配文件地址放在github上,注意这个仅供参考,毕竟各个ui设计基准的分辨率不一样。 
地址,觉得不错star支持下

原创粉丝点击