关于支持多种屏幕尺寸的编程
本文根据参考文档写成,只列出了基本概念和一些原则性的东西。强烈推荐大家阅读下参考文档。对这个主题阐述的非常详细。
下面介绍一些Android应用开发中与不同设备展示相关的一些术语:
屏幕尺寸(Screen size)
屏幕的物理尺寸。 根据屏幕的对角线长度确定。简而言之,Android把屏幕尺寸分为四大类: 小( small),中等( normal),大(large), 和超大( extra large)。图一表示了屏幕尺寸的划分标准。
屏幕密度(Screen density)
表示在一定的物理区域内能够显示的点的数目,通常用dpi(dot per inch)作为单位衡量。Dpi 的含义是一英寸之内有多少个点。密度越小的显示设备在固定区域内显示的点数越少。通常,Android根据显示密度把屏幕也分为四种:低(low),中(medium),高(high),超高(extra high)。图一表示了屏幕密度的划分标准。
屏幕方向(Orientation)
屏幕方向。包括横屏和竖屏。不同的设备有不同的缺省的屏幕方向。而且屏幕方向在运行时可以通过用户的旋转操作而更改。
分辨率(Resolution)
一屏能显示的物理点数。在开发支持多屏显示的应用过程中,应用程序不应该直接根据屏幕的分辨率来设置。而应该更多考虑屏幕尺寸和密度。
密度无关像素(Density-independent pixel /dp)
一种虚拟的像素单位,用此单位设计应用程序界面布局可以实现多屏幕支持效果。Dp表示的是一个准确的物理长度。它的大小等于显示密度为160dpi的一个像素的大小。如果在设计应用布局时以dp为单位。Android系统在渲染界面时会根据当前屏幕特显示密度来调整显示大小。有一个计算公式可以表明在不同显示密度屏幕上的像素显示大小为:
dp = px * (dpi / 160)
例如: 在显示密度为240dpi的屏幕上,一个dp的显示大小应该为1.5像素。
Sp(scale-independent pixel)
用于定义字体尺寸,和dp类似。
Pt(Point)
point,是一个标准的长度单位,1pt=1/72英寸。
关于屏幕尺寸
从1.6版本开始,Android提供了支持多种屏幕尺寸和多种分辨率的机制。后文会详细介绍这些机制。
同时,Android 对屏幕尺寸和显示密度做了如下定义:
图一 android 系统对屏幕尺寸和密度的大概划分
xlarge: 960dp x 720dp
large : 640dp x 480dp
normal: 470dp x 320dp
small :426dp x 320dp
在我们应用程序中,如果使用固定的物理长度作为度量,就可以避免由于不同屏幕的差别所带来的显示效果的不同。下面的例子可以很好的说明这个问题:
图二未使用显示密度无关方案的效果
图三使用了显示无关方案的效果图
显然,图二中的例子是使用px作为单位来定义控件,这样导致在显示密度更高的屏幕上,控件明显变小了。图三中使用dp作为单位定义控件尺寸,当屏幕的显示密度增加时,会根据显示密度调整控件的显示大小。
如何支持多屏幕的编程
根据屏幕尺寸定制资源
Android提供了一套机制,可以根据当前设备的不同显示配置选择合适的方式渲染UI.例
如,可以通过自动拉伸/缩小布局或者缩放图片达到最佳的现实效果。如果用户想更加完美的处理这个问题,就需要做到以下几点:
1. 在manifest文件中准确声明应用程序支持的屏幕尺寸。可以通过在manifest 文件中添加<supports-screens>元素来实现此限制。
2. 为不同的屏幕尺寸实现不同的布局。
3. 为不同显示密度的屏幕提供不同的图片。
在缺省情况下,android会自动对应用的界面进行缩放以适应当前屏幕大小。大部分情况下都能正常工作。但在少部分情况下,效果可能不是那么完美。例如,在很大的屏幕上,为了有效的利用屏幕空间,给用户更好的用户体验,就需要为用户定制大屏的界面布局。
为了实现这一功能,需要用户自己针对大屏特别定制布局。具体方法是:定义 layout-xlarge布局目录,将布局文件放置于这个目录之中即可。通常使用的目录有:layout-small, layout-normal, layout-large和layout-xlarge。
Android 3.2版本之后,这种方法已经废弃不用了。取而代之的是更加精确的方法,使用sw<N>dp的格式来定义符合屏幕尺寸的布局。例如layout-sw600dp表示此布局可应用于宽度至少为600dp的屏幕。
缺省情况下,Android会自动缩放图片以适应屏幕大小。但是图片的放大和缩小都会影响图片的质量,导致不能获得最佳的展示效果。因此,同样需要针对不同的显示密度定制不同的图片资源。
具体方法和定制屏幕尺寸类似,分别将不同的图片资源放置在不同的资源文件目录中。目录名称命名规则如下:drawable-ldpi, drawable-mdpi, drawable-hdpi, drawable-xhdpi.
更详细的介绍,可以查看参考文档。
推荐布局方式
为了开发出具有更好屏幕适应性的应用程序,在开发过程中我们需要遵循以下原则:
1. 在布局中使用match_parent,wrap_content,dp 等方式进行定义。这种方式定义的布局在
拉伸和缩小过程中能够较好的保证布局质量。例如,定义宽度:layout_width="100dp"。则在显示密度为160的屏幕上,宽度为160个像素。而在显示密度为240的屏幕上,显示长度则为150像素。
同样,对于文字大小的定义也建议使用sp。
2. 不要再应用程序代码中使用硬编码的像素值。因为在android系统中是使用基于当前屏
幕显示密度下的像素值作为坐标的标准单位。例如,对指定view调用myView.getWidth()返回值为10.表示在当前屏幕上这个view的宽度为10个像素。如果换了一个高显示密度的屏幕,这个返回值可能便成为15。
3. 不要使用AbsoluteLayout。
4. 使用尺寸和显示密度相关的资源。如2.1节所示,为了获得更好的效果,我们需要为
不同尺寸和不同显示密度的屏幕定制不同的布局和图片资源。
参考文档: Androiddoc, 选择dev guide,从左侧Best Practices下面选择Supporting Multiple Screens。 强烈推荐大家阅读下这篇文档,写的非常详细。