Android 一般用两种属性来识别设备的屏幕:尺寸和像素密度。你应该期望你自己的app能够以合适的尺寸和像素密度安装到设备上。因此,你应该包含一些额外的资源为不同尺寸和像素密度的设备来优化你程序的外观。
- 通常有四种尺寸:small,normal,large,xlarge。
- 对应的通常也有四种像素密度:low (ldpi), medium (mdpi), high (hdpi), extra high (xhdpi)
为了你所使用的不同屏幕的设备定义不同的布局和放置不同的位图,你必须放置这些额外的资源到不同的文件夹下,就像你之前为Android做多语言适配所做的类似。
此外还要特别注意屏幕的摆放方向(水平或者垂直)也会被认为屏幕尺寸的改变,所以大多数app应该在每个方向都重新布局来提升用户体验。
#创建不同的布局
为了在不同的屏幕尺寸上获得良好的用户体验,你应该为不同的屏幕尺寸创建单独的布局文件。每个布局文件都应该放到合适的资源文件夹下,命名规则为以-<屏幕尺寸>为收尾。例如,为大屏幕创建的布局文件应该放在res/layout-large/
文件夹下。
注意:Android会自动调整你的布局以便正确的适应屏幕。因此,你为不同屏幕创建的布局文件不需要考虑其中UI元素的绝对尺寸,相反你应该更多关注那些影响用户体验的布局结构(比如布局中重要部件的大小或者和它相邻视图的距离等)。
举个例子,这个工程包含一个默认的布局和一个为large
屏幕做的布局:
|
|
这个layout-*
文件夹下的文件名必须完全一致,但是他们的内容应该是不同的,因为为了不同屏幕尺寸提供不同的布局文件。
在app中你一般会这样关联你的布局文件:
|
|
当你的程序运行时系统会根据设备屏幕尺寸自动从合适的文件夹下加载对应的布局文件。更多关于Android如何选择合适的布局文件请访问Providing Resources页面。
另一个例子,有一个工程创建了个水平方向布局的文件:
|
|
默认情况下,layout/main.xml
文件是用来做垂直方向布局的。
如果你想为大屏幕提供横向布局,布局文件夹名称同时需要large
和land
限定符:
注意:Android 3.2以及以上的版本支持定义屏幕尺寸的一种先进的方法,可以让你根据密度无关的像素为单位的最小宽度和高度来指定对应屏幕的资源文件。
#创建不同的位图
你应该总是为几种常见像素密度提供正确缩放的位图资源,例如:low
,medium
,high
和extra-high
等几种像素密度。这样做的好处是可以帮助你在不同的像素密度上得到一个比较好的视觉效果和性能表现。
要生成这些图片,首先你要用你的原始图片资源在矢量格式下使用下面几种缩放比例来为不同像素密度来生成图片资源:
- xhdpi: 2.0
- hdpi: 1.5
- mdpi: 1.0 (baseline)
- ldpi: 0.75
这就意味着如果你为一部xhdpi
设备生成了一张200*200
的图片,你就要为hdpi
的设备生成150*150
的图片,为mdpi
的设备生成100*100
的图片,和为ldpi
的设备生成75*75
的图片。
接下来,把这些生成好的图片文件放到对应的资源文件夹下:
|
|
然后你在任何时候引用@drawable/awesomeimage
,系统都会基于屏幕的像素密度自动选择合适的位图资源。
注意:低像素密度(
ldpi
)资源文件并不总是需要的。当你提供了hdpi
的资源,系统会自动把它们缩放一半以适应ldpi
屏幕。