支持不同的屏幕
安卓根据两方面将手机屏幕进行不同划分:尺寸和密度。你应该预料到你的APP会安装到屏幕尺寸和密度都不同的手机上。正是如此,你应该根据不同的屏幕尺寸和密度使用可选的资源来优化你的app界面。
有4种通用尺寸:小,中,大,超大。
有4种通用密度:低(ldpi),中(mdpi),高(hdpi),超高(xhdpi)
通过声明不同的布局文件和位图,你可以适配不同的屏幕。你需要将这些文件放在不同的资源目录下,跟上一课如何设置不同的语言是类似的。
同时你也应该知道,屏幕方向(水平或垂直)不同时,也被认为是不同的屏幕尺寸,所以很多app也需要在这方面修订布局文件来优化不同方向上的用户体验。
创建不同的布局
为了在不同的屏幕尺寸上优化用户体验,你需要为每一种屏幕尺寸建立一个布局XML文件。每一个布局文件需要保存在适当的目录下,名字需要加一个”-<屏幕尺寸>”后缀。例如,为大屏幕创建的布局文件,应该保存在目录 res/layout-large/下。
例如,这个工程包含一个默认的布局文件和一个为适配大屏幕的可选布局文件:
MyProject/
res/
layout/
main.xml
layout-large/
main.xml
文件名必须相同,但是内容可以不同,主要是为了根据屏幕尺寸来提供一个优化的UI。
与以前一样,只是简单地引用这个布局文件:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
系统会根据手机的屏幕尺寸大小,在你的app运行时,调用相应目录下的布局文件。
如下另一个例子,在工程中为水平方向提供一个可选布局文件:
MyProject/
res/
layout/
main.xml
layout-land/
main.xml
默认情况下,layout/main.xml在垂直方向时使用。
如果你想为水平方向上提供一个特殊的布局文件,包括同时在大屏幕尺寸下才使用,那么你需要同时使用large和land修饰符:
MyProject/
res/
layout/ # 默认 (垂直)
main.xml
layout-land/ # 水平
main.xml
layout-large/ # 大屏幕 (垂直)
main.xml
layout-large-land/ #大屏幕 同时 水平方向
main.xml
创建不同的位图
你应该为常用的屏幕密度提供位图资源,便于恰当地缩放:低密度,中密度,高密度和超高密度。这样可以让你的app在不同的密度屏幕上都能获得好的图像质量和性能。
为了创建这些图像,你应该使用你的矢量源图像,根据不同的密度缩放系数,创建针对不同密度的图像:
Xhpi: 2.0
Hdpi: 1.5
Mdpi: 1.0 (基准)
Ldpi: 0,75
上面的意思是说:如果你为xhdpi手机,创建了一个200*200的图像,那么为hdpi手机,你应该创建一个150*150的图像, mdpi手机上 100*100, ldpi手机上 75*75.
然后,你可以将这些不同大小的同名字的图像放在适配不同密度的图像资源目录下:
MyProject/
res/
drawable-xhdpi/
awesomeimage.png
drawable-hdpi/
awesomeimage.png
drawable-mdpi/
awesomeimage.png
drawable-ldpi/
awesomeimage.png
任何时候你使用引用 @drawable/awesomeimage,系统会自动根据屏幕密度来调用相应的位图。
注意:低密度(ldpi)资源通常没有必要。当你提供hdpi资源时,而没有提供ldpi资源时,系统会在低密度手机上,自动使用hdpi资源,但会将它们缩减至一半大小。