最新最全文章(2018-08-25):https://blog.csdn.net/fesdgasdgasdg/article/details/82054971
之前写过一篇文章《Android屏幕适配dp、px两套解决办法》介绍两种方式做屏幕UI适配,主要讲的是dp方式。
还有一篇更详细的ppt文档解析dp方式适配的原理(csdn下载需要积分,系统搞的鬼,没积分去下载就直接Q我吧)。
不用怀疑dp方式的可行性,我做过实验,并且在我带过的两家大公司实践过,得到了认可。
dp方式适配的java源码地址:https://github.com/mengzhinan/PhoneScreenMatch 自己去研究吧,很简单。
复述原理:
如果你发现你手机的widthDP值(widthPixels / density)是411.948dp,怎么办?那就取整411,千万别取412。因为系统是往下寻找对应的值(如果你写成values-w412dp,则与values-w411.948dp不匹配,系统会寻找小点的,比喻找到了比下一个values-w392dp的dimens.xml文件,那就差很远了)。
此时,如果你写个按钮,layout_width="411dp",就几乎宽度沾满屏幕了,但是还有一点点边线,那点边线的宽度是0.948dp,可以忽略。
也就是你把按钮的layout_width值给@dimen/dp_360,系统会去寻找res/values-w411dp/dimens.xml文件的dp_360变量的值,其实这个值就是411dp。
故,你只要认为任何手机的宽度都是dp_360这个变量,即可。要适配什么widthDP的手机,只需要在生成对应的dimens文件,res/values-wXXXXdp/dimens.xml。即可完成不同尺寸的手机上app的UI不变形,等比缩放的效果。
建议美工给1080x720的图,因为720/2即360,比喻,给了一个按钮width是90px,那么就给@dimen/dp_45的值,方便计算。
如果美工给的是1920x1080的图呢?1080/3=360。
那么怎么使用呢,往下看:
1、需要的文件。
需要在项目对应module下存在一个dimens.xml、screenMatchDP.jar和screenMatchDP.bat三个文件,dimens.xml文件不要更名,否则找不到。
后面的jar文件也不要更名,如果真要改,记得把bat文件中对应的内容也修改。bat文件就是一个windows的批处理文件,调用java -jar命令。
这些文件随便你放在哪个module下,但是相对的路径别错了,
dimens.xml路径: ..../res/values/dimens.xml
screenMatchDP.jar:这个文件与res目录同层级
screenMatchDP.bat:这个文件与res目录也同层级
好了,废话这么多,就是怕你不会用。
最新的bat jar 和xml文件去github下载吧:https://github.com/mengzhinan/PhoneScreenMatch
2、dimens.xml文件内容格式。
建议dimens.xml文件中如屑定义dimen值:
-10dp
-8dp
-1dp
0dp
0.1dp
0.5dp
1dp
2.5dp
3dp
4.5dp
负值变量名:dp_m_xxx
带小数的变量名:dp_xxx_xxx。如果写成dp_xxx.xxx时,在java类中引用会报错的。
如果是0.1的变量名:dp_0_1
总之,建议dp变量名定义为 dp_xxx,sp的定义为 sp_xxx。简单明了。如果你非要别样定义也随便,如果出问题了自己去修改源码,自己去用Eclipse打包jar包即可。
你可以去我的博客或者源码中copy我默认提供的一套dimens值,免得你自己一个一个写。
3、解析bat文件内容和设置。
@echo off
:: Call java jar file to make dimens.xml files.
:: After screenMatchDP.jar,the first param is base dp.
:: And stitching the parameters that you need to fit later.
:: For example:java -jar screenMatchDP.jar 360 411 480
:: Default dps is 384 392 400 410 411 480 533 592 600 640 662 720 768 800 811 820 960 961 1024 1280 1365
@java -jar %~dp0\screenMatchDP.jar 360
@rem "If you are not want to make some dimens.xml files below: "
@echo Be deleting files of 1365dp ...
@rmdir /q /s .\res\values-w1365dp
@echo Delete complete!
pause
核心代码就两行:
java -jar %`dp0\screenMatchDP.jar 360
后面的360位基准dp值,也可以不写
写法1:
java -jar %`dp0\screenMatchDP.jar 默认以手机width 为360dp基准,
默认适配384 392 400 410 411 480 533 592 600 640 662 720 768 800 811 820 960 961 1024 1280 1365 等手机width的dp值。
写法2:
如果你想适配653dp和668dp宽度的手机,请写成:java -jar %`dp0\screenMatchDP.jar 360 653 668
第一个值为基准值,后面的为待适配的值。其实这么调用jar文件,是调用main函数,String[] args参数接收值,理解吗?看我的源码这么处理这个数组的吧。
补充:
因为我默认适配了一堆的值,都是个人经验的积累。如果你觉得不需要,则可删除,比喻你想删除1365 1280两个的dimens.xml适配文件:
@rmdir /q /s .\res\values-w1280dp
@rmdir /q /s .\res\values-w1365dp
完事,强制删除目录的代码。免得你每次手动删除,还骂我。
4、运行。
在硬盘上找到这个bat文件(不要在AS中双击打开,那只是查看文件内容,编辑)。双击执行即可,显示内容如下:
再去看看你的res目录下面结果:
生成了,这不是你想要的吗?! 很简单。