建立支持多种屏幕尺寸的Android应用

Android涉及各类各样的支持不一样屏幕尺寸和密度的设备。对于应用程序,Android系统经过设备和句柄提供了统一的开发环境,大部分工做是校订每个应用程序的用户界面到它显示的屏上。与此同时,系统提供APIs容许你控制应用界面为特定的屏幕尺寸和密度,为不一样屏幕的配置提供最优化的用户界面设计。例如,你可能会要一个平板电脑的用户界面,这不一样于手机的用户界面。html

虽然系统能缩放,调整其尺寸,以使应用软件工做在不一样屏上,可是应该尽可能优化应用软件适应不一样的屏幕尺寸和密度。为此,对全部设备的用户体验应最大化且应让用户们相信应用软件是真正为他们的设备设计的,而不是简单的拉伸使屏适合他们的设备。android

按照文中描述的作法,经过使用一个apk文件,能够建立一个应用软件能恰当显示并在全部的支持屏配置中提供最优用户体验。

* 注* :在此文中假设应用程序是为android 1.6(API level为4)或者更高的Android系统设计的。若是应用程序支持android 1.5或者更低的安卓系统,请首先阅读Strategies for Android 1.5章节。express

Also, be aware that Android 3.2 has introduced new APIs that allow you to more precisely control the layout resources your application uses for different screen sizes. These new features are especially important if you're developing an application that's optimized for tablets. For details, see the section about Declaring Tablet Layouts for Android 3.2.windows

多屏支持概述

本节提供了Android支持多屏的概述,包括:介绍了本文中API用到的术语和概念,总结了系统支持的屏设置,概述了API和下面的屏幕兼容特性。app

术语和概念

屏幕尺寸框架

:实际的物理尺寸,是按照屏幕的对角线计量的。less

:为简单起见,Android把全部的屏幕尺寸划分为四种广义的尺寸:小、标准、大,特大号。ide

屏幕密度函数

:屏幕占据的物理区域所含像素的个数;一般被称为dpi(每英寸点数).工具

:例如在给定的物理区域中,与“标准的”或“高”密度屏幕相比,低密度屏幕具备较少的像素。

方向

:屏幕的方向来自于用户的角度。这是横向或纵向,分别指屏幕各个角度的比例,而不是宽或高。须要注意的是,不只不一样的设备在不一样方向运行,并且当用户旋转设备时,方向也同时在改变。

分辨率

:屏幕上物理像素的总数。支持多屏时,应用程序不直接与分辨率有关,应用程序应该只关心屏幕的尺寸和密度,用指定的广义的尺寸和密度组。

dp

:一种有效的在定义UI布局时你应当使用的像素单位,以一种密度无关的方式表示布局的尺寸或者位置。

:dp至关于160dpi屏幕,它是系统为“中等的”密度屏设定的基准密度。同时,系统透明地处理任何一种dp单位,必要时,基于使用中的屏的实际密度。dp单位根据公式 px = dp * (dpi / 160)简单地转化为屏像素。例如,一个240dpi的屏幕,1 dp等于1.5个物理像素。定义应用程序的UI时,你应该老是使用dp单位,以确保在不一样密度的屏幕上正确地显示你的UI。

支持的屏幕范围

从Android1.6(API等级为4)开始,Android提供了支持多个屏幕的尺寸和密度,代表一种设备拥有许多不一样的屏幕配置。你应该利用Android系统的这些特性去为每个屏幕配置优化你的应用程序界面,而且应确保你的应用程序不只能正常运行,并且应尽量地在每个屏幕上提供最好的用户体验。

为了简化为多个屏的用户界面设计方式,Android系统将实际的屏幕尺寸和密度范围划分为:

  • 一组广义的尺寸:小,标准,大,特大号。
  • 注* :从Android3.2(API等级为13)起,这些尺寸分组已被弃用,你们支持的是一种新的基于可用屏幕宽度的管理屏幕尺寸的技术。若是你正在开发Android3.2或者更高版本,参见Android3.2平板电脑布局章节获取更多信息。

  • 一组四个广义的密度:ldpi (低), mdpi (中等), hdpi (高),和 xhdpi (超高)。

这种广义的尺寸和密度是围绕一种基准的配置进行划分的,这种基准的配置是指一个标准尺寸和mdpi (中等)密度。这个基线是基于第一个Android 上电设备,T-Mobile G1的屏幕配置,它具备HVGA屏幕(直到Android1.6,这是Android支持的惟一的屏幕配置)。

每一个广义的尺寸和密度跨越一套实际屏幕尺寸和密度。例如,当用手测量时,两种标准的屏幕尺寸的设备可能具备实际的稍微不一样的屏幕尺寸和纵横比。一样,两种hdpi屏幕密度的设备可能包含稍微不一样的实际像素密度。Android制造这些差别使应用程序抽象化,因此,你能够提供设计的UI给广义的尺寸和密度,必要时让系统处理任何最后的调整。图1 阐明了不一样的尺寸和密度被如何大体归类到不一样的尺寸和密度组。

http://developer.android.com/images/screens_support/screens-ranges.png

图1 阐明了不一样的尺寸和密度被如何大体归类到不一样的尺寸和密度组

当为不一样的屏幕尺寸设计UI时,会发现每一个设计须要最低限度的空间。所以,上面提到的每个广义的屏幕尺寸都有系统定义的相关联的最小分辨率。这些最小尺寸在“dp”单位内,当设计布局时,应当使用相同的单位。

  • 超大屏幕至少960dp x720dp
  • 大屏幕至少640dp x480dp
  • 标准屏幕至少470dp x320dp
  • 小屏幕至少426dp x320dp
  • 注* :在Android3.0以前,这些最小屏幕尺寸没有很好的定义,因此可能会遇到一些在标准和大之间被错误归类的设备。这些也是基于屏幕的物理分辨率,所以各类不相同的设备也会遇到前面的问题。例如,一个有系统栏的1024x720平板会留少一点可用的空间给应用程序。

为了优化应用程序的UI适应不一样的屏幕尺寸和密度,能够提供任何广义的尺寸和密度替代资源。通常来讲,应当提供替代布局给不一样屏幕尺寸和替代的位图图像给不一样的屏幕密度。在运行时,基于当前设备屏幕的广义的尺寸或密度,系统会为你的应用程序使用适当的资源。

没有必要提供替代资源给每一个屏幕尺寸和密度的组合。系统提供了强大的兼容特性,这些特性会处理大部分工做使你的应用程序呈如今任何设备的屏幕上,前提是已经经过使用容许它适当地调整尺寸的技术实现了UI(正以下面最佳实践中描述的)。

* 注* :定义一种设备的广义的屏幕尺寸和密度特性是彼此相互独立的。例如,一种WVGA高密度屏幕被认为是标准尺寸的屏幕,是由于它的物理大小与T-Mobile G1(Android的第一个设备和基准屏幕设置)大约相同。另外一方面,一种 WVGA中等密度的屏幕被认为是大尺寸的屏幕。尽管它有相同的分辨率(相同数量的像素),这种WVGA中等密度的屏幕有更低的屏幕密度,意思是每一个像素比较大,所以,整个屏幕比基准(标准尺寸)屏幕要更大。

密度无关性

当应用程序保留了用户界面元素的物理尺寸以不一样的密度显示在屏幕上(从用户的角度来看)时,它实现了“密度无关性”。
维护密度无关系性很重要,由于,若是没有它,一个UI元素(如按钮)在一个低密度屏幕上看起来较大而在一个高密度屏幕上看起来很小。这样的密度相关的尺寸的改变影响应用程序的布局和使用。图2和图3 分别展现了当它不提供密度无关性和提供了密度无关性时,应用程序之间的差别。

http://developer.android.com/images/screens_support/density-test-bad.png

图2 当不提供密度无关性,应用程序在低、中等、高密度屏幕上显示实例

http://developer.android.com/images/screens_support/density-test-good.png

图3 当提供密度无关性,应用程序在低、中等、高密度屏幕上显示实例

Android系统经过如下两种方式帮助应用程序实现密度无关性:
* 系统为当前屏幕密度调整dp单位到适当的值
* 若有必要,系统会根据当前屏幕密度调整绘图资源到适当的尺寸
在图2中,文本视图和位图绘图有规定的尺寸的像素(像素单位),所以这些视图在低密度屏幕上看起来较大,在高密度屏幕上看起来较小。这是由于尽管实际的屏幕尺寸是同样的,可是高密度屏每英尺有较多的像素(相同数量的像素适合于较小区域)。在图3中,布局的尺寸被指定为密度无关性像素(dp 单位)。由于密度无关性像素的基线是中等密度的屏幕,一个有中等密度屏幕的设备看上去与图2中的同样。对于低密度和高密度屏幕而言,无论怎样,系统能分别下降、调高密度无关性像素的值去恰当地适应屏幕。
在大多数状况下,你能够简单地在密度无关性像素里(dp 单位)指定全部的布局尺寸或者恰当地“包装内容”来确保应用程序的密度无关性。而后系统会根据恰当的缩放因子为当前屏幕密度调整位图视图以适当的尺寸显示出来。
可是,位图缩放会致使图片模糊,如上面的截图。为了不这些问题,应该为不一样的密度提供替代位图资源。例如,应该给高密度屏幕提供更高分辨率的位图,系统会使用它们,而不是使用为中等密度屏幕设计的缩放位图。如下段落将介绍更多关于如何提供不一样替代资源给不一样的屏幕配置。

如何支持多屏

Android支持多屏的基础是它可以以适当的方式为当前屏幕设置管理应用程序的布局和位图绘图的渲染。根据实际状况,系统经过缩放布局去适应屏幕的尺寸/密度和为屏幕密度缩放位图绘图,处理大部分工做去适当地渲染应用程序到每个屏幕配置。然而,为了更好地处理不一样屏幕配置,应该:
* * 在清单文件中明确申明应用程序支持哪一种屏幕大小*

经过申明应用程序支持哪一种屏幕尺寸,能够确保只有支持的屏幕尺寸的设备才能下载应用程序。声明支持不一样屏幕尺寸也会影响系统如何在较大屏幕上运行应用程序,尤为是,不论应用程序是否运行在屏幕兼容模式。
为了申明应用程序支持的屏幕大小,应该在manifest文件中包含的元素。

  • * 为不一样的屏幕尺寸提供不一样的布局*

默认状况下,Android会从新调整应用布局去适合当前设备屏幕。在大多数状况下,这样作很好。在其它状况下,UI可能看上去不太好且可能不一样屏幕尺寸须要调整。例如,在较大屏幕上,可能会调整某些元素的位置和尺寸去充分利用额外的屏幕空间,或者在一个较小屏幕上,会调整尺寸使得一切均可以在屏幕上显示。
能够提供指定大小资源的配置限定符,有小、标准、大、超大。例如,一个超大屏幕的布局应该选Xlarge。
从Android3.2(API等级为13)起,上面的尺寸分组已被弃用,你应该使用swdp配置限定符去定义布局资源须要的最小的可用的宽度。例如,若是多窗格平板布局须要至少600dp的屏幕宽度,应该选sw600dp。使用新技术申明布局资源将会在Declaring Tablet Layouts for Android 3.2章节讨论。

  • * 为不一样的屏幕密度提供不一样的位图绘图*

默认状况下,Android调整你的位图绘图(.png, .jpg, and .gif 文件)和9补丁绘图(.9.png 文件),让他们在每一个设备上以适当的物理尺寸呈现。例如,你用程序只为基线、中等屏幕密度(mdpi)提供了位图绘图,系统会调高高密度屏幕,下降低密度屏幕。这些调整会致使图片不真实。为了确保图片看起来最好,应当在不一样分辨率下包含替代版本去适应不一样的屏幕密度。能够用来指定密度资源的配置限定符有ldpi(低)、mdpi (中等), hdpi (高), and xhdpi (超高)。例如,高密度屏幕的位图应该选hdpi。
尺寸和密度配置限定符与上面的支持的屏幕范围中描述的广义尺寸和密度一致。

注释:若是你不太熟悉配置限定符且不知道系统如何使用他们应用替代资源的话,请阅读Providing Alternative Resources章节获取更多信息。
在运行时,对于任何给定的资源,系统经过如下步骤实如今当前屏幕上获取最佳的显示:

1.系统使用适当的替代资源

基于当前屏幕的尺寸和密度,系统会使用应用程序里的任何指定尺寸和密度的资源。例如,若是设备有一个高密度屏幕且应用程序请求绘图资源时,,系统会在绘图资源目录寻找最匹配的设备配置。依赖于其余可用的替代资源,一个有hdpi限定符的资源目录(如 drawable-hdpi)多是最匹配的,所以系统使用这个目录中的绘图资源。

2.若是没有匹配的资源可用,系统会使用默认资源且会调高或下降资源去匹配当前屏幕的尺寸和密度这些“默认”资源是指那些没有配置限定符标记的资源。例如在drawable/中的资源就是默认的绘图资源。系统假定默认资源是为基准屏幕尺寸和密度设计的,即标准屏幕尺寸和中等密度。例如,系统会恰当地为高密度屏幕调高默认密度资源,为低密度屏幕下降默认资源。

然而,当系统在寻找一个指定密度的资源且在指定密度目录没找到它时,它不会老是使用默认资源。为了获取更好的效果,系统会使用一个其余指定密度资源。例如,当系统在寻找一个低密度资源且这个资源是不可用时,系统更喜欢下降高密度版本的资源,由于系统能够简单地乘以0.5系数将高密度资源下降为低密度,与调整中等密度资源乘以0.75系数相比,这样用到不多的工件。

关于Android是如何经过匹配配置限定符到设备配置来选择替代资源的更多信息,请阅读How Android Finds the Best-matching Resource章节。

使用配置限定符

Android支持多种配置限定符,让你控制系统如何基于当前设备屏幕的特征选择替代资源。一个配置限定符是一个字符串,你能够把它附加到你的Android工程的资源目录中并指定里面的资源是为此配置设计的。

为了使用配置限定符:

1.在你的工程的res目录建立一个新目录,并使用格式命名:
:-
:是标准的资源名称(如drawable or layout)。
:是下面表1中的配置限定符,指定这些资源将要被用的屏幕配置(如hdpi or xlarge)。

2.保存这些适当的指定配置的资源到这个新目录。这些资源文件的命名必须严格与默认的资源文件名同样.

例如,xlarge是用于超大屏幕的配置限定符。当你添加这些字符串到一个资源目录名(如layout-xlarge)时,它告诉系统这些资源将被用到有超大屏幕的设备上。

表1 容许你提供指定资源给不一样屏幕配置的配置限定符

{|style="border-spacing: 0px;margin: 4px 4px; width: 90%; border-left:1px solid #ccc;border-top:1px solid #ccc; "


|-style="background:#DEE8F1; "
! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px" | Screen characteristic
! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px" | Qualifier
! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px" | Description


|- style=" vertical-align:top;" 
| style=" border-right:1px solid #ccc;border-bottom:0px solid #ccc; padding:5px 15px; " | 
Size
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
small
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
Resources for small size screens

|- style=" vertical-align:top;" 
| style=" border-right:1px solid #ccc;border-bottom:0px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
normal
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
Resources for normal size screens. (This is the baseline size.)

|- style=" vertical-align:top;" 
| style=" border-right:1px solid #ccc;border-bottom:0px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
large
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
Resources for large size screens.

|- style=" vertical-align:top;" 
| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
xlarge
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
Resources for extra large size screens


|- style=" vertical-align:top;" 
| style=" border-right:1px solid #ccc;border-bottom:0px solid #ccc; padding:5px 15px; " | 
Density
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
ldpi
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
Resources for low-density (ldpi) screens (~120dpi).

|- style=" vertical-align:top;" 
| style=" border-right:1px solid #ccc;border-bottom:0px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
mdpi
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
Resources for medium-density (mdpi) screens (~160dpi). (This is the baseline density.)

|- style=" vertical-align:top;" 
| style=" border-right:1px solid #ccc;border-bottom:0px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
hdpi
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
Resources for high-density (hdpi) screens (~240dpi).

|- style=" vertical-align:top;" 
| style=" border-right:1px solid #ccc;border-bottom:0px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
xhdpi
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
Resources for extra high-density (xhdpi) screens (~320dpi).

|- style=" vertical-align:top;" 
| style=" border-right:1px solid #ccc;border-bottom:0px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
nodpi
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
Resources for all densities. These are density-independent resources. The system does not scale resources tagged with this qualifier, regardless of the current screen's density.

|- style=" vertical-align:top;" 
| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
tvdpi
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
Resources for screens somewhere between mdpi and hdpi; approximately 213dpi. This is not considered a "primary" density group. It is mostly intended for televisions and most apps shouldn't need it—providing mdpi and hdpi resources is sufficient for most apps and the system will scale them as appropriate. If you find it necessary to provide tvdpi resources, you should size them at a factor of 1.33* mdpi. For example, a 100px x 100px image for mdpi screens should be 133px x 133px for tvdpi.


|- style=" vertical-align:top;" 
| style=" border-right:1px solid #ccc;border-bottom:0px solid #ccc; padding:5px 15px; " | 
Orientation
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
land
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
Resources for screens in the landscape orientation (wide aspect ratio).

|- style=" vertical-align:top;" 
| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
port
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
Resources for screens in the portrait orientation (tall aspect ratio).


|- style=" vertical-align:top;" 
| style=" border-right:1px solid #ccc;border-bottom:0px solid #ccc; padding:5px 15px; " | 
Aspect ratio
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
long
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
Resources for screens that have a significantly taller or wider aspect ratio (when in portrait or landscape orientation, respectively) than the baseline screen configuration.

|- style=" vertical-align:top;" 
| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
notlong
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
Resources for use screens that have an aspect ratio that is similar to the baseline screen configuration.

|}

注:若是在Android3.2或者更高版本上开发应用程序,请参阅Declaring Tablet Layouts for Android 3.2章节获取关于新的配置限定符的信息,当申明了指定屏幕尺寸(而不是使用表1中的尺寸限定符的布局资源时,你应当使用这些限定符。

获取更多关于这些限定符如何大体对应于真实的屏幕尺寸和密度的信息,请参阅本文中前面提到的支持的屏幕范围章节。

例如,下面是应用程序中的资源目录列表,这个程序为中等、高及超高密度屏幕提供了不一样的为不一样屏幕尺寸和位图绘图设计的布局。
res/layout/my_layout.xml // 标准屏幕尺寸的布局("默认")
res/layout-small/my_layout.xml // 小屏幕尺寸的布局
res/layout-large/my_layout.xml // 大屏幕尺寸的布局
res/layout-xlarge/my_layout.xml //超大屏幕尺寸的布局
res/layout-xlarge-land/my_layout.xml // 横向超大的屏幕布局

res/drawable-mdpi/my_icon.png // 中等密度的位图
res/drawable-hdpi/my_icon.png //高密度的位图
res/drawable-xhdpi/my_icon.png // 超高密度的位图

如须要更多关于如何使用替代资源和完整的配置限定符列表(不只仅是屏幕配置)的信息,请参阅Providing Alternative Resources。

请注意,当Android系统挑选资源时,它采用必定的逻辑来断定“最匹配”资源。也就是说,使用的限定符不必在全部状况下,为了系统能用到它而严格匹配当前屏幕配置。具体来讲,当基于尺寸的限定符选择资源时,若是没有更匹配的资源,系统会使用比当前屏幕更小的屏幕资源(例如,必要时,大尺寸屏幕将会使用标准尺寸屏幕资源)。可是,若是惟一可用的屏幕资源比当前屏幕大,系统将不会使用它们,并且若是没有其余匹配设备的配置的话,应用程序将会崩溃(例如,若是全部布局资源都被标记为xlarger限定符,可是设备是一个标准尺寸的屏幕)。更多关于系统如何选择资源的信息,请阅读How Android Finds the Best-matching Resource章节。

小提示:若是你有一些系统从未调整过的绘图资源(或许由于在运行时对其进行了调整),应当把他们放置在nodpi配置个限定符的目录。有这些限定符的资源被认为是密度不可知的资源,系统将不会调整它们。

设计可替代的布局和绘图

应该建立的可替代资源的类型取决于应用程序的须要。一般,应该使用尺寸和方向限定符提供可替代的布局资源,使用密度限定符去提供替代的位图绘图资源。
下面的段落分别总结了应该如何使用尺寸和密度限定符来提供替代的布局和绘图。

可替代的布局

通常状况下,一旦在不一样屏幕配置上测试应用程序,应该知道是否须要为不一样屏幕尺寸建立可替代的布局。例如:

  • 当在小屏幕上测试时,可能会发现,布局不是很适合这个屏幕。例如,一排按钮可能不适合在小屏幕的设备的屏幕宽度内。这种状况下,应该为小屏幕提供一种可替代的布局,即经过调整这些按钮的大小或位置。

  • 当在超大屏幕上测试时,可能会意识到,布局并无有效地利用大屏幕,而是经过拉伸来填充它。在这种状况下,应该为超大屏幕提供一种可替代的布局,便可经过提供一种从新设计的最合适于较大屏幕如平板的UI。
    虽然应用程序应当能够在没有可替代布局的大屏幕上工做正常,可是,对用户来讲,程序看起来好像是专门为他们的设备设计的这一点很是重要。若是是很明显被拉伸的UI,用户对应用程序体验会更加不满意。

  • 并且,当在横向测试时可能会注意到,与纵向相比较,放置在纵向屏幕底部的UI元素应该是在横向屏幕的右侧。

简而言之,应该确保应用程序的布局:
* 适合在小屏幕上(这样用户真正使用应用程序)
* 优化大屏幕,充分利用额外的屏幕空间
* 优化横向和纵向两个方向

若是在系统调整了布局后,UI要使用合适大小的位图(如按钮的背景图片),应当使用九补丁的位图文件。九补丁文件基本是一个指定的可拉伸的二维PNG文件。当系统须要调整正在使用的位图的视图时,系统会拉伸九补丁位图,但仅延伸指定区域。一样地,没有必要提供不一样的绘图给不一样的屏幕尺寸,由于九补丁位图能调整任何大小。然而,应当提供可替代的九补丁文件的版本给不一样屏幕密度。

可替代的绘图

几乎每一个应用程序应该有对应于不一样屏幕密度的可替代的绘图资源,由于几乎每一个应用程序都有一个启动图标,并且图标应该在全部屏幕密度上看起来都很好。一样,若是在应用程序中包含了其余位图绘图(如菜单图标或应用程序的其余图像),应当提供可替代的版本或者每个版本给不一样的密度。

注:只须要给位图文件((.png, .jpg, or .gif)和九补丁文件(.9.png)提供指定密度的绘图。若是你使用XML去定义形状,颜色或者其余绘图资源,应该在默认的绘图目录(drawable/)作一个备份。

http://developer.android.com/images/screens_support/screens-densities.png

图4支持每一个密度的位图绘图的相对尺寸

为了给不一样密度建立可替代的位图绘图,应该遵循基于四种广义密度的3:4:6:8的缩放比例。例如,你有一个48x48像素的中等密度屏幕的位图绘图(一个启动图标的尺寸),全部不一样的尺寸应该是:

  • 36x36适合于低密度
  • 48x48适合于中等密度
  • 72x72适合于高密度
  • 96x96适合于超高密度

获取更多关于设计图标的信息,请参阅the Icon Design Guidelines,文中包含了各类位图绘图的尺寸信息,如启动图标,菜单图标,状态栏图标,选项卡图标等等。

Android3.2平板布局的声明

对于第一代运行在Android3.0上的平板,正确声明平板布局的方法是把他们放到一个有xlarge配置限定符的目录里(例如,res/layout-xlarge/)。为了适应其余类型的平板和屏幕尺寸-尤为是7寸平板-Android3.2为更多离散的屏幕尺寸引进了一种新的指定资源的方式。这项新技术是基于你的布局须要的空间(如600dp的宽度),而不是试图让你的布局去适合广义的尺寸组(如large or xlarge)。

设计7寸平板的缘由是很是复杂的,当时使用广义的尺寸组是指一个7寸的平板在技术上与一个5寸的手机在同一个组(大组)。虽然这两个设备在尺寸上看上去很接近,可是应用程序的UI的空间是显著不一样的,用户交互的风格也是如此。所以,一个7寸和5寸的屏不该该老是使用同一个布局。为了把提供两种不一样屏的布局变成可能,Android如今容许你基于宽度与/或者高度指定布局资源,在dp单位中指定,这对于应用程序布局颇有效。

例如,在已经设计好了要用于平板类型的设备的布局后,当屏幕少于600dp宽时,可能会决定让布局中止工做。这个阈值所以会成为平板布局须要的最小尺寸。照此,如今会指定这些布局资源应当能被使用,仅仅在应用程序的UI有至少600dp宽度可用时。

应该要么选择宽度,并把它设计为最小尺寸,要么测试布局一旦完成时,它支持的最小宽度是多少。

注:请记住,全部的这些新尺寸的APPs使用的数字都是密度无关性像素(dp)值,且布局的维度应该老是被定义使用dp单位,由于关心的是,系统占用屏幕密度后可用屏幕空间的数量。更多关于密度无关性像素的信息,请阅读文中前面提到的Terms and concepts。

新的尺寸限定符的使用

不一样可以指定的基于布局的可用空间的资源配置的总结见表2。与传统的屏幕尺寸组(小、标准、大和超大)相比,这些新的限定符提供了更多的控制权在指定的应用程序支持的屏幕尺寸方面。

注:指定的使用这些限定符的尺寸不是实际的屏幕尺寸。相反,在dp单位中的宽度或高度的尺寸对你的activity的窗口是可用的。Android系统可能会使用一些屏幕作系统UI(如屏幕底部的系统栏或顶部的状态栏),因此一些屏幕有可能对于你的布局是不可用的。所以,你申明的尺寸应该是,特别是你的activity须要的尺寸-当申明了系统能提供给你的布局多少空间时,系统会占用任何被系统UI使用的空间。还须要注意的是,工具栏被认为是应用程序窗口空间的一部分,尽管你的布局没有申明,所以,系统会给布局缩减可用空间,在设计时必须考虑到这点。

表2 屏幕尺寸的新配置限定符(Android 3.2中介绍的)

{|style="border-spacing: 0px;margin: 4px 4px; width: 90%; border-left:1px solid #ccc;border-top:1px solid #ccc; "


|-style="background:#DEE8F1; "
! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px" | Screen configuratione
! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px" | Qualifier values
! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px" | Description


|- style=" vertical-align:top;" 
| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
smallestWidth
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
swdp

Examples:
sw600dp
sw720dp
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
The fundamental size of a screen, as indicated by the shortest dimension of the available screen area. Specifically, the device's smallestWidth is the shortest of the screen's available height and width (you may also think of it as the "smallest possible width" for the screen). You can use this qualifier to ensure that, regardless of the screen's current orientation, your application's has at least dps of width available for it UI.

For example, if your layout requires that its smallest dimension of screen area be at least 600 dp at all times, then you can use this qualifer to create the layout resources, res/layout-sw600dp/. The system will use these resources only when the smallest dimension of available screen is at least 600dp, regardless of whether the 600dp side is the user-perceived height or width. The smallestWidth is a fixed screen size characteristic of the device; the device's smallestWidth does not change when the screen's orientation changes.

The smallestWidth of a device takes into account screen decorations and system UI. For example, if the device has some persistent UI elements on the screen that account for space along the axis of the smallestWidth, the system declares the smallestWidth to be smaller than the actual screen size, because those are screen pixels not available for your UI.

This is an alternative to the generalized screen size qualifiers (small, normal, large, xlarge) that allows you to define a discrete number for the effective size available for your UI. Using smallestWidth to determine the general screen size is useful because width is often the driving factor in designing a layout. A UI will often scroll vertically, but have fairly hard constraints on the minimum space it needs horizontally. The available width is also the key factor in determining whether to use a one-pane layout for handsets or multi-pane layout for tablets. Thus, you likely care most about what the smallest possible width will be on each device.


|- style=" vertical-align:top;" 
| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
Available screen width
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
wdp

Examples:
w720dp
w1024dp
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
Specifies a minimum available width in dp units at which the resources should be used—defined by the value. The system's corresponding value for the width changes when the screen's orientation switches between landscape and portrait to reflect the current actual width that's available for your UI.

This is often useful to determine whether to use a multi-pane layout, because even on a tablet device, you often won't want the same multi-pane layout for portrait orientation as you do for landscape. Thus, you can use this to specify the minimum width required for the layout, instead of using both the screen size and orientation qualifiers together.


|- style=" vertical-align:top;" 
| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
Available screen height
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
hdp

Examples:
h720dp
h1024dp
etc. 
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |
Specifies a minimum screen height in dp units at which the resources should be used—defined by the value. The system's corresponding value for the height changes when the screen's orientation switches between landscape and portrait to reflect the current actual height that's available for your UI.

Using this to define the height required by your layout is useful in the same way as wdp is for defining the required width, instead of using both the screen size and orientation qualifiers. However, most apps won't need this qualifier, considering that UIs often scroll vertically and are thus more flexible with how much height is available, whereas the width is more rigid.
|}

虽然使用这些限定符看上去比使用屏幕尺寸组更加复杂,可是当你一旦肯定UI的需求后,这实际上应当更简单。当设计UI时,可能关心的主要事情是,应用程序在手机类型的UI和多窗格的平板类型的UI之间切换时的实际尺寸。切换的关键在于特定的设计,也许须要720dp的宽度给平板布局,也许600dp已足够,或者480dp,或者其余位于这之间的数值。使用表2中的限定符,须要掌握布局改变时的精确尺寸。

更多关于这些尺寸配置限定符的讨论,请参阅Providing Resources文档。

配置实例

为了帮助实现一些为不一样类型的设备设计的目标,下面是一些典型的屏幕宽度的数值:

  • 320dp:一种典型的手机屏幕 (240x320 ldpi, 320x480 mdpi, 480x800 hdpi, 等等).
  • 480dp: 一种有点像条纹的中间态的平板 (480x800 mdpi).
  • 600dp: 7寸平板 (600x1024 mdpi).
  • 720dp: 10寸平板 (720x1280 mdpi, 800x1280 mdpi, etc).

使用表2中的这些尺寸限定符,应用程序能够在使用任何想要的宽度或高度的平板和手机的不一样布局资源间切换。例如,若是平板布局支持的最小可用宽度是600dp,应该提升两套布局:

res/layout/main_activity.xml # 手机适用

res/layout-sw600dp/main_activity.xml #平板适用

在这种状况下,为了使平板布局能用,可用的屏幕空间的最小宽度必须是600dp。

对于其余状况,你要进一步自定义你的UI以区分如7寸和10寸平板的尺寸,能够定义额外的最小宽度布局:

res/layout/main_activity.xml # 适用于手机 (小于600dp的可用宽度)

res/layout-sw600dp/main_activity.xml #适用于7寸平板(大于等于600dp的可用宽度)

res/layout-sw720dp/main_activity.xml # 适用于10寸平板(大于或等于720dp的可用宽度)

请注意,第二套采用的“可用的宽度”限定符wdp。经过这种方式,一个设备可能实际上使用两种布局,这取决于屏幕的方向(若是在一个方向上可用的宽度是至少600dp,在另外一个方向上少于600dp)。

若是关心的是可用高度,能够一样使用hdp限定符。或者,若是状况比较特殊,甚至能够结合wdp 和 hdp一块儿使用。

支持屏幕尺寸的声明

一旦已经实现了不一样屏幕尺寸的布局,在manifest文件中声明应用程序支持哪一种屏幕也一样重要。

随同新的屏幕尺寸的配置限定符一块儿,Android3.2引进了新的 manifest元素属性。

android:requiresSmallestWidthDp

:指定须要的最小smallestWidth。smallestWidth是必须能被应用程序的UI利用的屏幕空间的(在dp单位里)最小尺寸。也就是,最短的可用的屏幕的二维尺寸。所以,为了让设备与应用程序兼容,设备的smallestWidth必须大于等于这个值。(一般,不论屏幕当前的方向是什么,你提供的值是你的布局支持的“最小宽度”。

:例如,若是应用程序是为600dp的最小可用宽度的平板类型设备设计的:

...

:然而,若是应用程序支持全部Android支持的屏幕尺寸(如426dp x 320dp同样小),那么没有必要申明这个属性,由于须要的最小宽度可能在任何设备上都是最小的。

注意:Android并不关心这个属性,所以它不会影响应用程序在运行时的行为。相反,它经常会为应用程序在服务如谷歌播放上进行过滤。然而,谷歌播放目前不支持过滤属性(在Android3.2上),所以,若是应用程序不支持小屏幕,应该继续使用其它尺寸的属性。

android:compatibleWidthLimitDp

:这个属性容许经过指定应用程序支持的最大“最小宽度”将屏幕的兼容模式做为一个用户可选特征。若是设备的可用屏幕最小边大于这个值,用户仍然能够安装应用程序,可是不能在屏幕的兼容模式上运行。默认状况下,屏幕的兼容模式是禁用的,和日常同样,布局会被调整到适合屏幕,可是按钮在系统栏是可用的,它容许用户开启和关闭屏幕的兼容模式。

注:若是应用程序的布局正好适合大屏幕,就不必使用这个属性。咱们建议避免使用这个属性,而不是按照本文档中的建议确保布局适合更大屏幕。

android:largestWidthLimitDp

:这个属性经过指定你的应用程序支持的最大“最小宽度”强制开启屏幕的兼容模式,若是设备的可用屏幕最小边大于这个值,应用程序会运行在屏幕兼容模式上,且用户没有办法去禁用它。

注:若是应用程序的布局正好适合大屏幕,就不必使用这个属性。咱们建议避免使用这个属性,而不是按照本文档中的建议确保你的布局适合更大屏幕。

注意:当在Android3.2或者更高版本上开发时,不该该使用较旧的屏幕尺寸属性并结合上面列出的属性。同时使用新属性和较旧的尺寸属性会致使不可预料的事情发生。

更多关于这些属性的信息,请查阅以上相应的连接。

最佳实践

支持多个屏幕的目的是为了建立一个能正常运行,且在任何Android支持的广义的屏幕配置上看起来都很舒服的应用程序。本文的前面章节提供了关于Android如何使应用程序适应屏幕配置和如何在不一样屏幕配置上自定义应用程序的外观的信息。这节提供了一些额外的技巧来确保应用程序适用于不一样屏幕配置的技术。

下面是关于如何确保你的应用程序可以恰当地显示在不一样屏幕上的快速检查清单:

1.当在XML布局文件中指定尺寸时,使用wrap_content, fill_parent, 或者dp单位

2.在应用程序代码中不要使用硬编码的像素值

3.不要使用绝对布局(已被弃用)

4.对不一样的屏幕密度采用可替代的位图绘图

下面章节将讲述更多细节。

  • 1.布局尺寸使用wrap_content, fill_parent, 或者 dp单位*

当在XML布局文件中定义视图的android:layout_width和 android:layout_height时,使用wrap_content, fill_parent, 或者 dp单位以保证在当前设备屏幕上能给视图分配一个适当的尺寸。

例如,一个layout_width为100dp的视图在中等密度的屏幕上是100像素,在高密度屏幕上系统将把它调整到150dp,因而视图在屏幕上占用了大体相同的物理空间。

一样地,应该更喜欢用sp(与比例无关的像素)来定义文本的尺寸。Sp比例因子取决于用户的设置和系统调整的尺寸与它为dp调整的相同。

  • 2.在应用程序代码中不要使用硬编码的像素值*

出于性能方面的缘由及为了保持代码更简单,Android系统采用像素做为尺寸或坐标值的标准单位。意思是,在代码中,视图的尺寸老是用像素表达,但总基于当前屏幕密度。例如,若是myView.getWidth()函数的返回值是10,在当前屏幕上视图有10个像素宽度,可是在更高密度屏幕的设备上,返回值多是15.若是在你的应用程序代码中,使用像素值为位图的单位,且该位图不是为当前屏幕密度预先调整的,可能会调整这些在代码中你用以匹配未调整的位图源的像素值。

假设应用程序在运行时巧妙地处理位图或像素值,请参阅下面的章节Additional Density Considerations。

  • 3. 不要使用绝对布局*

不像其余的布局部件,绝对布局强制使用固定位置给子视图布局,这很容易致使用户界面不能很好地工做在不一样的屏幕上。正由于如此,在Android1.5(API等级为3)中已经弃用了绝对布局。

相反,应该使用相对布局,它会使用相对位置为它的子视图布局。例如,能够指定按钮部件应该在文本部件的右侧。

  • 4.使用尺寸和指定密度资源*

虽然系统会基于当前屏幕配置调整你的布局和绘图资源,可是能够在不一样屏幕尺寸上调整UI,且提供最优化的位图绘图给不一样密度。这在本文的前面已经反复强调过。

若是须要严格控制应用程序在各类屏幕配置上的显示状况,那么在指定配置资源目录中调整布局和位图绘图。例如,假设但愿图标显示在中等和高密度屏幕上。简单地建立两个不一样尺寸的图标(例如100x100用于中等密度,150x150用于高密度),把这两个变体放在适当的目录,使用适当的限定符:

res/drawable-mdpi/icon.png //适合于中等密度屏幕

res/drawable-hdpi/icon.png //适合于高密度屏幕

注:若是密度限定符没有定义在目录名中,系统会假定在那个目录里的资源是为基线中等密度设计的,将会适当地为其余密度作调整。

更多关于有效的配置限定符的信息,请参阅本文前面结束的Using configuration qualifiers。

附加密度的注意事项

本节描述了更多关于系统如何在不一样屏幕密度上调整位图绘图、以及如何更好地控制位图在不一样密度上的显示信息。本节中的信息对大多数应用程序应该不是很重要,除非应用程序在不一样屏幕密度上运行时或者应用程序篡改了图像时,遇到了问题。
为了更好地了解在运行过程当中改变了图像时如何作到支持多密度,应该了解,系统经过如下几种方式确保合适的位图尺寸:

1.预先调整的资源(如位图绘图)

:基于当前屏幕的密度,系统使用应用程序中任何指定尺寸和密度的资源,并显示出来且不须要任何调整。若是资源在当前密度不可用,系统将会下载默认资源并调整他们使之适合于当前屏幕密度。系统认为默认资源(无配置限定符目录的资源)是为基准屏幕密度(mdpi)设计的,除非它们是从指定密度资源目录下载的。预先调整是指调整位图到当前屏幕密度适合的尺寸时系统所作的事情。

:若是你请求预先调整好的资源的尺寸,系统会返回调整后表明该尺寸的值。例如,一个50x50 像素的mdpi屏幕的位图要在hdpi屏幕上扩大为75x75像素(若是此时没有可替代资源给hdpi),系统会这样返回此值。
:有一些状况下,可能不须要Android的预先调整的资源。避免预先调整的最简单方式是将资源放置到nodpi配置限定符的目录中。例如:

:res/drawable-nodpi/icon.png

:当系统使用这个文件夹中的icon.png位图时,它不会基于当前屏幕密度去调整该位图。

2.像素尺寸和坐标值的自动调整

:应用程序能够经过在清单文件中设置android:anyDensity的属性为“假”或在程序中设置位图的inScaled值为“假”禁止预先调整资源。在这种状况下,系统在绘图时会自动调整绝对像素的坐标值和像素尺寸。这样作的目的是,为了确保已定义像素的屏幕元素仍然能以接近他们在基线屏幕密度(hdpi)上的物理尺寸显示出来。系统透明地处理这种调整并把调整后的像素尺寸,而不是物理像素尺寸告诉应用程序。

:例如,假设一个设备有WVGA高密度屏幕,即480x800,这与传统的HVGA屏幕的尺寸大约相同,可是它运行着已禁止预先调整资源功能的应用程序。在这种状况下,当系统在查找屏幕尺寸时,它会“欺骗”应用程序,给它返回值320x533(转化成屏幕密度接近mdpi)。而后,当应用程序开始绘图操做时,如使矩形从(10,10) 扩大到 (100, 100)变成无效,系统经过缩放接近数量的值调整坐标,且把区域(15,15) 扩大到 (150, 150)变成无效。若是你的应用程序直接使用这个调整后的位图,这个偏差会致使不可预期的行为,可是这被认为是合理的折中的尽量保持应用程序性能的方法。若是遇到这种状况,请阅读下面关于Converting dp units to pixel units章节。

:一般状况下,不该该禁止预先调整资源。支持多屏的最好方式是按照上面的How to Support Multiple Screens提到的基本技术操做。

若是应用程序在屏幕上以其它某种方式操做位图或与像素直接交互,你可能须要采起额外的步骤来支持不一样屏幕密度。例如,若是你经过数手指划过期的像素值的方式响应触摸,你须要使用适当的密度无关性像素值,而不是实际的像素值。

调整运行时建立的位图对象

若是应用程序建立一个内存中的位图(位图对象),系统认为这个位图是为基线中等密度屏幕设计的,默认状况下,在绘制时自动调整位图。当位图没有指定密度特性时,系统采用“自动调整”技术。若是没有正确地考虑到当前屏幕密度,也没有指定位图的密度特性,自动调整会致使人为缩放,这与没有提供可替代资源时同样。

为了控制在运行时建立的位图是否须要调整,你能够经过setDensity()指定位图的密度,从DisplayMetrics传递一个密度常量,好比DENSITY_HIGH 或 DENSITY_LOW。

若是正在建立一个使用BitmapFactory(如从文件或者流)的位图,可使用BitmapFactory。选择定义一个已经存在的位图的特性,这决定系统是否或如何调整位图。例如,可使用Density来定义位图是为哪一种密度设计的,用Scaled去指定位图是否应该调整到匹配当前设备的屏幕密度。

若是设置Scaled为假,禁用了任何系统会用于位图的预先调整功能,系统在运行时将会自动调整它。使用自动调整而不是预先调整会耗费更多CPU,可是占用更少的内存。

http://developer.android.com/images/screens_support/scale-test.png

图5 预先调整和自动调整位图的演示比较结果

图5 演示了当在高密度屏幕上下载低(120),中等(160) 和高 (240) 密度位图时,预先调整和自动调整机制的结果。区别是微妙的,由于全部的位图都被调整以匹配当前屏幕密度,然而调整过的位图的外观稍微不一样,这取决于在绘制时采用的是预先调整仍是自动调整。你会找到此示例应用程序的源代码,在ApiDemos里,演示了如何使用预调整和自动调整位图。

注:在Android3.0或者以上版本,因为图形框架的改进,预先调整和自动调整位图之间应该没有明显的差别。

转换dp单位为像素单位 在某些状况下,须要用dp来表示尺寸,而后把他们转换为像素。想象一下,在应用程序中滚动或者扔的手势在用户的手指划过至少16像素后才能被识别出。在基准屏幕上,在手势被识别出来以前,用户必须划过16像素除160dpi,这等于十分之一英寸(或者2.5毫米)。在一个高密度屏幕(240dpi)设备上,用户必须划过16像素除240dpi,即十五分之一英寸(或者1.7毫米)。这个距离至关短,所以对用户来讲,程序看上去更加敏感。

要解决这个问题,手势阈值必须用dp表示,而后转换成实际的像素。例如:

// The gesture threshold expressed in dp
private static final float GESTURE_THRESHOLD_DP = 16.0f;

// Get the screen's density scale
final float scale = getResources().getDisplayMetrics().density;
// Convert the dps to pixels, based on density scale
mGestureThreshold = (int) (GESTURE_THRESHOLD_DP * scale + 0.5f);

// Use mGestureThreshold as a distance in pixels...

根据当前屏幕密度,DisplayMetrics.density指定了你必须使用的将dp单位转为像素单位的比例因子。在一个中等密度屏幕上,DisplayMetrics.density等于1.0;在高密度屏幕上,DisplayMetrics.density等于1.5;在一个超高密度屏幕上,DisplayMetrics.density等于2.0;在低密度屏幕上,DisplayMetrics.density等于0.75.这个比例因子乘以dp单位获得的值就是当前屏幕的实际像素值(而后添加0.5f作四舍五入,转化的整数)。更多信息,请参看DisplayMetrics类。

然而,不是为这里事件定义任意阈值,而是你应该使用预先调整的可从ViewConfiguration获取的配置值。

使用预先调整的配置值

可使用ViewConfiguration类去访问Android使用的共同的距离、速度和时间。例如,框架使用的做为滚动阈值的距离可经过getScaledTouchSlop()获得:

private static final int GESTURE_THRESHOLD_DP =ViewConfiguration.get(myContext).getScaledTouchSlop();

之前缀getScaled开头的ViewConfiguration的方法保证返回值以像素为单位,不管当前屏幕的密度是什么,它都能正确显示。

如何在多屏上测试你的应用程序

在发布应用程序以前,应该在全部支持的屏幕尺寸和密度上完全地测试应用程序。Android的SDK包含了你可使用的模拟器,它复制了应用程序能够运行的通用的屏幕配置的尺寸和密度。能够修改模拟器默认的尺寸,密度和分辨率以复制任何指定屏幕的特征。使用模拟器和额外的自定义配置让你能够测试任何可能的屏幕配置,所以没必要买各类设备来测试应用程序支持的屏幕。

为了创建测试应用程序支持的屏幕环境,经过使用模拟器和模仿应用程序支持的屏幕的尺寸和密度的屏幕配置,应当建立一组AVDs(Android虚拟设备)。要作到这一点,可使用AVD管理器去建立AVDs,而后以图形界面方式启动它们。

为了启动Android SDK管理器,在Android SDK目录(在windows上)执行SDK Manager.exe或者在/tools/目录执行android。图6展现了用来测试各类屏幕配置的选择了AVDs的AVD管理器。

http://developer.android.com/images/screens_support/avds-config.png

图6展现了用来测试各类屏幕配置的选择了AVDs的AVD管理器。

更多有关建立和使用AVDs测试应用程序的信息,请参阅Managing AVDs with AVD Manager。

表3 Android SDK中从模拟器获取的各类屏幕配置和其它典型的分辨率

{|style="border-spacing: 0px;margin: 4px 4px; width: 90%; border-left:1px solid #ccc;border-top:1px solid #ccc; "


|-style="background:#DEE8F1; "
! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px" | 
! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px" | Low density (120), ldpi
! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px" | Medium density (160), mdpi
! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px" | High density (240), hdpi
! style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px" | Extra high density (320), xhdpi


|- style=" vertical-align:top;" 
| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
Small screen 
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
* QVGA (240x320)* 
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
480x640
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |


|- style=" vertical-align:top;" 
| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
Normal screen

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
* WQVGA400*

* (240x400)* 
* WQVGA432*

* (240x432)* 
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
* HVGA (320x480)* 
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
* WVGA800 (480x800)* 
* WVGA854 (480x854)* 
600x1024
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
640x960


|- style=" vertical-align:top;" 
| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
Large screen 
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
* WVGA800* * * 
* (480x800)* 
* WVGA854* * * 
* (480x854)* 
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
* WVGA800* (480x800)* 
* WVGA854* (480x854)* 
600x1024
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |

| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " |


|- style=" vertical-align:top;" 
| style=" border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
Extra Large screen 
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
1024x600
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
* WXGA(1280x800)†* 
* 1024x768* 
* 1280x768* 
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
1536x1152
1920x1152 
1920x1200
| style="border-right:1px solid #ccc;border-bottom:1px solid #ccc; padding:5px 15px; " | 
2048x1536
2560x1536 
2560x1600
|}

  • 为了模仿此配置,在建立一个使用WVGA800或者WVGA854外观的AVD时指定.自定义的密度为160.
  • * 为了模仿此配置,在建立一个使用WVGA800或者WVGA854外观的AVD时指定.自定义的密度为120 † 这个外观是Android3.0平台可用的.

想要知道支持任何给定屏幕配置的有源设备的相对数量,请参看屏幕尺寸和密度仪表板。

咱们也建议在物理尺寸接近匹配的实际设备的模拟器上测试应用程序。这使得比较各类尺寸和密度上的测试结果变得很是容易。作到这点,须要知道电脑显示器(例如,30寸的Dell显示器的密度大约为960dpi)的以dpi为单位的近似密度。当从AVD管理器启动AVD时,能够在启动选项中,如图7所示,指定模拟器的屏幕尺寸和显示器的dpi。

http://developer.android.com/images/screens_support/avd-start.png

图7 当从AVD管理器启动AVD时,你能设置的尺寸和密度

若是想在内置外观不支持的分辨率或密度的屏幕上测试应用程序,能够建立一个使用自定义分辨率或密度的AVD。在建立AVD时,应指定分辨率,而不是选择内置的外观。

若是正经过命令行启动AVD,能够指定经过选项参数-scale来指定比例。例如:

emulator -avd -scale 96dpi

为了改变模拟器的大小,能够经过参数选项选择想要的比例因子0.1-3实现。

更多关于从命令行建立AVDs的信息,请参阅Managing AVDs from the Command Line。

 

原文连接:http://developer.android.com/guide/practices/screens_support.html

相关文章
相关标签/搜索