关闭

Android 屏幕适配之 dimens 适配

标签: 适配android
410人阅读 评论(0) 收藏 举报
分类:

相信做手机端的 App 的小伙伴,只要是产品稍微大一点,就会面临屏幕适配的问题,对于适配这个问题,网上众说纷纭,以前虽然有零零散散的看过,但是没有实践过,也是在最近遇到这个需求的情况下才研究了一下,现在做个记录。


1 参考链接

http://blog.csdn.net/qq_34161388/article/details/73469319

首先需要明白一些概念,比如什么是 px,什么是 dp,什么是 dpi,讲这些概念的文章很多,推荐一个:

http://www.jianshu.com/p/ec5a1a30694b


2 例子对比

Google 官方推荐在写布局文件的时候使用 dp,在分辨率相差不大的情况下,dp 确实能自己进行一定适配,但是如果分辨率比较大的时候,还是会有问题,随便写个布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginLeft="100dp"
        android:layout_marginTop="250dp"
        android:src="@mipmap/ic_launcher" />
</RelativeLayout>



上面两个图,左边是Galaxy Core mini,分辨率为 800x480,右边是魅蓝 metal,分辨率 1920x1080,可以看到还是有明显差别的,这个时候我们就应该想到适配,那么适配的方式有很多,比如洋神的 AutoLayout(已经停止维护了,不建议在项目中使用),还有写多个 layout 布局呀,还有 dimens 适配呀等等,在对比了多种方法后,最后我采用了 dimens 适配这种方式。这样的适配方式虽然会加入很多不同分辨率的 dimens 文件,但是比起写多个 layout 布局,要修改 UI 的时候需要修改很多 layout 的情况,还是要方便一点,最主要的是写布局的时候方便一点。


 3 使用方法

使用方法也就是建立多个不同分辨率的 values 文件夹,比如主流的分辨率:values-800x480、values-1280x720、values-1920x1080,而在 Android 中规定是以 480x320 为基准的,所以这个可以放到默认的 values 文件夹下:



然后在每个文件夹下放对应的 dimens.xml 文件。比如默认的 values 文件夹下面的 dimens 文件是这样的:

<?pxml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="px1">1px</dimen>
    <dimen name="px2">2px</dimen>
    <dimen name="px3">3px</dimen>
    <dimen name="px4">4px</dimen>
    ......
    <dimen name="px1397">1397px</dimen>
    <dimen name="px1398">1398px</dimen>
    <dimen name="px1399">1399px</dimen>
    <dimen name="px1400">1400px</dimen>

</resources>


那么 values-1280x720 文件夹下面的 dimens 就是这样的:

<?pxml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="px1">2.25px</dimen>
    <dimen name="px2">4.5px</dimen>
    <dimen name="px3">6.75px</dimen>
    <dimen name="px4">9px</dimen>
    ......
    <dimen name="px1397">3143.25px</dimen>
    <dimen name="px1398">3145.5px</dimen>
    <dimen name="px1399">3147.75px</dimen>
    <dimen name="px1400">3150px</dimen>

</resources>


values-1920x1080 下面的 dimens 就是这样:

<?pxml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="px1">3.375px</dimen>
    <dimen name="px2">6.75px</dimen>
    <dimen name="px3">10.125px</dimen>
    <dimen name="px4">13.5px</dimen>
    ......
    <dimen name="px1397">4714.875px</dimen>
    <dimen name="px1398">4718.25px</dimen>
    <dimen name="px1399">4721.625px</dimen>
    <dimen name="px1400">4725px</dimen>

</resources>


你没看错,就是 px,这样我们可以直接用 px 来写布局文件了,而不用对着设计图去换算了,而且我们既然可以将 480x320 的分辨率作为基准,那么同样也可以以我们的设计图的分辨率作为基准,比如我是以 1280x720 作为基准的,只要比例不变就行了,如果以 1280x720 为基准,那么 values-1920x1080 的 dimens 则应该是:

<?pxml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="px1">1.5px</dimen>
    <dimen name="px2">3px</dimen>
    <dimen name="px3">4.5px</dimen>
    <dimen name="px4">6px</dimen>
    ......
    <dimen name="px1397">2095.5px</dimen>
    <dimen name="px1398">2097px</dimen>
    <dimen name="px1399">2098.5px</dimen>
    <dimen name="px1400">2100px</dimen>

</resources>

这样设计图上是多少我们就写多少,再也不用去换算了。


4 dimens 文件生成器

但是这么多 dimens 文件不可能手写,推荐一个 dimens 文件自动生成器:

http://download.csdn.net/download/github_2011/9849086

使用方法:



5 特别适配

有的手机是有虚拟按键的,比如 nexus、华为,这些有虚拟按键的手机,分辨率是将虚拟按键的高度算进去了的,但是 Android 在对 values 适配的时候却不会将虚拟按键的高度算进去,比如一个手机的分辨率本来是 1920x1080,但是虚拟按键栏占了120,那么真实高度就是1800,在适配的时候就不会去找1920x1080了,而是会去找低一级的分辨率了,比如 1280x720了,那么布局又会出问题了,怎么办呢?既然它算的时候就没有算虚拟按键栏的高度,那么我们可以获取虚拟按键栏的高度:

    /**
     * Description:获取屏幕真实高度(不包括虚拟按键栏)
     * Date:2017/9/2
     */
    public static int getScreenHeight(Context context) {
        return context.getResources().getDisplayMetrics().heightPixels;
    }


然后根据这个高度来定义 values 文件夹,比如真实高度是1800,那么就应该加一个 values-1800x1080 文件夹,里面的 dimens 与 values-1920x1080 一样就行了。那么问题来了,不同手机的虚拟按键的高度也是不一样的,不可能写 values-1790x1080、values-1780x1080 这么多文件夹,上面说了找不到这个分辨率的时候,就会去找低一级的分辨率,所以我们写一个最低的就行了,比如values-1760x1080,那么 1790x1080、1780x1080 都会去找 1760x1080 了。

6 总结

屏幕适配其实说麻烦也麻烦,说简单也简单,麻烦是因为文件太多,简单是因为步骤固定,这也就是我为什么选择用 dimens 适配的原因,生成一下 dimens 文件的麻烦程度我还是可以接受的,只要将正确的 dimens 文件放到工程中,后面也就不用考虑其他的了。






0
0
查看评论

Android 屏幕适配之dimens适配

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

dimens文件生成器

问题来源:自己做了一个应用,UI发过来交互文档中的尺寸单位都是px,而google推荐dp,同时为了适配不同屏幕,需要从新计算,为了减少重复性工作,该脚本孕育而生。 实现方案:就是dimens.xml文件中写入UI交互文档大小,此时单位为px。通过遍历该文件,如果单位为px,就进行换算,如果是其他...
  • DAo_1990
  • DAo_1990
  • 2017-11-15 09:43
  • 771

android屏幕适配,自动生成不同的dimens.xml详解

android中官方建议的屏幕适配方式,通过根据不同的分辨率在工程的res文件夹下建立不同的尺寸文件夹,每个文件夹下都建立dimens.xml文件。然后根据不同的尺寸在dimens.xml文件夹中分别计算配置不同的dp或者sp单位。开发中发现,android屏幕适配需要用到很多的尺寸,每个尺寸都建立...
  • hnzcdy
  • hnzcdy
  • 2016-02-03 13:47
  • 21310

Android 生成多套dimens文件

  • 2016-06-29 16:36
  • 10KB
  • 下载

自动生成dimens文件

改变newpath 与 i可以自定义生成各个分辨率的demins文件 (需要有一个原文件) (需要先创建文件夹) 运行java文件即可 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io....
  • duoluo9
  • duoluo9
  • 2016-11-24 18:42
  • 466

安卓屏幕适配项目实用方案dimens文件生成器

  • 2017-09-20 14:43
  • 664KB
  • 下载

android dimens 自动生成工具

  • 2015-11-16 17:47
  • 7KB
  • 下载

Android中快速生成dimens文件

很多公司ui为了兼容Android和iOS,切的图都是按照iPhone6的尺寸来切的一倍图,而且都是px为单位的,我们使用的时候还需要进行转换,很麻烦,iPhone6的尺寸对应Android的xhdpi。所以自己就写了一个java工具类直接来生成demins文件。 public class MyC...
  • wxz1179503422
  • wxz1179503422
  • 2017-06-02 19:49
  • 346

android屏幕适配,自动生成不同的dimens.xml详解

android屏幕适配,自动生成不同的dimens.xml详解 标签: androidandroid屏幕适配dimens.xmlandroid自动生成屏幕适配尺寸 2016-02-03 13:47 13670人阅读 评论(21) 收藏 举...
  • qq_35956194
  • qq_35956194
  • 2017-08-19 17:06
  • 349

Android--多分辨率使用dimens转换工具

  • 2015-06-27 17:01
  • 44KB
  • 下载
    个人资料
    • 访问:37654次
    • 积分:997
    • 等级:
    • 排名:千里之外
    • 原创:63篇
    • 转载:1篇
    • 译文:0篇
    • 评论:29条
    最新评论