Android系统基于两项基本属性来对屏幕进行归类:尺寸和分辨率,开发者不应该期望自己的应用软件会只安装在配备固定尺寸和分辨率屏幕的设备上。为此,开发者应为应用软件提供多种备选资源,使得其显示效果在不同尺寸和分辨率的屏幕上都能够达到最优化。
尺寸基本分类:small,normal,large,xlarge
分辨率基本分类:low(ldpi),medium(mdpi),high(hdpi),extra high(xhdpi)
就像支持不同语言的字符串资源一样,开发者需要在不同的资源目录下分别定义适用于不同屏幕种类的界面布局和位图资源。
此外,横向或纵向屏幕也被认为是不同的屏幕尺寸,开发者也需要为此提供不同版本的资源以达到最佳显示效果。
为提升应用软件在不同屏幕尺寸下的用户体验,开发者需要为每类期望支持的屏幕创建一个独立的界面布局XML文件,这些文件被存放在对应的以-<screen_size>为后缀的资源目录。例如,为大屏幕创建的文件应存放在res/layout-large目录下。
注意:Android能够自动为适应屏幕对界面布局进行缩放,因此,开发者不必关心不同尺寸的屏幕下UI元素的绝对大小,而只需关注处理界面布局的结构性问题,如重要View对于兄弟View的相对位置和相对大小。
例如,本工程中包含了一个缺省布局和一个为大屏幕提供的备选布局。
MyProject/
res/
layout/
main.xml
layout-large/
main.xml
相同资源的文件名必须保持一致,而其内容针对不同的屏幕尺寸而不同以提供最佳的UI显示效果。
在代码中直接饮用相关资源,如
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
这样,Android系统就会自动根据应用软件所处设备的屏幕大小选择对应目录下的布局文件进行显示。
下一个例子,工程提供了横向布局
MyProject/
res/
layout/
main.xml
layout-land/
main.xml
缺省情况下,layout/main.xml用作纵向布局。
如果期望为大屏幕设备提供横向布局的资源,则需要对large和land都进行包含,如
MyProject/
res/
layout/
main.xml
layout-land/
main.xml
layout-large/
main.xml
layout-large-land/
main.xml
注意:Android 3.2及以上版本提供了定义屏幕尺寸的优化方法,通过这种方法,开发者可以针对以像素为单位的最小宽度和高度的屏幕尺寸指定各种资源。在多屏幕设计详细介绍了这一新技术,本章节不再赘述。
开发者需要针对不同分辨率的屏幕提供合适的位图资源,以达到最佳图形质量和显示效果。
为获取这些位图资源,开发者应该以矢量图形的方式创建原始图像,然后根据如下比例为各种分辨率生成对应的图形资源:
这意味着,对于一个在xhdpi设备显示为200*200的图像,还需分别为hdpi/mdpi/ldpi创建150*150/100*100/75*75的图像资源。
然后,将这些图像置于对应的drawable资源目录:
MyProject/
res/
drawable-xhdpi/
awesomeimage.png
drawable-hdpi/
awesomeimage.png
drawable-mdpi/
awesomeimage.png
drawable-ldpi/
awesomeimage.png
这样,当在代码中引用@drawable/awesomeimage时,系统根据当前分辨率自动选择合适的图像资源。
注意:ldpi资源一般不做要求,因为一旦提供hdpi资源,系统能够对其进行50%缩小以适应ldpi屏幕。
在图标设计指导提供了创建图表的更多技巧和指导。