目录
1. 问题
最近折腾屏幕适配这块,以前隐隐约约记得,系统大概能够自动适配90%左右的问题,但总会有些边角料是需要自己去单独针对适配的;
由于在设计稿和UI 代码之间的鸿沟,dp是无法解决的,因为dp不是真实像素。而且,设计稿的宽高往往和Android的手机真实宽高差别极大,以我们的设计稿为例,设计稿的宽高是IOS:375px*750px Android:360px*640px,而真实手机可能普遍是1080*1920;
那这个问题怎么办呢 ?
2. 概念
我们常听说一些手机屏幕配置,列举一些屏幕配置三要素:
机型 | inch | 分辨率 | ppi |
---|---|---|---|
小米 9 | 6.39 inch | 2340 x 1080 px | 403 |
屏幕配置三要素:
- inch
- 分辨率
- ppi
设计人员在设计的时候,出的设计稿相关元素有:
设计三要素:
- 分辨率
- 倍率
- 基准(分辨率)
计算公式为:
分辨率 = 倍率 x 基准(分辨率)
我觉得既然是设计人员,是需要分开设计Android 和IOS 设计稿的,不然在一些非标准屏上,总是会有误差,而且误差有时候还会到了不能忽视的地步;
设计 | 分辨率 | 倍率 | 基准 |
---|---|---|---|
Android | 1080 x 1920 px | 3 | 360 x 640 px |
720 x 1280 px | 2 | 360 x 640 px |
那么,到了Android 小伙伴要实现设计稿的环节上,是如何平衡UI 设计与UI 实现的细节误差呢 ?
Android UI 实现除了需要设计提供分辨率和倍率信息之外,自己还需要结合具体机型,进行单独适配资源;
Android UI 实现要素:
- 设计,分辨率
- 设计,倍率
- 设备,分辨率
- 设备,density (像素密度无关)
Design UI | 分辨率 | 倍率 | 分辨率 | density | Android UI | 备注 |
---|---|---|---|---|---|---|
Design | 1080 x 1920 px | 3 | 1080 x 2340 px | 2.75 | Android | |
720 x 1280 px | 2 | 1080 x 2340 px | 2.75 |
其实,可理解为设计提供的倍率,就是以基准(分辨率)设计为基础,设计所想要的理论 density(像素密度无关),实际设备提供的分辨率和density 各不一样,甚至同一规格下也不一样,各个设备机器实际的density,我们称之为设备 density(像素密度无关) ;
即Design UI 所要表达的设计意图:
Design UI | 分辨率 | 倍率 | 基准 | 理论 density(像素密度无关) |
---|---|---|---|---|
Design | 1080 x 1920 px | 3 | 360 x 640 px | 360 x 640 dp |
720 x 1280 px | 2 | 360 x 640 px | 360 x 640 dp |
那么再加一条Android 要素,变为Android 设计四要素:
- 分辨率
- 倍率
- 基准(分辨率)
- 理论 density(像素密度无关)
当设计提供的倍率和理论 density(像素密度无关)与设备提供的density和设备 density(像素密度无关)相等时,映射到设备上,效果才是一模一样的,否则都会有误差,这个误差称之为绝对误差,需要系统去处理弥补误差;
设计提供的基准和理论 density(像素密度无关)其实是相等的,表明本质上设计人员设计的其实是1px = 1dp 放大版本;
拿360 x 640 dp 的理论 density(像素密度无关) 来说,其实真实比例关系为360/160 x 640/160 = 2.25 x 4 尺寸放大版本
如果规定,
设计要以1px = 1dp 为标准蓝本(基准要素),设计相关UI 资源;
从设计的角度来看,描述一个Android 屏幕规则有2个要素:
- 分辨率
- 理论 density(像素密度无关)
而实际Android UI 实现所表达的设计意图:
机型 | Android UI | 分辨率 | density | 设备 density(像素密度无关) |
---|---|---|---|---|
小米 9 | Android | 1080 x 2340 px | 2.75 | 392.73 x 850.91 dp |
小米 5s | Android | 1080 x 1920 px | 3 | 360 x 640 dp |
红米 4(4X) | Android | 720x 1280 px | 2 | 360 x 640 dp |
HUAWEI P10 | Android | 1080 x 1920 px | 3 | 360 x 640 dp |
HUAWEI P10 Plus | Android | 1440 x 2560 px | 4 | 360 x 640 dp |
由此可知,不同的设备提供的density 和设备 density(像素密度无关) 都是不尽相同的,给实际适配过程中造成的误差不可避免;
density 表达实际设备上,1 dp = <N>density px;
设备 density(像素密度无关) 表达实际设备上,总的w(宽)与h(高)分量dp 值;
3. 分析
有了上述描述的概念,那怎么去分析实际工作中遇到的UI 设计和UI 实现的问题呢?
这里面其实还延伸出来一个细节问题,就是UI 实现和UI 适配的问题?
3.1 UI 设计与UI 实现
要求设计人员按照如下信息提供:
UI 设计的过程:
之间是给一个Zip 包,里面有设计资源和html 标注,这个可以自由切换由用户选择几倍图来展示,取值要四舍五入;
实际情况,由于我们用的蓝狐做标注,蓝狐对设计IOS 和Android 的格式有要求,设计人员只提供IOS 设计稿,Android 人员按照IOS 设计稿的来,同时设计人员又不按照蓝狐的设计要求来,所以Android 做出来的问题比较突出;
Android 小伙伴在实现UI 的过程中,如果公司条件允许,
找个和设计提供的分辨率尺寸和理论 density(像素密度无关)一致的Android 手机吧,这个手机的作用其实是面向UI 编程的手机;
其实,打开手机开发者选项 -> 绘图 -> 最小宽度,即可控制设备 density(像素密度无关);
经验证,修改最小宽度的值为360dp,在小米9 设备上,density 由2.75 变为3.0;即可对比验证UI 设计与UI 实现的误差;
UI 实现的过程:
我们Android 小伙伴其实在实现UI 的过程中,拿到设计稿和标注,切换到Android 标注模式,以理论 density(像素密度无关)的在宽上分量dp 值为准则的,高上的分量dp 值不做要求;
3.2 UI 实现与UI 适配
如果按照上述UI 设计和UI 实现所描述的过程,大概率上针对标准屏应该没事大问题,那如果针对如下的屏幕呢 ?
UI 小伙伴按要求提供的设计,在小米 9 上还是有些小问题,问题原因是啥呢 ?
由于我的屏幕分辨率是1080 x 2340 px 的,设备 density(像素密度无关) 在宽上分量的dp 值为392.73 dp,和设计提供的屏幕分辨率为1080 x 1920 px,理论 density(像素密度无关) 在宽上分量的dp 值为360 dp,列表如下所示:
机型 | 设计,分辨率 | 理论 density(像素密度无关) | 设备,分辨率 | 设备 density(像素密度无关) | 备注 |
---|---|---|---|---|---|
小米 9 | 1080 x 1920 px | 360 x 640 dp | 1080 x 2340 px | 392.73 x 850.91 dp |
因此,分辨率宽的度量值是标准值,高的度量值是非标准,设备 density(像素密度无关)的值和标准设计提供的理论 density(像素密度无关)值不符,导致了误差存在;
// 规定 1 px = 1dp 的前提条件下,Android 设计计算公式
设计,分辨率 = 倍率 x 理论 density(像素密度无关)
这样吧,为了做出数学解释,单拿出来规定如下概念,比较好表达与描述问题的原因:
定义,设计分辨率与倍率的比值,为理论预期 density,公式如下:
// 不带单位
理论预期 density = 设计,分辨率/倍率
// 规定 1 px = 1 dp 且带单位的前提条件下
设计,分辨率 = 倍率 * 理论 density(像素密度无关)
其实,二者公式上看是一样的,只不过是带单位与不带单位的区别,这样比较好描述问题
定义,倍率与理论 density(像素密度无关)的积,为设计预期分辨率,公式如下:
// 不带单位
设计预期分辨率 = 倍率 * 理论预期 density(像素密度无关)
// 规定 1 px = 1 dp 且带单位的前提条件下
设计,分辨率 = 倍率 * 理论 density(像素密度无关)
其实,二者公式上看是一样的,只不过是带单位与不带单位的区别,这样比较好描述问题
同理,会存在设备预期 density 和设备预期分辨率,不一一概述概念了,拿概念来描述问题解释原因,由上述公式,计算各个概念所表达的具体度量值,列表如下所示:
机型 | 设计预期分辨率 | 理论预期 density | 设备预期分辨率 | 设备预期 density | 备注 |
---|---|---|---|---|---|
小米 9 | 1080 x 1920 | 360 x 640 | 1080.01 x 2340.00 | 392.73 x 850.91 |
由数据对比,得出:
- 设计预期分辨率的宽度量值,和设备预期分辨率的宽度量值四舍五入后,相等;
- 设计预期分辨率的高度量值,和设备预期分辨率的高度量值四舍五入后,不相等,误差为-420;
- 理论预期 density的宽度量值,和设备预期 density的宽度量值四舍五入后,不相等,误差为-32.73;
- 理论预期 density的高度量值,和设备预期 density的高度量值四舍五入后,不相等,误差为-210.91;
由此,得出:
- 设计预期分辨率和设备预期分辨率的值域,不相等;
- 理论预期 density和设备预期 density的值域,不相等
导致了,误差的存在;
具体误差有多大呢 ?
采用控制变量法,定义理论预期 density和设备预期 density的比值,为相对误差 density 因子,则小米 9 设备和设计标准的相对误差 density 因子为0.92;
此处XXX 因子不讨论了,不过度使用数学工具探讨误差了,避免为了讨论而讨论;
相对误差计算公式:
相对误差 = | 理论预期 density - 设备预期 density| x density
得出,小米 9 相对误差为 = | 360 - 392.73 | x 2.75 = 90.0075 px
4. 疑问
1. 相对误差;
2. 绝对误差;
3. 误差因子;
...
持续性更新,修改,更正中...