因为Android开源,屏幕碎片化最严重的,所以app就避免不了进行各种机型适配的。screenmatch插件提供了一套解决方案。
打开Android studio Setting/plugin,选择marketplace 在搜索框中输入screenmatch,在搜素结果中直接单击安装,等待成功即可(我是安装了几次才成功,要是有梯子打开它试试)。
右击项目找到screenmatch,如下图:
单击之后,会有选择项目的界面,选择你想在哪个项目中使用screenmatch。
会生成两个文件:screenMatch.properties,screenMatch_example_dimens.xml和很多values-××××文件。
这时会在res文件夹下看到很多values:
这是点完screenmatch之后生成的文件
上面生成了screenMatch.properties和screenMatch_example_dimens.xml与res下面的values之间的关系呢。让我们看看具体的配置文件。
在这个文件中你需要关注就两个参数
base_dp和match_dp
插件的作者建议base_dp不要修改,个人感觉修改时你需要考虑如下问题:
1.若base_dp=360这种机型在你项目中就不可能有,你完全可以根据你项目中的基础机型来配置这个基础base_dp。假如你项目最差也是640,为啥你还要在项目中生成360的呢。
2.match_dp 若是不配置,插件会默认的给你设置一些默认的值,若是你不需要那么多,你可以把刚才生成的删掉,重新配置match_dp,重新生成values。
#System default values is 系统默认的值
384,392,400,410,411,480,533,592,600,640,662,720,768,800,811,820,960,961,1024,1280,1365
其实很多项目组,用不到这么多的值,只需要把你需要值配置进去即可。这样做的目的是为了减少apk的体积。即使以后想扩展的话,只需要在match_dp参数添加对应的值,并重新点一次screenmatch按钮就可完整配置。
横屏:1280640
竖屏:6401280
什么意思呢?同一个设备,分辨率为1280*640,横屏下高度为640,竖屏则是1280,这是你match_dp就是两个完全不同的值。加入density为2,match_dp 分辨为320和640。
这个文件相当重要,也不重要,为啥呢?
先了解一下,screenmatch适配的原理,它将所有可能宽度都生成好,我只需要使用这些已经生成好的数值就行了,在不同的机型下,自动适配到不同的宽度。这就是涉及到要把所有要设配的机型的对应的值都要计算一遍。
screenmatch会根据res/values/dimens.xml文件中基础数值去计算并生成match_dp配置的所有宽度的dimens.xml。
而这个文件的意义,就在于你可以直接把他拷贝到res/values/dimens.xml中,并以此来计算出其他宽度dimens.xml。假如match_dp=384,400,411,533,640,720,768,820,会生成如下图dimens.xml:
注: 这里面还有优化空间,就是你需要多少像素值,就在里面写多少,不然可能有很多像素用不到,增加包的体积。比如说,1-10像素根本用不到,你可以它去掉,你感觉这个10个数字没啥,要是你适配20款不同高度时,就相当于有10*20个记录是用不到的。
到目前为止screenmatch环境算是配置好了,但是如何使用呢?
直接在xml文件中使用 @dimen/dp_15
screenmatch是采用宽度进行适配以及针对手机的,这也我在适配工作所遇到问题的来源。我的工作场景就是pad。在实际的工作中,UI出图的话一般是px为单位,这是需要进行装换,但是现在很多出图工具可以直接给你转好,这个转换过程省略了,但是将UI图转成screenmatch所需要尺寸需要我们自己来计算。
我用的是蓝湖,有兴趣的可以自己了解一下,他可以自己选择对应的宽度,自由度算是很高。
我说的这个问题是针对pad。screenmatch中base_dp是根据手机来的,我刚才也说了,pad和手机的宽度是颠倒的,所以在适配的时候需要进行一次转换。
转换如下:
竖屏下width/base_dp*竖屏下height
不知道你是否理解这个算法,其实竖屏下的高度就是横屏下的宽度,换成下面算法:
竖屏下width/base_dp*横屏width
计算的结果,就是UI出图的需要考虑width。
若是表达有误地方,欢迎指教和交流。
官方文档