Android系统使用两个普通属性:尺寸和密度,来对设备屏幕进行分类。你需要先预测你的应用将会在什么样屏幕的设备上安装,包括屏幕尺寸和密度。这样的话,你就需要提供一些可选的资源类让你的应用在不同屏幕的设备上有最佳的展示。
- 有四种普遍的尺寸:small, normal, large, xlarge
- 还有四种普遍的密度:low (ldpi), medium (mdpi), high (hdpi), extra high (xhdpi)
要为不同的屏幕声明不同的布局和图片,你需要让这些可选的资源放在不同的目录下,这和如何支持多语言的做法类似。
同样要考虑到在不同屏幕尺寸下的屏幕方向配置,因此很多应用通在不同的方向上改变不同的布局来实现最佳的用户体验。
创建不同的布局
让你的应用在不同的屏幕尺寸上有好的用户体验,你应该为每个你想支持的屏幕尺寸创建一个唯一的XML布局文件。每个布局文件应该被存放到适当的资源目录下,目录名以 -<screen_size>
为后缀。例如,一个存放大屏幕的布局目录的名称是res/layout-large/
。
提示: Android系统会自动伸缩布局来正确的适配屏幕。因此,你不需要担心你为不同布局设计的UI元素的实际尺寸,你要注意的是影响用户体验的布局结构(例如重要布局相对与它旁边布局的尺寸和位置)。
例如,这个项目包括一个默认的布局目录以及是用于大屏幕的布局目录:
MyProject/ res/ layout/ main.xml layout-large/ main.xml
文件名一定要完全相同,但是它们的内容要不一样,用来为不同的屏幕尺寸提供最佳的UI展示。
在应用中简单地引用布局:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); }
系统会根据设备的屏幕尺寸加来适当的布局目录下的布局文件。更多关于选取适当布局资源的信息,请参阅Providing Resources 引导。
另一个例子,下面是项目横屏的可选资源:
MyProject/ res/ layout/ main.xml layout-land/ main.xml
默认情况下,layout/main.xml
文件是被竖屏使用的。
如果你想要为你的应用指定横屏时的布局,包括在大屏幕的设备上,那么你需要同时使用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
提示: Android 3.2 以及更高的系统提供了定义屏幕尺寸的高级方法,它允许您根据密度无关的像素方面的最小宽度和高度,以指定的屏幕尺寸的资源。这篇课程不包含这项新技术。更多信息,请参阅Designing for Multiple Screens。
创建不同的图片
你应该为每个通用密度的设备提供能够正确缩放的图片资源:low, medium, high and extra-high 密度。这能帮助你在所有屏幕密度的设备上获得更高的图片质量以及更好的性能。
要生成这些图片,你首先需要使用下面的尺寸规模为你的原生资源的矢量资源为不同的屏幕密度生成图片:
- xhdpi: 2.0
- hdpi: 1.5
- mdpi: 1.0 (baseline)
- ldpi: 0.75
这表示如果你为xhdpi的设备生成一个200x200 的图片,你就应该为hdpi的设备生成150x150 的相同资源,mdpi设备100x100,ldpi设备75x75。
然后将这些文件放在适当的drawable资源目录下:
MyProject/ res/ drawable-xhdpi/ awesomeimage.png drawable-hdpi/ awesomeimage.png drawable-mdpi/ awesomeimage.png drawable-ldpi/ awesomeimage.png
你每次引用@drawable/awesomeimage
的时候,系统都会根据屏幕密度选择适当的图片。
提示: 低分辨率(ldpi) 资源并不是必要的。当你提供了hdpi的资源时,系统会将资源缩小一半来正确的适应ldpi的屏幕。
更多关于为应用创建icon资源的向导,请参阅Iconography design guide。