美文网首页安卓屏幕适配Android技术知识Android知识
Android屏幕适配完美解决方案(曲面屏手机也是小Case)

Android屏幕适配完美解决方案(曲面屏手机也是小Case)

作者: iceIC | 来源:发表于2016-12-09 11:04 被阅读1338次

    纸上得来终觉浅 绝知此事要躬行。

    安卓中最头疼的一个问题就是屏幕适配,然而现在网上关于屏幕适配的博客都是纸上谈兵:dp的概念、dp转px。只有少数博客才是讲到点,比如 鸿洋 大神的 Android 屏幕适配方案

    需要适配的机型

    从左到右依次是魅族华为小米手机。我们可以看到它们的物理尺寸不尽相同。

    适配机型

    各机型属性

    我们写个小Demo测量出 状态栏高度,导航栏高度,屏幕宽度,屏幕高度,需要注意的是,这四个值单位都是像素。很多小伙伴都容易困惑与像素与厘米的区别,在测量结果中我们可以看到,三个手机都是宽1080px,高1920px(华为机计算应该是144+1776),但是三个手机的物理尺寸都是不相同的,所以我们可以得出结论:

    px 和 cm 没有任何关系
    
    各机型属性

    我们同样还可以得出一个结论:

    1080x1920指的是显示屏,不包括手机外壳
    

    Values

    Ok,我们现在来看一下values文件,这个是屏幕适配核心。

    values
    可以看到,我们分别为1080x1920和1776x1080创建了两个values文件,这样如果手机分辨率是1080x1920时,如果你的代码中有
    R.dimen.xxx这样的代码系统会自动在1920x1080文件夹下的dimen文件中查找。同理,如果手机分辨率是1080x1776,系统会自动在1776x1080文件夹下的dimen文件中查找,这样我们创建多个values文件是不是就达到的屏幕适配? values

    我们可以看到,在values-1920x1080文件夹下的dimen文件中dp2px为540px,恰好是1080的一半,而在values-1776x1080文件夹下的dimen文件中则是1080,正好满屏。


    效果图

    看运行效果图我们能发现,在华为机(1080x1776)中是满屏,而在小米机(1080x1920)则是半屏,所以我们完全可以通过values文件来进行屏幕适配!


    授人以渔

    这里我借用 鸿洋 大神的一个类。


    GenerateValueFiles

    我们打开该java文件,并进行如下修改:

    baseW and baseH 1080x1776 javac

    我们会看到目录下多了res文件夹。


    res

    通常我们把这些values文件夹复制到我们项目中的res文件夹下就可以了。


    values

    分析

    我们看看能不能真的进行屏幕适配。
    假设现在UI给了你一张720x1280的图,我们那个java文件的baseW和baseH分别是1080,1920,所以我们需要将UI妹子给的标注图的px进行转换(实际运用中可以把baseW和baseH改成标注图的分辨率)。
    假设一个按钮的高为10px,但这是720x1280的图,所以我们要先转换成1080x1920的像素, 10x1920/1280 = 15px,所以我们直接使用@dimen/y15就可以,但是我们可还有个1080x1776的华为机需要适配呢!10px在华为机中的像素可是 10x1776/1280 = 13.875px,我们去查看values-1776x1080文件夹下dimen文件。

    values-1776x1080

    可以发现,@dimen/y15在1776x1080的手机中是13.87px,因此实现啦屏幕适配!

    GenerateValueFiles.java下载地址 : 猛戳此处


    补充

    Github大神出的适配方案: https://github.com/ice45571/AndroidAutoLayout
    补充时间:2017年05月17日11:50:41

    相关文章

      网友评论

      • N城渔夫:链接失效了
        iceIC:已修复~
      • N城渔夫:简单,直奔主题
      • EveMemo:我想知道尺寸图是720x1280为什么要先转成1080x1920的呢?
        EveMemo: @iceIC 好哒 受教了!
        iceIC:是的,如果UI给你的图是720*1280你也可以先改baseW和baseH为720,1280并重新生成xml文件。

        现在Github上已经有新的适配方案,详见:https://github.com/ice45571/AndroidAutoLayout
        EveMemo:以base的h 和 w 为基准?

      本文标题:Android屏幕适配完美解决方案(曲面屏手机也是小Case)

      本文链接:https://www.haomeiwen.com/subject/jedemttx.html