Android屏幕适配dp、px两套解决办法
“又是屏幕适配,这类文章网上不是很多了吗?”
我也很遗憾,确实又是老问题。但本文重点对网上的各种方案做一个简短的总结,和具体使用方法。
若想了解具体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内容:
- java -jar %~dp0\screenMatchPX.jar 720 1280
- pause
也可以写成
- java -jar 路径\screenMatchPX.jar 720 1280
- pause
如果不了解批处理知识的,干脆别折腾了,直接用。但后面跟的参数要注意,看源码:
- public static void main(String[] args) {
- System.out.println("开始运行...");
- //基准宽高
- int baseW = 720;
- int baseH = 1280;
- String addition = "";
- 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,
默认适配屏幕为
- "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;";
如果你觉得不合适就在参数行更改。
注意参数格式:
- java -jar xxx.jar 基准width 基准height 待适配w,待适配h;待适配w,待适配h;待适配w,待适配h;
或
- java -jar xxx.jar 基准width 基准height
或
- 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里面的代码为:
- java -jar %~dp0\screenMatchDP.jar 360 384 400 411 533 640 720 768 820
- pause
默认第一个为基准项,360dp。
后面跟的都是你需要适配的dp值,即某款手机的widthPixels / density比值。
如果你不跟参数,程序默认的参数为:
- args = new String[]{"360", "384", "400", "411", "533", "640", "720", "768", "820"};
在程序的默认values文件夹中需要一份dimens.xml文件:
- <resources>
- <!-- Default screen margins, per the Android Design guidelines. -->
- <dimen name="activity_horizontal_margin">16dp</dimen>
- <dimen name="activity_vertical_margin">16dp</dimen>
- <dimen name="dp_m_60">-60dp</dimen>
- <dimen name="dp_m_30">-30dp</dimen>
- <dimen name="dp_m_20">-20dp</dimen>
- <dimen name="dp_m_10">-10dp</dimen>
- <dimen name="dp_m_5">-5dp</dimen>
- <dimen name="dp_0.1">0.1dp</dimen>
- <dimen name="dp_0.5">0.5dp</dimen>
- <dimen name="dp_1">1dp</dimen>
- <dimen name="dp_2">2dp</dimen>
- <dimen name="dp_2.5">2.5dp</dimen>
- <dimen name="dp_3">3dp</dimen>
- ...........
- <dimen name="dp_370">370dp</dimen>
- <dimen name="dp_402">402dp</dimen>
- <dimen name="dp_410">410dp</dimen>
- <dimen name="dp_422">422dp</dimen>
- <dimen name="dp_472">472dp</dimen>
- <dimen name="dp_500">500dp</dimen>
- <dimen name="dp_600">600dp</dimen>
- <dimen name="dp_640">640dp</dimen>
- <dimen name="sp_6">6sp</dimen>
- <dimen name="sp_7">7sp</dimen>
- <dimen name="sp_8">8sp</dimen>
- <dimen name="sp_9">9sp</dimen>
- <dimen name="sp_10">10sp</dimen>
- <dimen name="sp_11">11sp</dimen>
- ......
- <dimen name="sp_19">19sp</dimen>
- <dimen name="sp_20">20sp</dimen>
- <dimen name="sp_21">21sp</dimen>
- <dimen name="sp_22">22sp</dimen>
- <dimen name="sp_24">24sp</dimen>
- <dimen name="sp_28">28sp</dimen>
- <dimen name="sp_38">38sp</dimen>
- <dimen name="sp_40">40sp</dimen>
- <dimen name="sp_41">41sp</dimen>
- <dimen name="sp_48">48sp</dimen>
- </resources>
需要负的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里面的变量值。
下载地址:http://download.csdn.net/detail/fesdgasdgasdg/9613054
Android屏幕适配dp、px两套解决办法的更多相关文章
- [Android]Eclipse 安装 ADT[Android Development Tooling] 失败的两种解决办法
原因 最近想在新装的 Win7 里搭建一下 Android 的开发环境,虽然现在有 Android Studio 了,不过还是习惯 Eclipse 一点.众所周知的原因,Eclipse 直接安装 AD ...
- Android 一种非常好用的Android屏幕适配
前言 网上关于屏幕适配的文章已经铺天盖地了,为什么我还要讲?因为网上现在基本都是使用px适配,即每种屏幕分辨率的设备需要定义一套dimens.xml文件.再加上有些手机还有虚拟按键(例如华为),这样就 ...
- 好用的Android屏幕适配
前言 网上关于屏幕适配的文章已经铺天盖地了,为什么还要讲?因为网上现在基本都是使用px适配,即每种屏幕分辨率的设备需要定义一套dimens.xml文件.再加上有些手机还有虚拟按键(例如华为),这样就还 ...
- Android 多屏幕适配 dp和px的关系 最好用dp
Android 多屏幕适配 dp和px的关系 一直以来别人经常问我,android的多屏幕适配到底是怎么弄,我也不知道如何讲解清楚,或许自己也是挺迷糊. 以下得出的结论主要是结合官方文档进行分析的ht ...
- Android 屏幕适配方案
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45460089: 本文出自:[张鸿洋的博客] 1.概述 大家在Android开发 ...
- 实用Android 屏幕适配方案分享
转载地址:http://blog.csdn.net/gao_chun/article/details/45645051 真正可用,并且简单易行,可以在多个屏幕大小和屏幕密度上有良好表现的Android ...
- Android屏幕适配和方案【整理】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这里只是根据参考资料整理下,具体内容请阅读参考资料. 原型设计图 推荐1倍效果图,即采用 720 * 360 大小( 1280 *7 ...
- Android 屏幕适配:最全面的解决方案
转自:https://www.jianshu.com/p/ec5a1a30694b 前言 Android的屏幕适配一直以来都在折磨着我们Android开发者,本文将结合: Google的官方权威适配文 ...
- Android 屏幕适配之dimens适配
Android 屏幕适配之dimens适配 转 https://blog.csdn.net/github_2011/article/details/72636851 在过去多个项目中一直使用 ...
随机推荐
- 有感于三个50岁的美国程序员的生活状态与IT职业杂想
前言 这篇杂记其实是去年也就是 2013年9月30日写的,还上过博客园十日推荐的首页,后来在整理博客分类时七弄八弄误删掉了好多文章,就包括这一篇.今天,2014年9月29日,恰好恰好一年的时候居然在好 ...
- 在ashx中使用Server对象
Server.MapPath() System.Web.HttpContext.Current.Server.MapPath()
- OC第二节 —— NSString和NSMutableString
1.为什么需要NSString对象 答:在OC中创建字符串时,一般不使用C的方法, 因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方, 在Cocoa中NSStri ...
- 如何一次把所有wordpress插件都禁用了
wordpress网站出现了问题,或者在更新一些数据的时候,需要先把插件全部都禁用了进行检查.那么如何一次把所有wordpress插件都禁用呢?试试下面的sql语句吧 UPDATE wp_option ...
- 2015baidu复赛2 连接的管道(mst && 优先队列prim)
连接的管道 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- poj.1703.Find them, Catch them(并查集)
Find them, Catch them Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I6 ...
- Spark之scala
一.什么是scala scala 是基于JVMde 编程语言.JAVA是运行在jvm上的编程语言,java 源代码通过jvm被编译成class 文件,然后在os上运行class 文件.scala是运行 ...
- rpc优化
1.刷文章列表的时候,发现调用总时间100ms ,其中调策略是花了60ms,一个开源的map方法dozer,组装bean要花40ms 2.redis的zounct方法,传 1和-1的时候有时候会返回0 ...
- 【转】JavaScript面向对象
http://www.cnblogs.com/dolphinX/p/4385862.html 理解对象 对象这个词如雷贯耳,同样出名的一句话:XXX语言中一切皆为对象! 对象究竟是什么?什么叫面向对象 ...
- HDU 2860 并查集
http://acm.hdu.edu.cn/showproblem.php?pid=2860 n个旅,k个兵,m条指令 AP 让战斗力为x的加入y旅 MG x旅y旅合并为x旅 GT 报告x旅的战斗力 ...