腾讯优测优分享-Android适配中两个世界的碰撞——视觉&开发

来源:互联网 发布:windows cmd 重命名 编辑:程序博客网 时间:2024/05/20 14:20

摘要:

Android错乱体现在很多方面,有不同的品牌、不同的机型、不同的尺寸等,腾讯优测提供专业的自动化测试适配服务,能解决大部分的android适配问题。

关键词:安卓适配  UI及布局元素适配 移动研发


一个成功的产品必须具备一系列极致的UI及布局元素,而这些最直观展现给用户的画面最初源于我们的交互视觉同学的设计。

作为开发,我们的任务是尽可能地实现设计同学的需求。但因种种原因,现实往往并不那么乐观,作为开发同学有时根本无法实现设计需求或者对设计的理解有偏差。接下来让我们一起来看看造成这偏差的根本原因所在。

1、客观方面:错乱的安卓机世界:

Android错乱体现在很多方面,有不同的品牌、不同的机型、不同的尺寸、不同的分辨率等。android的分辨率就存在明显的碎片化,表1给出了五种常见的分辨率等级。表中的分辨率等级是以dpi(dots per inch),即每英尺拥有的点的数量,计算公式:


而具体的分级则以这个值的范围来定,即dpi或densityDpi分别为120、160、240、320和480来区分5个级别。

从上面的公式可知,只要满足dpi=120,那么理论上任何一组分辨率和屏幕尺寸都算作是ldpi这一级的。这也验证了android分辨率的碎片化。表中的density是用来描述一个分辨率相对于参照mdpi(160)值而言的相对比值。

当然,表1也只是给出了各等级的部分分辨率值,市场的远不止这些。

 


2、两大世界的两大法则:

对于视觉侧,他们的法则比较统一,即像素px;而对于复杂错乱的其他侧,他们的法则比较复杂,如dip(dp:第一大法则),sp,px等。现在让我们来理解下这两界的两大法则的具体含义:

1、px:一个最基本的显示单元,同的设备不同的显示屏显示效果是相同的。

2、dip(device independent pixels 设备独立像素):不同设备有不同的显示效果,这个和设备硬件有关。


图1:两个世界的各自法则

虽然两大法则不同,但是他们之间存在一定联系:

dip=pixel/density

其中density即为设备的屏幕显示密度相对比值,对于不同的android机型,其取值是不同的,具体参见表1所示。

针对这样一个错乱复杂的android适配问题,有什么好的办法可以帮助解决该问题?让我们继续往下看:

 

3、Android的解决办法:

为了解决这种碎片化的适配问题,Android提供了按实际的设备参数来加载不同的资源,如drawable、layout、values等都可以建立不同分辨率的资源文件包:

1.图层资源适配;drawable:drawable-xhdpi、drawable-hdpi、drawable-mdpi、drawable-ldpi、drawable-hdpi-800×480和drawable-hdpi-854×480。

2.布局文件适配;layout:类似于drawable的命名。

3.参数适配;values:类似的命名。

精确适配:Android3.2以上版本可以设置精确适配,可以任意设置宽高的独立像素。

drawable-w320dp-h480dp-160dpi, 其中w320dp表示屏幕宽度320dp,h480dp表示屏幕高度480dp, 160dpi表示密度。

那么android手机是如何根据机型分辨率找到对应的资源的呢?具体流程如图2所示:


图2 android系统资源加载过程(不考虑尺寸限制)

从整个流程图可以看出,android的资源适配是根据设备的具体分辨率进行查找的,有直接对应的分辨率,则直接从对应分辨率资源包下获取资源;否则会根据分辨率级别来获取资源,即根据dpi。而对于没有找到对应级别的,则会考虑采用最适合的级别来加载资源,实验结果显示选择最适合的规则如下:

1、hdpi,xhdpi或xxhdpi会在没有对应级别的情况下去加载高一级别的资源,如果高一级也没有,则会再去加载更高一级的,即hdpi在没有找到对应hdpi时会加载xhdpi的资源,如果xhdpi也没有会去加载xxhdpi下的资源(向上提级)。

2、mdpi,ldpi会在没有对应级别的情况下去加载默认包下的资源,即drawable下资源(加载默认)。

3、如果再没有最适合的,会去加载默认资源(即drawable、layout等没有分辨率信息相关后缀的资源文件包)。

4、实例剖析:

对于部门产品,目前视觉设计都采用xhdpi:720p(720*1280)等作为切图基准,并且切图中的所有标注都是以px像素作为单位。那么开发侧在拿到这样的切图时会做这样的一个换算:

dip(dp)= pix/2

经过这样一个换算,将以px为单位的720*1280转换成以dp为单位的360*640。如果以360*640 dp进行布局,那么对于不同的分辨率级别,还原到像素后的情况如表2所示。


从表2中可知:对于ldpi、mdpi及部分hdpi,按720P转换为360 * 640的dp进行布局会出现实际的布局大小大于机型原始分辨率,从而出现实际中的一屏显示不全或出现布局重叠(这个应该是因为以margintop和marginbottom进行的布局)的现象。

针对上述的这种问题,有3个方面可以帮助解决:

1.在布局时尽量采用相对的思想进行,如水平/垂直居中,相对居左等;

2.对不同分辨率配置不同的资源文件包;

3.采用一个通用简单的方式,即采用scrollview装载所有的布局元素,避免那些由于高度不够导致的一屏显示不全。这个需要综合产品和视觉的要求来定。

文/腾讯 黄归

0 0