Android使用size(尺寸) 和density(密度)这两个属性对设备屏幕进行分类。一个APP可能被安装到屏幕size和density不同的设备上。因此,APP应该包含一些替代资源,使其UI能适配不同的size和density。
•有四种基本的尺寸:small, normal, large, xlarge
•和四个基本的密度:低(ldpi),中(mdpi),高(hdpi),超高(xhdpi)
与适配多语言的操作类似,您需要把不同屏幕的layouts和bitmaps放在不同的资源目录中。需要注意的是屏幕方向(landscape或portrait)被认为是屏幕尺寸的变化,所以APP应该修改布局,以优化每个方向的UI显示。
创建不同的布局
要使不同屏幕尺寸的UI显示效果最佳,您应该为每个屏幕尺寸创建一个layout文件,并将每个layout文件保存到相应的以 - <screen_size>
后缀命名的资源目录中。例如,适用于大屏幕layout文件应该保存在res / layout-large /
下。
注意:Android系统会自动缩放您的布局,以适应屏幕。因此,不同屏幕尺寸的布局不需要关注UI元素的绝对大小,而要关注影响用户体验的布局结构(例如某些重要视图相对其他视图的大小和位置)。
例如,某项目包括默认布局和适用于大屏幕的替代布局:
MyProject/
res/
layout/
main.xml
layout-large/
main.xml
layout的文件名必须完全相同,但是它们的内容是不同的,以便为相应的屏幕尺寸提供适合的UI。
在Java代码中引用布局的代码不变:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
系统根据APP运行的设备的屏幕尺寸,从相应的布局目录加载布局文件。有关Android如何选择适当资源的更多信息请见 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。
创建不同的Bitmaps
为了让APP在所有屏幕密度上都能显示出良好的图片质量,您应该提供适用low, medium, high and extra-high屏幕密度的位图资源。
您应该以矢量格式从原始资源开始,并使用以下尺寸比例为每个density生成这些图像:
• 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屏幕。
更多有关创建应用图标资源的资料,请参阅 Iconography design guide。