Android屏幕适配完美解决方案(曲面屏手机也是小Case)
纸上得来终觉浅 绝知此事要躬行。
安卓中最头疼的一个问题就是屏幕适配,然而现在网上关于屏幕适配的博客都是纸上谈兵:dp的概念、dp转px。只有少数博客才是讲到点,比如 鸿洋 大神的 Android 屏幕适配方案。
需要适配的机型
从左到右依次是魅族,华为,小米手机。我们可以看到它们的物理尺寸不尽相同。

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

我们同样还可以得出一个结论:
1080x1920指的是显示屏,不包括手机外壳
Values
Ok,我们现在来看一下values文件,这个是屏幕适配核心。

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

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

看运行效果图我们能发现,在华为机(1080x1776)中是满屏,而在小米机(1080x1920)则是半屏,所以我们完全可以通过values文件来进行屏幕适配!
授人以渔
这里我借用 鸿洋 大神的一个类。

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



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

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

分析
我们看看能不能真的进行屏幕适配。
假设现在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文件。

可以发现,@dimen/y15在1776x1080的手机中是13.87px,因此实现啦屏幕适配!
GenerateValueFiles.java下载地址 : 猛戳此处
补充
Github大神出的适配方案: https://github.com/ice45571/AndroidAutoLayout
补充时间:2017年05月17日11:50:41