这是一篇有保质期的文章。
解决多机型的适配问题是无线端UI设计的常识。目前在iOS端,只要做好对应三个手机尺寸(320pt,375pt和414pt)的适配,UI设计师可以基本保证iOS上不会因为适配出现问题。但是开放自由的Android却并不那么容易搞定。在华为和OV等等一堆国产Android手机崛起的今天,我们务必要注意Android UI适配中的那些坑。否则如果开发出来效果就像建筑设计师的概念图到甲方的施工完成图一样,岂不是要让设计师mm们哭晕在厕所?
本文就我遇见的Android适配问题,围绕以下两个大坑进行说明:
1. Android的碎片化
2. Android 7的显示大小调节
/ Android的碎片化 /
Android设备的碎片化是众所周知的问题了。根据OpenSingalMaps前几年的报告表明:
2012年,支持Android的设备共有3997种;
2013年,支持Android的设备共有11868种;
2014年,支持Android的设备共有18796种。
以下这张图可以可视化地说明Android设备的碎片化情况。
多到让人头皮发麻的Android设备分布,还只是2014年底统计的情况。而如今,越来越多2k屏和4k屏的出现,让面向Android设备的无线端产品适配又要面对更多的碎片。
Android的碎片化也并非无解。就目前(2017上半年)来看,Android端主流移动设备主要需要适配像素为320p, 480p, 720p,1080p和1440p。超高分辨率的4k屏(2160p)由于能耗问题还尚未普及,因此暂时可以不用考虑进来。
从适配像素怎样得出适配方案呢?目前适配像素对应的是手机宽度像素大小,例如我的一加3手机,屏幕像素大小是1080pix * 1920pix,那么就算做1080p的设备。对Android而言,DPI等价于PPI(Pixels-Per-Inch),其计算方式为
还是以我的一加3手机为例,dpi计算如图所示约为400:
不同dpi对应Android适配中的不同dpi等级。参照常见的适配像素范围,目前常见dpi等级如下图:
比例这一栏,对应的就是同样的设计,放在不同等级dpi设备中的像素比例大小,简而言之如下图:
解决方法:
对于Android开发来说,一般的app在选择呈现方式的时候是会调取这个设备的dpi等级的(具体方法请咨询开发GG)。因此,为了保证在不同设备上设计的还原度,目前我们至少要考虑自己产品高占比的几个dpi等级,对应不同等级出图和进行还原度测试,以保证在每个设备上的适配良好。
注意事项:
在碎片化问题常见的适配场景上最容易出现的问题就是没有考虑到对某个dpi等级的适配。例如从某一产品的机型占比来说,可能1440p的占比极低,甚至不到5%。但是考虑到1440p的机型多半是高级机型,用户可能价值更高,遗漏了这一段dpi的适配与测试可能会招致高价值用户的流失,甚至是公司好高层的负面反馈。
不过如文章开头所说,本文具有保质期,也许半年或一年后机型适配又会出现新的变化,那么需要考虑的适配范围就又不一样了。
/ Android 7的显示大小调节 /
年龄较大或者经常处理紧急事务的用户可能会希望自己屏幕上所有元素的显示比例更大一些,以方便他们可以更快看见。所以很多设备都有字体大小调节,这在部分产品的设计中也是会被考虑到的。
然而恐怖的事情在于,Android团队为了满足用户需求,在Android 7 版本里居然加入了显示大小调节的功能。
什么是显示大小调节?与字体大小调节不同,显示大小调节是直接变化Android设备上所有元素的显示大小,即在同样的像素尺寸内改变元素尺寸。Android 7提供的显示大小变化尺寸有5个变化等级,控制界面如图:
至于像素尺寸变化的大小规律是什么,目前我没有从任何文档里查到确切资料。自己动手丰衣足食,我用我的Android手机打开最好用的在线旅行app携程,对各元素尺寸变化进行测量后发现,同样大小的元素在5个显示大小变化等级里的变化比例为:19:21:24:25:27.
换句话说,假设我的手机是1080p,对应xxhdpi等级,那么在这一个等级里我需要面对5种不同的显示大小。
这会引发什么问题呢?如果仅仅是显示大小变小,那么可能产生的结果就是元素之间变得疏远了,之前设计的分组或者分类可能会变得不那么明显;如果是显示大小变大,那么可能会有元素的冲突和重叠。以友商飞猪的某个界面为例,明显就能看见元素的覆叠和错位:
应对这一问题的解决方案可能会比较复杂。首先由于只是显示大小的微调,程序上很难对像素等级进行判断。其次,这种变化加剧了Android的碎片化,设计也不可能为不同的显示尺寸单独切图或者做设计以保证显示的清晰。最后,我和资深的开发GG们聊了一下,目前为了应对设备间微小尺寸变化,一般程序里是会通过相对定位和对应区域的适配来保证不会发生不必要的冲突和覆叠,但是对于写死的元素大小和尺寸就无力支持了,例如文本框默认显示。
但是设计师也不是完全束手无策。以下是我进行调研后总结出来的一些方法:
首先,设计的时候减少对元素尺寸的绝对定位和绝对大小的要求,尽量用相对定位和比例大小来定义元素的位置和尺寸。
其次,精简话术,对于文本框这种难搞定的东西尽量不要完全占满,一定要考虑到适配可能出现的问题。
再次,对于某些无法精简和相对定位的元素,在设计的时候考虑好适配。一旦出现显示比例变化,元素可以根据周围元素变化进行尺寸微调已满足适配。
最后,准备好一台可以变化显示大小的安卓机,多交流。
最后的最后,祝大家618剁手愉快。
1922 @ Home
2017.06.18