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

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

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

需要适配的机型

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

Android屏幕适配完美解决方案(曲面屏手机也是小Case)_第1张图片
适配机型


各机型属性

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

px 和 cm 没有任何关系
Android屏幕适配完美解决方案(曲面屏手机也是小Case)_第2张图片
各机型属性

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

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

Values

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

values

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

Android屏幕适配完美解决方案(曲面屏手机也是小Case)_第3张图片
values

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


Android屏幕适配完美解决方案(曲面屏手机也是小Case)_第4张图片
效果图

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


授人以渔

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


Android屏幕适配完美解决方案(曲面屏手机也是小Case)_第5张图片
GenerateValueFiles

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

Android屏幕适配完美解决方案(曲面屏手机也是小Case)_第6张图片
baseW and baseH
1080x1776
Android屏幕适配完美解决方案(曲面屏手机也是小Case)_第7张图片
javac

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


res

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


Android屏幕适配完美解决方案(曲面屏手机也是小Case)_第8张图片
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文件。

Android屏幕适配完美解决方案(曲面屏手机也是小Case)_第9张图片
values-1776x1080

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

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


补充

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

你可能感兴趣的:(Android屏幕适配完美解决方案(曲面屏手机也是小Case))