转自 http://blog.csdn.net/fesdgasdgasdg/article/details/52325590
“又是屏幕适配,这类文章网上不是很多了吗?”
我也很遗憾,确实又是老问题。但本文重点对网上的各种方案做一个简短的总结,和具体使用方法。
若想了解具体android设备适配的前世因果,请阅读hongyang文章:http://blog.csdn.net/lmj623565791/article/details/45460089
据我的总结,屏幕适配可以有两种方法适配,dp和px,一一讲解。
一、PX适配。
现在常用的屏幕尺寸为1280x720,一般美工也会根据这个尺寸给图。
图上标注的都是px,而android里面推荐使用的单位为dp。
相同的屏幕尺寸,不同的密度比例,可能会要用到不同的dp值。
这个转换很痛。
那么,省着点吧,对于1280x720的屏幕,我们若给宽度为720px是不是就占满屏幕了呢?对于1920x1080的屏幕,我们宽度给1080是不是就占满了你?
我们以1280x720为基准,把所有的宽度切成720份,高度切成1280份,其他的尺寸基于这个基准等比缩放。。。。。这么闹嗑真费劲,看图
对于1280x720的屏幕,宽度给x720变量的值即占满屏幕。
万一用户的手机屏幕为800x480呢?看下图:
万一是1920x1080呢?看图:
understand?根据不同的屏幕,x720变量会代表对应的px值,其他的变量也一样。dimens_y.xml文件也一样的等分了。
往下看
如上图,根据你的需要,生成需要适配的尺寸的文件,手机会根据屏幕相关参数自动寻找合适的尺寸文件的。需要执行生成适配文件夹时,找到screenMatchPX.bat文件所在的硬盘位置,双击执行该文件即可,即可在项目的res目录下生成对应的values-aaaxbbb文件夹和里面的文件数据。
screenMatchPX.jar里面的源码,文末我会提供的,jar文件的打包也没什么神秘的,去eclipse试试就知道了。
screenMatchPX.bat内容:
[html] view plain copy
java -jar %~dp0\screenMatchPX.jar 720 1280
pause
也可以写成
[html] view plain copy
java -jar 路径\screenMatchPX.jar 720 1280
pause
如果不了解批处理知识的,干脆别折腾了,直接用。但后面跟的参数要注意,看源码:
[html] view plain copy
public static void main(String[] args) {
System.out.println("开始运行...");
//基准宽高
intbaseW = 720;
intbaseH = 1280;
Stringaddition = "";
try {
if (args.length == 1) {
addition = args[0];
} else if (args.length == 2) {
baseW = Integer.parseInt(args[0]);
baseH = Integer.parseInt(args[1]);
} else if (args.length>= 3) {
baseW = Integer.parseInt(args[0]);
baseH = Integer.parseInt(args[1]);
addition = args[2];
} else {
System.out.println("没有发现输入参数...");
}
} catch (NumberFormatException e) {
System.err.println("right input params : java -jar xxx.jar baseW baseH w,h;w,h;...;w,h;");
e.printStackTrace();
System.exit(-1);
}
new GenerateValueFiles(baseW, baseH, addition).generate();
}
默认基准值为,1280x720,
默认适配屏幕为
[html] view plain copy
"320,480;480,800;480,854;540,888;600,1024;720,1184;720,1196;720,1280;768,1024;768,1280;800,1280;1080,1812;1080,1920;1440,2560;";
如果你觉得不合适就在参数行更改。
注意参数格式:
[html] view plain copy
java -jar xxx.jar 基准width 基准height 待适配w,待适配h;待适配w,待适配h;待适配w,待适配h;
或
[html] view plain copy
java -jar xxx.jar 基准width 基准height
或
[html] view plain copy
java -jar xxx.jar 待适配w,待适配h;待适配w,待适配h;待适配w,待适配h;
搞定,会用这个bat批处理,生成对应的尺寸文件,在代码里面设置按钮的宽度为@dimens_x/x720 ,则在任何手机上都会是横向全屏的。
有一点坑,就是你需要获取待适配的手机的像素值,不要看网上的说明参数,需要看程序运行的参数值。
我踩的坑:我的测试机联想A880,查阅屏幕参数为960x540,于是我加进去了。然后在程序中测试发现,失陪效果不好。
经过测试发现,它用的是800x480的尺寸文件。纠结很久发现程序能得到的屏幕尺寸其实为888x540,然后修改后重新生成values文件,才正常。
若你获取到的屏幕像素参数为 1283.45 x 724.89,那就取 1283x724,不要四舍五入了。
总结:
此方法,你需要做的是:
1、把screenMatchPX.bat和screenMatchPX.jar两个文件拷贝到你项目的main目录下;
2、修改screenMatchPX.bat文件中你需要适配的屏幕参数;
3、进到screenMatchPX.bat文件所在的硬盘位置,双击执行。执行是不要在AS里面双击,AS不可执行bat文件。
over
二、DP适配。
dp适配原理和上面px适配一样,只不过是拿dp值来等比缩放的而已。
无论手机屏幕的像素多少,密度比值多少,但80%的手机的dp值(widthPixels / density)都为360dp,所以对于这些手机,我们以360dp为基准,即只要写@dimen/dp_360即可让控件横向沾满屏幕。那万一有些手机的这个值是520dp怎么办呢?加进去生成对应的values即可了。
screenMatchDP.bat里面的代码为:
[html] view plain copy
java -jar %~dp0\screenMatchDP.jar 360 384 400 411 533 640 720 768 820
pause
默认第一个为基准项,360dp。
后面跟的都是你需要适配的dp值,即某款手机的widthPixels / density比值。
如果你不跟参数,程序默认的参数为:
[html] view plain copy
args = new String[]{"360", "384", "400", "411", "533", "640", "720", "768", "820"};
在程序的默认values文件夹中需要一份dimens.xml文件:
[html] view plain copy
16dp
16dp
-60dp
-30dp
-20dp
-10dp
-5dp
0.1dp
0.5dp
1dp
2dp
2.5dp
3dp
...........
370dp
402dp
410dp
422dp
472dp
500dp
600dp
640dp
6sp
7sp
8sp
9sp
10sp
11sp
......
19sp
20sp
21sp
22sp
24sp
28sp
38sp
40sp
41sp
48sp
需要负的dp,就写负数的item。有字体的适配。
程序里面会先读取上面的这个默认dimens.xml文件,然后根据需要适配的dp值生成对应的dimens.xml文件。
万一哪天你发现没有你想要的item,比喻888dp。那你就在默认的values中的dimens.xml中添加888dp,然后重新执行bat文件生成新的数据即可。
美工给图的时候最好是1280x720的图,这样的话,拿到宽度的值直接除以2,代码里面写成@dimen/dp_360即可。方便计算。
总结:
此方法,你需要做的是:
1、默认的values文件夹中需要一份特定的dimens.xml文件。文末提供下载
2、把screenMatchDP.bat和screenMatchDP.jar两个文件拷贝到你项目的main目录下;
3、修改screenMatchDP.bat文件中你需要适配的屏幕dp参数;
4、进到screenMatchDP.bat文件所在的硬盘位置,双击执行。执行是不要在AS里面双击,AS不可执行bat文件。
OVER
源码图:
dp目录是dp方式适配的源代码。
px目录是hongyang提供的px适配源代码。
MainActivity类中有获取屏幕参数和dp参数的代码。
根据你的需要,自己修改和定制程序吧。
阿杜提供,放心盗版。
以上两种方法大概原理和使用方法都介绍完了,你可以实验。dp的方法我们已经应用到项目中了,没问题。px的方式只是测试过,没有应用。
dp方法的缺点:如果没有默认的dimens.xml,那就黄昏依斜阳了,还好有提供。优点是,没有枚举全部的item,可以省一些apk空间;有字体sp的适配。
px方法的缺点:屏幕px的种类远多于dp的种类,文件数量多;程序for循环枚举item项,有部分用不上的px项;width和height都适配了,给控件写width尺寸时要用dimens_x.xml里面的变量值,写height尺寸时需要用dimens_y.xml里面的变量值。
GitHub上提供更新jar和源码
GitHub源码地址:https://github.com/mengzhinan/PhoneScreenMatch
CSDN下载地址:http://download.csdn.net/detail/fesdgasdgasdg/9613054
详细使用说明文档地址:http://download.csdn.net/detail/fesdgasdgasdg/9913744