Android设备屏幕根据两个属性分类:尺寸和密度。你应该期望你的程序被安装在合理的尺寸和密度范围内。例如,你应该针对不同的尺寸和密度提供可选择的资源,让你的程序能有好的展现。
为了在不同的屏幕尺寸下有好的用户体验,你必须为每个你想支持的屏幕尺寸创建一个唯一的XML样式文件。每个样式保存在对应的以-<screen_size>为后缀的资源目录中。例如,一个large屏幕的样式目录为res/layout-large/。
系统会基于你使用的设备加载合适的样式文件。更多关于Android选择合适资源显示的信息,可以看这个教程: Providing Resources
你通常提供不同的位图资源去适应不同的密度:low, medium, high, extra-high。这样能帮助你在不同屏幕密度中取得好的绘图质量和性能。
- 这里有四个常用的尺寸:small, normal, large, xlarge
- 四个常用的密度:low(ldpi), medium(mdpi), high(hdpi), extra high(xhdpi)
为了能够在不同的屏幕中显示不同的样式和位图,你必须保存不同的资源在独立的目录中,和前面说的不同语言字符串类似。
还要注意的是,不同的屏幕方位(风景或者肖像)被指定为不同的屏幕尺寸。所以很多程序需要修订样式以便在不同方位都能有好的用户体验。
创建不同的样式
为了在不同的屏幕尺寸下有好的用户体验,你必须为每个你想支持的屏幕尺寸创建一个唯一的XML样式文件。每个样式保存在对应的以-<screen_size>为后缀的资源目录中。例如,一个large屏幕的样式目录为res/layout-large/。
提示:Android会自动缩放你的样式,以便合适的填充屏幕。因此,你不用担心不同尺寸屏幕下UI元素的决定尺寸,而是要更多关注样式结构对用户体验的影响(比如相对于相邻view的尺寸和位置)。
例如,下面这个工程包含默认的样式和一个可选择的large屏幕样式:
MyProject/ res/ layout/ main.xml layout-large/ main.xml
文件名必须是相同的,但是内容是不同的,它为不同的屏幕尺寸提供对应的UI。
在程序中简单引用样式文件:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
系统会基于你使用的设备加载合适的样式文件。更多关于Android选择合适资源显示的信息,可以看这个教程: Providing Resources
作为另外一个例子,这个工程使用一个可选的风景(横屏)方位样式:
MyProject/ res/ layout/ main.xml layout-land/ main.xml
默认的layout/main.xml文件被使用在肖像(竖屏)方位。
如果你为风景方位和large屏幕提供一个特别的样式,你需要使用large和land两个限定符:
MyProject/ res/ layout/ # default (portrait) main.xml layout-land/ # landscape main.xml layout-large/ # large (portrait) main.xml layout-large-land/ # large landscape main.xml
提示:Android3.2以及更高版本支持一种更加先进的定义屏幕尺寸的方法,允许你基于最小宽高去指定资源文件,这个课程不包括这种新技术,想了解请移步到:
Designing for Multiple Screens
.
创建不同位图
你通常提供不同的位图资源去适应不同的密度:low, medium, high, extra-high。这样能帮助你在不同屏幕密度中取得好的绘图质量和性能。
为了生成这些图像,你需要从原始的矢量格式开始,采用下面的尺寸缩放生成对应密度的图片:
- xhdpi: 2.0
- hdpi: 1.5
- mdpi: 1.0
- ldpi: 0.75
意思就是说,如果你生成一个200x200的图片给xhdpi设备,你就需要生成相同的资源给其他设备,hdpi是150x150, mdpi是100x100, ldpi是75x75。
然后,把它们放到对应的绘图资源目录中:
MyProject/ res/ drawable-xhdpi/ awesomeimage.png drawable-hdpi/ awesomeimage.png drawable-mdpi/ awesomeimage.png drawable-ldpi/ awesomeimage.png
任何时候你调用@drawable/awesomeimage,系统会根据屏幕密度选择合适的位图。
提示:ldpi资源通常不是必须的,当你提供hdpi资源时,系统会缩放一半去适应ldpi屏幕。
更多关于创建程序图标资源的教程,看这里:
Iconography design guide
.