android应用如进行屏幕尺寸和分辨率适配

来源:互联网 发布:zk框架 知乎 编辑:程序博客网 时间:2024/05/16 04:48

写在前面的话:作为一个android开发入门小生,往往关注的只是android组件怎么使用,功能如何实现,而且最想的是在自己的手机上跑起来自己设计、开发的应用向周围的人显摆(其实笔者是在说自己)。所以我们往往忽略了我们的应用在别人的手机上实际的效果。所以理解如何编写一个屏幕适配性高的应用,是从一个小作坊式应用开发者向真正商业化应用软件开发者晋升所必须具备的素质。

参考文档是最好的老师,所以为了深入理解android平台屏幕适配方案,我们必须从android关于这一块的参考文档入手。

概述——android应用如进行屏幕尺寸和分辨率适配

本章内容参考自android开发文档” SupportingMultiple Screens”。

一、屏幕特征介绍。

         1、屏幕尺寸(Screen size)

卖场中商家向客户介绍设备屏幕大小的时候一般用的都是“寸(inch)”这个单位,

android平台上将“寸(inch)”描述为”Screen size”。Android系统根据Screen size概念性地分类为Small、normal、large、xlarge几个级别。

         2、屏幕密度 (Screen density)

         当然作为一个标准的it人士,当然不会被单纯的Screensize大小忽悠住。我们往往关心的是屏幕的分辨率(Resolution),亦即真正决定了屏幕显示画面细腻程度的参数。苹果newPad即是凭借其大力宣扬的视网膜屏着实又火了一把,其关键所在就是苹果在newPad的9.7inch屏幕规格上使用的是高达2048x1536分辨率的屏幕,从画质细腻程度上说足比同样为9.7inch大小的iPad2的1024x768分辨率的屏幕高了4倍。

         我们一般以density(dpi)来描述一个屏幕的像素密度,在Android系统中根据dpi大小概念性的将屏幕像素密度指标分为ldpi、mdpi、hdpi、xhdpi几类。基本划分了屏幕像素密度的大小。

         如果读者注意到了,以上对size和density的分类都是概念性的分类,这里的意思就是并不是完全绝对的划分。之所以这么划分,是因为市面上现有手机中,往往很容易发现两台手机在屏幕尺寸,宽高比上有非常细微的差别;类似的也会有两台手机之间的像素密度有非常细微的差别(不同厂家生产的屏)。为了使产品的UI设计能够尽量忽视size和density的这些细微的差距,google做出了这样的“大概”的分类。

         从图1中可以看到屏幕尺寸和分辨率在android平台上的划分,每个相邻分类之间都是有重叠区域的。基于此,UI设计师们只需要考虑应用在不同generalized size/density上的适配性就行了。大大减少了产品的设计成本。

图1、屏幕尺寸以及像素密度分类 1

        

         3、Density-independent pixel(dip)

         由于上面两点屏幕特性的存在,我们在考虑屏幕适配方案的时候往往因为需要在实际尺寸(size)和像素密度(density)两个维度的方向考虑从而导致异常头疼。基于此点,google设计了一个单位用于在进行应用的UI设计时能够只在一个维度上考虑。他就是dip。

         dip这个单位其实与像素类似,都可以理解为组成画面的最小颗粒度的单位。就是这个单位使我们彻底摆脱了在设计界面时在考虑屏幕分辨率大小的同时还需要考虑屏幕dpi的繁琐思路。之所以这么说是因为android手机通过在不同dpi的手机上,自动转换一个单位dip所代表的像素值,即dipi越大的手机,一个dip所代表的dx数量越多。如下图。


         在此我们先不介绍dip的具体用法,只提供手机屏幕分辨率与dip值的换算方式作为参考:

dx = dip (dpi / 160)

         注:第一台安卓手机the T-Mobile G1 的dpi即为160。


之前我们谈到在根据不同分辨率设计ui的时候往往还需要考虑到不同设备的dpi,这是什么原因呢。下面有一个简单的例子。

如果一个应用没有考虑dpi直接在界面上放上了一个32*32像素(px)单位大小的按钮,那么在同样是3.7寸,但是像素分别为480*320、600*480、800*600的三台手机上展示效果将是怎样的呢。大家思考一会过后,可以看到下图的展示效果。


图2、同为32px*32px的按钮在三台物理尺寸相同、分辨率不同的手机上的展示效

我们从图2中清晰可见,从视觉上来看,你的整体布局明显跟设计不符了。这是因为由于dpi的增大,一个px对应在设备上的物理长度减小,导致最终展现的界面组件大小越小。

什么样的屏幕适配方案可以解决这个问题?

用dip作为界面组件的尺寸标注单位。

如果我们将控件的尺寸定义为30dip*32dip,那么这个界面最终在屏幕上的显示效果将是如图3所示:


图3、32dip*32dip的图片在不同机器界面上的展示效果

         有此可见通过dip单位的引入,我们在进行UI设计的时候就只需要考虑不同屏幕物理大小情况下的界面布局了(屏幕适配的真正目的也正是如此)。

         正因为有了这样的便利,为了标准化UI设计的目标,google对screen size的真正分类方法其实有确切的分类标准:

1)  xlarge,≥960dip x 720dip

2)  large, 大于等于640dip x 480dip

3)  normal 大雨等于 470dip x 320dip

4)  small 大于等于 426dip x 320 dip

5)  

二、屏幕适配的基本过程。

在android平台上进行分辨率适配,google提供了一套流程共开发者参考:

1、  声明你的应用兼容的屏幕尺寸。

通过在manifest文件中包含<support-screens>段来声明你的应用兼容的屏幕尺寸。更多内容可见相关开发文档。

这一步一个显著的作用是让设备判断是否支持用屏幕兼容性模式(ScreenCompatibilityMode)来运行你的应用。以及可以

2、  为不同的屏幕尺寸提供不同的布局。

这一步的作用很容易理解,同一个应用,在10.1寸的平板电脑上或者7寸的大屏幕手机上,相较于3.0寸的小屏幕手机,往往需要展示更多的信息,或者更易于浏览和操作的界面排版方式。而更小屏幕的手机上需要更精干的界面。

3、  为不同的dpi提供不同的图片资源。

回到上一节我们的例子。如图3,如果我们使用dip标记一个组件的大小,那么系统绘制图片资源时,会将以像素尺寸度量大小的图片资源做缩放操作来最终适应屏幕中组件的大小。这样当缩放比例到达一定程度时,会出现图片资源显示效果模糊、边沿产生毛刺、圆角变形等特点。为了尽量保证手机上最终展示效果符合UI设计的效果,建议针对不同dpi准备不同的图片资源。

如果你为不同dpi设备准备了不同的图片资源,android参考文档中建议以3:4:6:8的比例来依次做ldpi,mdpi,hdpi和xhdpi上的资源。笔者认为google这么做是考虑到了不同dpi之间dip单位代表的px值。如果读者想要了解跟多图标资源制作的信息可参考相关开发文档“IconDesign Guidelines”。

除了给不同dpi准备不同的图片资源以外,android中还有一种方法可以避免由于过度缩放导致的图片失真的结果。那就是使用.9.png格式的图片,.9.png格式的图片简单来说就是一种可以自定义横向、纵向拉伸区域的图片,从而在对图片进行缩放操作的时候,android系统不会将它整体的缩放,而是将定义的拉伸区域横向,纵向拉伸。相关.9.png格式的介绍读者可自行参考某度、某歌和android开发文档。值得一提的是.9.png格式的图片有两种生成方式,即可以在应用运行过程中在代码中通过加载原图片资源同时增加拉伸的相关信息来构造.9.png格式的图片;也可以使用jdk或者android sdk中的工具先生成.9.png格式的图片,再拷贝到工程目录的对应资源文件夹下。

三、android系统如何加载不同的资源文件。

Android系统资源文件具有一个特性,该特性支持我们提供可更改的资源(provide alternative resources)。该特性的主要目的就是为了使应用兼容不同设备的不同配置信息,显然,不同屏幕也算在内。

具体做法是:

1、在资源文件夹中新建以<resources_name>-<config_qualifier>格式命名的资源文件夹。

其中resources_name代表的是android资源文件夹所定义的layout/drawable/values等类型文件夹;config-qualifier代表的是配置限定符,表示该文件夹中的资源文件,允许加载的配置要求,如某写string信息需要在英文系统中使用你可以新建res/values-en/strings.xml文件,这样系统就会在英文系统中,优先使用values-en下的资源。

2、将不同配置下使用的资源文件放在不同的资源文件夹中。

在使用这个特性的时候应该注意以下事项:

1、不要随意删除没有增加config-qualifier的文件夹。在android资源文件夹中,这样的文件夹即是默认文件夹,当添加了config_qualfier的文件夹中没有能够匹配当前设备配置的限定符时,将会从默认德尔文件夹中加载资源。所以如果当系统需要从默认文件夹中加载资源而又找不到资源的时候应用就会崩溃(当然如果你目的就是如此,那么大可这样做)。

2、设备的一些配置是会不断变化的(例如横竖屏切换),所以如果你增加了配置限定符的限定符在加载使用后,设备配置发生了变化,理应当根据新的变化从新加载。关于如何动态获取设备配置的变化,读者可自行参考开发文档“Handing Runtime Changes”。

3、如果有相同资源想在不同配置下使用,请不好很落伍的将资源拷贝然后放在增加了不同限定符的文件夹下。这不仅会显得你很不fashion,也会浪费存储空间。Android提供了方法可在不同文件夹下通过xml配置文件指定到默认文件夹中的一个资源文件,所以你只需要一份资源文件放在默认文件夹中再在不同限定符的文件夹中通过编写xml配置文件来指定你用的是哪个资源文件。

4、如果想用好该特性,请读者仔细阅读相关开发文档“Providing Resources”。避免各种不fashion的做法。

原创粉丝点击