为了声明你想要使用在不同屏幕上的布局和位图 , 你必须在不同的路径中放置这些可选的资源 , 这类似于针对不同的语言字符串你所要做的事情 .
你也要也要意识到屏幕方向(横向或者纵向)也要被考虑成一种屏幕尺寸,所以许多的应用会修改布局来优化用户在不同的屏幕方向上的体验 .
为了在不同的屏幕尺寸上优化你的用户体验,你应该为每一个你想要支持的屏幕尺寸创建单独的文件 . 每一个布局应该被保存在对应的资源路径中,使用带有 -<屏幕_尺寸> 后缀的名称 . 例如,对于大屏幕的单独布局应该被保存在 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); }
系统会基于你的应用所运行的设备的屏幕尺寸来从对应的布局路径加载布局文件 . 更多有关Android如何选择对应的资源的信息可以在 提供资源 指南中找到 .
作为另外一个示例,这里是一个带有针对横向屏幕的可选布局的项目 :
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 及其以上版本支持许多可以让你用一种与像素密度无关的方式基于最小的宽度和高度的屏幕尺寸来指定的高级方法. 这一节对此不错叙述. 更多的信息,见 设计用于多种屏幕 .
你应该针对一般的项目密度类型提供位图资源的恰当缩放版本: 低的, 中的, 高的 和 超高的项目密度 . 这有助于你在所有的屏幕像素密度上都能取得好的图形质量 .
为了生成这些图像,你应该从矢量格式的源生资源开始,使用如下尺寸范围为每一种项目密度生成图像 :
这就意味着如果你为xhdpi设备生成了一张 200x200 图片,你就应该用 150x150 为hdpi , 100x100 为 pi, 以及 75x75 为ldpi设备生成同样的资源 .
然后,将这些文件放到对应的图形资源路径中 :
MyProject/ res/ drawable-xhdpi/ awesomeimage.png drawable-hdpi/ awesomeimage.png drawable-mdpi/ awesomeimage.png drawable-ldpi/ awesomeimage.png
任何时间你引用 @drawable/awesomeimage, 系统都会基于屏幕的像素密度选择对应的位图 .
注意: 低密度 (ldpi) 资源并不总是需要的 . 当你提供了hdpiWhen you provide hdpi 资源, 系统会将它们缩小一半来适配 ldpi 的屏幕.
更多有关为应用创建图标资源的提示和指南,见 图标设计指南.