先说下文章目录吧:
1、适配相关概念
2、相关重要公式
3、适配方案一的介绍
4、适配方案二的介绍
5、适配方案二的采用与修改
下面开始进入正文:
一、首先说下适配相关的概念吧
① dip(dp):Density independent pixels,设备无关像素。是用来做适配的。能够让同一数值在不同的分辨率展示出大致相同的尺寸大小。但当设备的物理尺寸存在差异较大的时候,dp就显得无能为力了。例如 为4.3寸屏幕准备的UI,运行在5.0寸的屏幕上,很可能在右侧和下侧存在大量的空白。而5.0寸的UI运行到4.3寸的设备上,很可能显示不下。
②px:像素,没啥好说的
③dpi:dots per inch,直接来说就是一英寸多少个像素点。
④density: 直接翻译的话貌似叫 密度。常见取值1.5,1.0。
⑤分辨率 : 横纵2个方向的像素点的数量,常见取值480X800,320X480
⑥屏幕尺寸: 屏幕对角线的长度。电脑电视同理。
⑦屏幕比例的问题。因为只确定了对角线长,2边长度还不一定。所以有了4:3、16:9这种,这样就可以算出屏幕边长了。
二、相关公式:
①重要的有:dp与px转化 :PX = density * DP
②不重要的有Dpi计算:
三、适配方案一的介绍
鸿洋大神曾经出过几套适配的方案,这一种是让你的Activity去继承AutoLayoutActivity,然后正常去写px就行了。给大家个地址:http://blog.csdn.net/lmj623565791/article/details/49990941
给大家一张实际图:
这个乍一看非常简单,但实际没那么容易,只有直接继承Activity的改成继承AutoLayoutActivity才可以,那Fragment怎么办?listview的item怎么办,自己的自定义view怎么办?(貌似有解决的方案,不过就麻烦很多了)所以这个方案还需要继续改善。下面主要介绍第二套方案
四、适配方案二的介绍
照例先给大家上链接: http://blog.csdn.net/lmj623565791/article/details/45460089
大家都知道,美工给我们图的时候都会说这是什么分辨率的,然后每一个尺寸都是以px为单位的。
这第二种方法就是利用系统根据手机分辨率去自动选择对应的values目录,选择相应百分比的px尺寸实现的。
举个例子:
如果美工给我们的图是720 * 1280的(下面将美工给的分辨率命名为标准分辨率),那么,我们就将所有需要适配的尺寸的机型width分成720份,height分成1280份,例如另一个1080*1776的屏幕,width每一份是(1080/720)px, height每一份是(1776/1280)px
这样,我们布局的时候不用再麻烦的去算dp了,只是需要将美工的横向60px写成“@dimen/x60 “竖向60px写成“@dimen/y60” (意思是width的720份中取60份的长,height的720份去60份)
然后看结果,(自己测试结果的时候,如果你的是真机,那请忽略,如果你用的是Google的虚拟机,那么请注意,你选择的分辨率不一定是真的分辨率,给大家一个函数,大家打印一下真实的分辨率然后再对应测试)
在标准分辨率720*1280的values-1280*720中,每一份是1px,所以width为60px,height也是60px,符合
在1080*1776的values-1776*1080中,width是(1080/720 *60)=90px,height是(1776/1280*60)=83.25px
这样就会自动对应到相应的百分比尺寸
方案也提供了对应的jar包,使用方法很简单:
jar后面的分别是标准分辨率width,标准分辨率height,和去除默认生成的常见机型分辨率(320*480; 480*800; 480*854;540*960; 600*1024; 720*1184; 720*1196; 720*1280; 768*1024; 800*1280; 1080*1812;1080*1920; 1440*2560)需要额外支持的机型分辨率。
java -jar xx.jar width height width,height_width,height
java -jar /Users/yujie/Desktop/autolayout.jar 720 1280 1080,1776
(注意,输入的时候width在前,height在后;生成的文件夹命名是height在前,width在后)
五、适配方案二的采用与修改
原版和改进版的jar包都已上传至GitHub:
https://github.com/yujiesuperman/autolayoutplus
下面说下修改的地方:
首先这样一大堆values是不是都是需要的?比如1080*1812等,不需要这么多的话可以更改源码中的默认机型,只选择需要的几款,或者生成后只拷贝需要的几个values文件夹。
但这样又有一个缺点,万一如果用户使用了我们没有生成对应values的尺寸,系统找不到,跑到了默认的values文件夹里,那里面的dimens里可没有x60,这样尺寸就找不到长宽都成了0px了,那界面就乱套了,所以,需要配合在默认的values的dimens里添加对应的:
即在生成原来那些文件的同时,又生成了一个lay_default.xml文件,这个文件生成的原理是根据UI提供的标准尺寸的density,和标准尺寸下的px,通过重要公式算出每个x和y对应的dp,格式如上图。再直接把文件的内容粘贴到默认values的dimens里,就可以重新按dp进行适配了~
目前只判断了这五种标准尺寸,一般UI就给这几种图吧,
jar源码也在git上给出,想了解的同学可以去下载查看。
这样,适配方案就形成了,使用autolayoutplus生成各种文件,拷贝lay_default内容,然后产品pm让你适配哪一种机型,你就把哪一种尺寸拷贝进项目,多一种就再多生成一个values!
新的项目准备使用这种方式进行机型适配,就目前的原理分析和测试来看,还没发现任何问题,如果有哪位大神发现有疏漏请留言指出,当然,能给出解决办法最好~