一切为了适配-Android的单位和尺寸

by:leotse


adapter

适配,适配,适配

我们都知道,支持Android系统的设备品类繁多,从移动手机到平板,从车载设备到穿戴设备,到处都能看到Android系统的身影。这些设备的应用场景,搭配硬件各异,因此它们所使用的屏幕也不同。

就拿我们平常看到的移动电话来说,也分低端机、中端机还有高端机,它们的屏幕分辨率也会有很大的差异。这就需要我们Android开发者针对不同分辨率的手机、设备进行适配。

Android中主要有两块尺寸需要我们注意,一个是控件宽高,一个是字体大小。这两块在Android系统中都有相应的单位,接下来详细介绍它们。

px VS dp

px:pixels的简写,指的是屏幕像素,我们知道,像素是屏幕上可以显示的最小单位。我们看到的图像都是由一个个的像素构成。因此,顺理成章,我们可以用px来作为控件的尺寸单位。比如:我们可以指定一个按钮的宽为160px,高为50px,初看一下并没有不妥,但是该按钮在不同的分辨率的屏幕上表现就会大相径庭,在分辨率为320x480像素的设备上,这个按钮就会占屏幕宽度的一半,但是如果换到分辨率为640x960像素的设备上,那么按钮就会只占屏幕到1/4。因此我们看到使用px在指定控件的时候的局限性,这时候我们就会提到另一个单位dp。

dp:要想了解dp,就首先得知道一个概念:屏幕密度。屏幕密度,单位为dpi(density per inch),直接理解就是每英寸的像素数。拿分辨率为320x480像素的设备来说,如果它的设备屏幕宽为2英寸,高为3英寸,那么它的屏幕密度就是160dpi。对于同样的尺寸,如果分辨率为640x960像素,那么它的屏幕密度就是320dpi。由此我们可以得出结论:屏幕密度越高,屏幕的效果越好。
dp,全称为dip(device independent pixels,设备无关像素),也就是说这是一个和设备无关的尺寸单位,无论是WVGA还是HVGA或者是QVGA,它都是适用的。在Android系统中,如果屏幕密度为160dpi,那么1px=1dp。

当屏幕density为240时,使用hdpi的资源;
当屏幕density为160时,使用mdpi的资源;
当屏幕density为120时,使用ldpi的资源。

要想获取Android设备的屏幕密度,可以使用下面的方法:

1
2
3
float xdpi = getResources().getDisplayMetrics().xdpi;
float ydpi = getResources().getDisplayMetrics().ydpi;
float density = getResources().getDisplayMetrics().density;

pt VS sp

同理,字体的尺寸也会有对应有pt和sp。
pt:point,字体的单位,磅数,1pt=1/72英寸。
sp:可伸缩像素,它的理念和dp一样,都是和设备无关,很好的解决了文字的适配问题。

在Android规范中,如果要指定控件或者布局的固定大小,建议使用dp作为单位,如果要指定文字大小,则建议使用sp作为单位。