Android 屏幕适配之dimens(上线项目中实际应用)

在过去多个项目中一直使用dimens适配,这种适配方式的优点很明显,不用管什么dp还是dpi这些东西,只需要以一种屏幕分辨率为基准(例如1280x720,相当于把屏幕宽分成720份,高分成1280份),生成对应屏幕分辨率的的dimens文件即可完成适配,缺点也比较明显,就是一种分辨率就需要一套dimens文件,所以dimens文件会比较多;

例如这里我们以1280x720的屏幕分辨率为基准那么values-1280x720文件夹下面的dimens.xml文件如下:

[html] view plain copy
  1. <dimen name="x1">1px</dimen>  
  2. <dimen name="x2">2px</dimen>  
  3. <dimen name="x3">3px</dimen>  
  4. <dimen name="x4">4px</dimen>  
  5. 省略若干行...  
  6. <dimen name="x1279">1279px</dimen>  
  7. <dimen name="x1280">1280px</dimen>  
那么values-1920x1080文件夹下面的dimens.xml文件就应该是这样的:
[html] view plain copy
  1. <dimen name="x1">1.5px</dimen>  
  2. <dimen name="x2">3px</dimen>  
  3. <dimen name="x3">4.5px</dimen>  
  4. <dimen name="x4">6px</dimen>  
  5. 省略若干行...  
  6. <dimen name="x1279">1918.5px</dimen>  
  7. <dimen name="x1280">1920px</dimen>  
values-2560x1440文件夹下面的dimens.xml文件就应该是这样的:
[html] view plain copy
  1. <dimen name="x1">2px</dimen>  
  2. <dimen name="x2">4px</dimen>  
  3. <dimen name="x3">6px</dimen>  
  4. <dimen name="x4">8px</dimen>  
  5. 省略若干行...  
  6. <dimen name="x1279">2558px</dimen>  
  7. <dimen name="x1280">2560px</dimen>  
其实主要的分辨率就这三种,至于低于1280x720的分辨率的手机配置太低了,不在我们项目的适配考虑之内(如果需要适配建立对应的dimens文件即可)
在适配过程中比较常见的问题是虚拟按键的问题,这里重点说一下:有些手机有虚拟按键,例如华为的很多手机都有,有些手机没有,有虚拟按键的手机在适配过程中会出现一些问题,下面以华为 honor V8为例说一下这个问题

[java] view plain copy
  1. /** 
  2.      * @param context 
  3.      * @return 获取屏幕原始尺寸高度,包括虚拟功能键高度 
  4.      */  
  5.     public static int getTotalHeight(Context context) {  
  6.         int dpi = 0;  
  7.         WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);  
  8.         Display display = windowManager.getDefaultDisplay();  
  9.         DisplayMetrics displayMetrics = new DisplayMetrics();  
  10.         @SuppressWarnings("rawtypes")  
  11.         Class c;  
  12.         try {  
  13.             c = Class.forName("android.view.Display");  
  14.             @SuppressWarnings("unchecked")  
  15.             Method method = c.getMethod("getRealMetrics", DisplayMetrics.class);  
  16.             method.invoke(display, displayMetrics);  
  17.             dpi = displayMetrics.heightPixels;  
  18.         } catch (Exception e) {  
  19.             e.printStackTrace();  
  20.         }  
  21.         return dpi;  
  22.     }  
[java] view plain copy
  1. /** 
  2.  * @param context 
  3.  * @return 获取屏幕内容高度不包括虚拟按键 
  4.  */  
  5. public static int getScreenHeight(Context context) {  
  6.     WindowManager wm = (WindowManager) context  
  7.             .getSystemService(Context.WINDOW_SERVICE);  
  8.     DisplayMetrics outMetrics = new DisplayMetrics();  
  9.     wm.getDefaultDisplay().getMetrics(outMetrics);  
  10.     return outMetrics.heightPixels;  
  11. }  
通过这两个方法我们可以得到手机的分辨率高度和手机去除虚拟按键的高度,两者相减就是手机的虚拟按键的高度
调用后得到的结果是总高度 : 2560 内容高度 : 2408 虚拟按键 : 152
如果想要适配该机型,其实也很简单,只需要把原来的values-2560x1440文件夹复制一份重新名为values-2408x1440即可,在使用dimens适配过程中,若遇有类似虚拟按键问题可照此处理,亲测完美适配!

对于dimens文件这里我想说一下,其实一个文件夹下面一个dimens文件即可,没必要弄两个(lay_x和lay_y,网上不少博客是使用两个dimens文件,至少分辨率是16:9的手机用一个dimens文件是可以的,因为lay_y.xml里面的内容已经包括lay_x.xml文件中的了)

减少dimens文件还有一个方法:对于一个主流的分辨率只要留虚拟按键高度最高的那组dimens文件即可,什么意思呢?比如说1920x1080分辨率,有多款机型都是这个分辨率,只不过是虚拟按键高度不同,你可能需要创建1788x1080,1812x1080,1776x1080...等多套dimens文件,其实大可不必,只需要1776x1080这一套就够了,因为系统找不到对应尺寸的dimens文件,会使用比它略小的分辨率的dimens文件,如此一来我们的dimens文件会大大减少的。

下面是使用dimens适配的简单效果图:


我们把手机宽度分为720份,360则正好是手机屏幕宽度的一半,适配后的效果如上所示。

上面内容只是我在项目开发过程中使用dimens适配的简单总结,使用中若遇到问题欢迎交流探讨,若文中有不当之处也欢迎大家批评指正!

dimens文件生成器下载

该生成器使用十分简单,下面用两张截图介绍使用方法:



下面是我Demo中使用的dimens文件:


主要是针对1280x720、1920x1080和2560x1440的三个主流分辨率做了适配,我这里是以1280x720为基准,即把屏幕宽分为720份、高分为1280份。

这里我说的更明白一点:以1920x1080分辨率为例,只要你的Android设备是这一分辨率的,屏幕总高度去除虚拟按键高度之后只要≥1788就能够适配。

.apk下载


上面是我测试Demo的apk下载地址,您可以下载试一下看看是否能够适配您的机型。


上图是我用android studio中的模拟器测试的结果,该模拟器的分辨率是1920x1080,很明显它有虚拟按键,去除虚拟按键之后的高度是1794≥1788,故而在适配范围内,从图中效果也可以看出已经完美适配,如果您的机型也是1920x1080的(其它分辨率原理也一样),测试发现360x360的浅红色方块区域没有占手机屏幕宽度的一半,说明未能成功适配,很可能是因为您的手机虚拟按键高度>132即您的内容高度<1788,这时候不用惊慌,看看屏幕中得到的内容高度是多少,假如是1776那就把values-1788x1080文件夹的名称改为values-1776x1080,重新运行你会发现奇迹发生了...

如果你不相信,那你就把values-1788x1080文件夹删掉,用studio的模拟器或者带有虚拟按键的1920x1080的真机测一下,如果不能适配,你再把删掉的文件夹加进去,重新运行看看效果吧!

如果您还是不信那就下载源码试试吧!


展开阅读全文

没有更多推荐了,返回首页