Android 屏幕适配之dimens适配

 
 
转  https://blog.csdn.net/github_2011/article/details/72636851

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

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

  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文件就应该是这样的:

  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文件就应该是这样的:

  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为例说一下这个问题

  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.  
    }
  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文件生成器下载

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

注意:该生成器得到的dimens文件的单位是dp,我们需要的是px作为单位,只需要把saveDimens.xml文中的内容做一次查找替换就可以了。(这是个小bug,不过不妨碍我们使用)

下面是我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的真机测一下,如果不能适配,你再把删掉的文件夹加进去,重新运行看看效果吧!

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

到这dimens适配大致已经介绍完了,想必读者也已经领会了解决虚拟按键的窍门,那么知道了这些之后可以在正式项目中使用dimens适配了吗?

好像还不行,还有一些坑我觉得还是有责任要告诉大家的:

★ values文件夹下面最好也创建一个默认的dimens文件(若是找不到对应分辨率的dimens文件,系统默认使用该dimens文件,内容使用720×1280那个dimens即可)

★ 尽量把所有分辨率的dimens文件都创建出来(各种分辨率的都考虑到,你的应用才会适配的完美)

★ 多使用布局属性做适配(match_parent,wrap_content,以及线性布局的权重等等多结合这些属性做适配)

理解dimens文件适配的精髓,掌握解决虚拟按键问题的诀窍再结合传统布局的属性这样你的 dimens 适配之路才能走的轻松、坦荡!

Android 屏幕适配之dimens适配的更多相关文章

  1. Android开发——自动生成Android屏幕适配的dimens.xml文件

    使用dimens.xml解决屏幕适配问题是Android官方解决方案,本文主要讲述了如何自动生成Android屏幕适配的dimens.xml,减少了工作量,在维护dimens.xml文件时更加省时省力 ...

  2. Android屏幕适配dp、px两套解决办法

    "又是屏幕适配,这类文章网上不是很多了吗?" 我也很遗憾,确实又是老问题.但本文重点对网上的各种方案做一个简短的总结,和具体使用方法. 若想了解具体Android设备适配的前世因果 ...

  3. Android适配(屏幕适配、国际化适配)-转

    首先来说一下Android的屏幕适配: 关于Android屏幕的一些基本概念知识,自行充电..在此只介绍实际开发过程中的使用 1.说到Android的屏幕适配,首当其冲的就是图片的适配 图片适配遵循两 ...

  4. Android 屏幕适配方式

    适配:即当前应用在相同的手机上面显示相同的效果.适配前需要首先确定当前手机所属像素密度类型(如:xhdpi.hdpi.mdpi等) 像素密度:每英寸上分布的像素点个数,单位(dpi,ppi),利用勾股 ...

  5. 实用Android 屏幕适配方案分享

    转载地址:http://blog.csdn.net/gao_chun/article/details/45645051 真正可用,并且简单易行,可以在多个屏幕大小和屏幕密度上有良好表现的Android ...

  6. Android屏幕适配和方案【整理】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这里只是根据参考资料整理下,具体内容请阅读参考资料. 原型设计图 推荐1倍效果图,即采用 720 * 360 大小( 1280 *7 ...

  7. Android 一种非常好用的Android屏幕适配

    前言 网上关于屏幕适配的文章已经铺天盖地了,为什么我还要讲?因为网上现在基本都是使用px适配,即每种屏幕分辨率的设备需要定义一套dimens.xml文件.再加上有些手机还有虚拟按键(例如华为),这样就 ...

  8. 好用的Android屏幕适配

    前言 网上关于屏幕适配的文章已经铺天盖地了,为什么还要讲?因为网上现在基本都是使用px适配,即每种屏幕分辨率的设备需要定义一套dimens.xml文件.再加上有些手机还有虚拟按键(例如华为),这样就还 ...

  9. Android屏幕适配-安卓切图

    一.Android中的单位 1.dp(dip):density-independent pixels,这并不是一个绝对的单位,而只是一个相对的概念,代表的是屏幕写对角线上每inch上像素点的个数. 2 ...

随机推荐

  1. curl函数错误码对照信息表

  2. 【appium】appium中的元素定位和基本操作

    # coding=utf-8 from appium import webdriver import time from selenium.webdriver.support.ui import We ...

  3. Image Processing and Analysis_21_Scale Space:Scale-Space for Discrete Signals——1990

    此主要讨论图像处理与分析.虽然计算机视觉部分的有些内容比如特 征提取等也可以归结到图像分析中来,但鉴于它们与计算机视觉的紧密联系,以 及它们的出处,没有把它们纳入到图像处理与分析中来.同样,这里面也有 ...

  4. python 将GIF拆分成图片方法

    import os from PIL import Image, ImageSequence def parseGIF(gifname): # 将gif解析为图片 # 读取GIF im = Image ...

  5. sql server 某一列求和

    sql server 某一列求和 SELECT 患者来源,设备类型,检查部位,设备名称,convert(char(10),STUDY_DATE,121) as 日期, count(distinct 就 ...

  6. 【转】ufw 端口

    1.扫描端口 用ubuntu自带的网络工具中的端口扫描不够强大,扫描结果可能不全,推荐用nmap,黑客常用的端口扫描利器!安装方法:sudo apt-get install nmap ,想扫描端口nm ...

  7. #Python语言程序设计Demo - 七段数码管绘制

    Python设计七段数码管绘制 单个数码管效果: 设计总数码管效果: Pyhton 编程: #七段数码管绘制 import turtle as t import time as T def drawG ...

  8. Oracle-锁的查询和处理

    1.查出锁定object的session的信息以及被锁定的object名 SELECT L.SESSION_ID SID, S.SERIAL#, L.LOCKED_MODE, L.ORACLE_USE ...

  9. 使用JXL组件操作Excel和导出文件

    这段时间参与的项目要求做几张Excel报表,由于项目框架使用了jxl组件,所以把jxl组件的详细用法归纳总结一下.本文主要讲述了以下内容: JXL及相关工具简介 如何安装JXL JXL的基本操作 创建 ...

  10. Java8-Lock-No.04

    import java.util.HashMap; import java.util.Map; import java.util.concurrent.ExecutorService; import ...