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。