屏幕适配
尺寸概念解释
Dimensions - Google
android中的dp在渲染前会将dp转为px,计算公式:
px = density * dp;
density = dpi / 160;
=>
px = dp * (dpi / 160);
宽高限定符适配
- 设定基准分辨率
- 计算不同分辨率下的dp
// 例如:
1. 基准分辨率宽度为375dp
2. 需要适配的分辨率宽度为1080dp
以基准分辨率的设计稿为1dp的长度时,1080分辨率的设备需要设置为1080/375=2.87dp
缺点
这个方案有一个致命的缺陷,那就是需要精准命中才能适配,比如1920x1080的手机就一定要找到1920x1080的限定符,否则就只能用统一的默认的dimens文件了。而使用默认的尺寸的话,UI就很可能变形,简单说,就是容错机制很差。
Note: The system chooses the resource that matches both in width and height. Therefore a resource that specifies both is strongly preferred over one that specifies only one or the other. For example, if the actual screen is 720 dp wide by 1280 dp high and one resource is qualified with w720dp and another is qualified as w700dp-h1200dp, the latter is chosen even though the former is an exact match for what it specifies.
Smallest-Width - SW限定符适配
原理和宽高限定符适配的方案是一致的
指的是Android会识别屏幕可用高度和宽度的最小尺寸的dp值(其实就是手机的宽度值),然后根据识别到的结果去资源文件中寻找对应限定符的文件夹下的资源文件。
优点
- 非常稳定,极低概率出现意外
- 不会有任何性能的损耗
- 适配范围可自由控制,不会影响其他三方库
- 在插件的配合下,学习成本低
缺点
- 侵入性高,在所有地方都需要引用。
- 还是没有办法覆盖所有的机型分辨率,部分机型可能适配效果还是不佳
- 不能以高度为基准进行适配
- 生成很多文件,增大APP体积1~2M
修改系统Density
默认px = density * dp,也就是屏幕总宽度dp = 屏幕宽度px / density
这个时候我们假设所有设备上的屏幕总宽度dp会等于我们设计图375dp,那么可以得出一个公式:
density = 屏幕宽度px / 设计图宽度(375dp)
通过系统api,将density赋值给系统,抛弃掉系统默认计算density的计算公式
优点
- 使用成本非常低,操作非常简单
- 侵入性非常低
- 可适配三方库的控件和系统的控件
缺点
- 会全局影响APP的控件大小,例如: 一些第三方库控件,他们设计的时候可能设计图尺寸并不是像我们一样是375dp,这样就会导致控件大小变形等一些问题。