Android支持多屏幕(1)Overview of Screen Support
转载请注明来自:http://blog.csdn.net/liaoqianchuan00/article/details/23625719
翻译自:http://developer.android.com/guide/practices/screens_support.html
Android运行在各种不同屏幕大小和密度的设备上。对于应用程序来说,不同的设备,Android系统都提供了一致的开发环境,并且已经为我们处理了很多在不同屏幕校准UI显示的工作。同时,系统还提供了API来让你控制你的程序在一些特殊屏幕大小和密度的设备上的显示。比如,你想为平板和手机提供不同的UI显示。
虽然对于不同的屏幕,系统都可以自动缩放和调整你的UI,但是你也应该尽量的优化你的应用程序去适应不同的大小和密度。这样,对于所有的设备都由很好的用户体验,让用户觉得这个UI就是专门为他们的设备设计的------而不是简单的拉伸来适应他们的设备。
按照这个文档描述的来做,你就可以用单独的一个APK文件设计出显示正确,并且用户体验很好的,适应所有屏幕的程序。
注意:这个文档的信息都是基于假设你的应用程序是基于Android1.6及以上版本的。
并且对于Android3.2,提供了一些新的API来让你对不同的屏幕可以更精确的控制布局资源。对于你开发一个支持平板的程序来说,这些新的功能很重要。这些功能将在本文后面讲到。
Overview of Screens Support
这一节讲述了支持多屏幕的概要,包括:一些术语和理论,简要介绍系统支持的屏幕配置,API概要和屏幕兼容性。
Terms and concepts
Screen size(屏幕大小)
实际的物理尺寸,以屏幕对角线来度量。为了简单,Android将所有的屏幕尺寸分成4中:small,normal,large,和extralarge。
Screen density(屏幕密度)
屏幕物理单位物理区域内的像素点数量;通常被称为dpi(dots per inch)。比如,一个“low” density的屏幕比一个“normal”或者“high”density 屏幕的像素点少。
为了简单,Android将screendensities分成四种:low,medium,high,和extrahigh。
Orientation(方向)
从用户角度来说的屏幕方向。分成landscape(横屏)和portrait(竖屏),即屏幕是宽的开始长的。需要注意的是不要只做默认屏幕方向的处理,因为用户是可以在运行时候旋转屏幕方向的。
Resolution(分辨率)
一个屏幕总共的物理像素点。当我们要支持多屏幕的时候,程序不直接和分辨率相关,而是和screen size和density相关的。
Density-independent pixel (dp) 密度无关
一种定义layout布局的虚拟像素单位,是密度无关的。
1dp相当于160dpi屏幕上一个物理像素点,是基于“medium”密度的屏幕的。在运行时,系统基于实际的屏幕密度自动重新计算dp单位。转换dp到屏幕像素的公式很简单:px=dp*(dpi/160)。比如,在一个240dpi的屏幕上,1dp相当于1.5物理像素点。为了保证在不同的屏幕密度上显示正确,你应该总是使用dp来定义你的应用程序的布局。
Range of screens supported
从Android1.6开始,Android提供了对不同屏幕大小和密度的支持,需要考虑对不同屏幕的配置。你可以使用Android系统的这些功能来优化你的用户界面,来保证你的应用程序界面不仅仅是显示正确,还需要保证为每个屏幕提供最好的用户体验。
为了简化你为不同的屏幕设计你的UI,Android将屏幕的大小和密度分成:
l 四个size:small,normal,large和xlarge
注意:从Android3.2(API 13)开始,这些size不建议再使用了,而是建议使用一种新的基于可用屏幕宽度的技术。如果你在开发基于Android3.2或者更高版本的程序,可以查看http://developer.android.com/guide/practices/screens_support.html#DeclaringTabletLayouts
l 四个密度:ldpi(low),mdpi(medium),hdpi(high),和xhdpi(extrahigh)
这些屏幕size和densities都是基于normal size和mdpi(medium)density的。
而这个基准线是基于AndroidT-Mobile G1,这是一个HVGA屏幕(直到Android 1.6,这是Android唯一支持的屏幕)。
每种size和density都由一个区间。比如,两个设备screen size都是normal,但是他们的实际屏幕size和高宽比可能有一点小差别。同样的,两个设备都是hdpi,但是他们的像素密度也可能有点细微的差别。Android将这些不同抽象出来,所以你只需要为这几种广义上得屏幕size和densities设计UI,让系统为你的UI做最后的必要性调整。图1描述了屏幕size和densities是怎样粗略的被分成这几种广义上得size喝densities的。
图一
当你在为不同的screen size设计UI的时候,你会发现每种设计都需要一个最小的区域大小。所以,每种广义上得screen size都有一个相关联的最小分辨率,这些分辨率是以dp单位来定义的-----你也应该在你的layout重使用这个单位-----这样系统就不会担心屏幕密度变化了。
l xlarge screens are at least 960dp x 720dp
l large screens are at least 640dp x 480dp
l normal screens are at least 470dp x 320dp
l small screens are at least 426dp x 320dp
为了更好的支持不同的屏幕size和densities,你可以为不同的size和densities提供不同的资源文件。通常来说,你需要为不同的屏幕size提供不同的layout,为不同的屏幕desities提供不同的图片文件。在运行时,系统会根据当前设备的屏幕广义上的size和density来选择正确的资源文件。
你没有必要为每种屏幕size和density都提供资源文件。系统提供了一个功能就是位你处理很多支持多屏幕的工作,要想这样,你必须要使用到一些我们后文会提到的技术让系统很温柔的来调整你的UI(查看Best Practices一节)。
注意:每个设备广义上得size喝density都是相互独立的。比如一个WVGA(800*480)high-density屏幕被认为是一个normalsize的屏幕因为他的物理尺寸大小和T-Mobile G1一样。另一方面,一个WVGA medium-density 屏幕被认为是一个large size屏幕。虽然他得分辨率一样,但是WVGA medium-density屏幕有一个更低的屏幕密度,这意味着每个像素点得物理区域更大,因此,这个屏幕比基准线屏幕即normal size屏幕更大。
Density indeependence密度无关性
从用户角度来说,你的应用程序上的界面元素在不同密度的设备上都保持了他的物理大小,这就是density independence。
保持density independence很重要,因为如果不这样,一个UI元素(比如一个button)会在一个低密度的屏幕上变得很大,但是在一个高密度的屏幕上变得很小。这种密度相关的大小改变会造成你的layout布局的问题和可用性的问题。图2和图3分别展示了一个不支持density independence和支持density independence的区别。
图2
图3
Android系统用以下两种方式来帮助你的程序完成densityindependence:
l 系统根据当前的屏幕密度来缩放dp单位
l 如果有必要系统根据当前的屏幕密度来缩放图片资源
在图2中,text view和bitmap都是以px单位来定义的,所以这些视图元素在低密度的设备上看起来更大,在高密度的设备商看起来更小。这是因为虽然screen size都一样,但是高密度的屏幕每英寸有更多的像素点。在图3中,layout是用density-independent pixels来定义的。因为density-independentpixels是以medium-density为基准的,所以medium-density屏幕看起来和图2中的是一样的。对于low-density和high-density屏幕,系统缩放了dp单位,所以看起来是很合适的。
很多时候,你可以简单的通过dp或者“wrap_content”来保证你的程序是density independence的。系统会适当的缩放bitmap图片文件来显示正确的大小,基于当前屏幕密度的适当的缩放factor。
但是,缩放bitmap会造成图片的模糊和像素化,为了避免这种情况,你可以为不同的屏幕密度提供不同的图片文件。比如,你可以为high-density屏幕提供高分辨率的图片,系统会使用这些资源而不是调整medium-density图片尺寸的大小。