一、基本概念
主要概念:
dpi:dots per inch (像素/英寸),像素密度。
一英寸有多少个像素点,常见取值 120,160,240。dip(dp):Density independent pixels ,设备无关像素。
一般我们为了支持手机上多种分辨率,如WVGA、HVGA和QVGA,都会使用dip作为长度的单位。dp是为了和sp统一对dip的简称 早期使用的是dip后来统一为dp。px:屏幕的像素点。
最基本的图形长度单位。sp:Scale-independent Pixel,与缩放无关像素。
补充概念:
分辨率: Resolution (分辨率)之的是设备屏幕横向和纵向的像素的个数。常见的手机分辨率有: QVGA(240×320像素)、HVGA(480×320像素)、WVGA(800×480像素)、720P(1280x720像素)、1080P(1920x1080像素)、2K(2560x1440像素)。
屏幕尺寸:屏幕的对角线。
屏幕比例:因为只确定了对角线长,2边长度还不一定。所以有了4:3、16:9这种,这样就可以算出屏幕边长了。
pt: point,磅。
是一个标准的长度单位,1pt=1/72英寸,用于印刷业,非常简单易用。
二、计算公式
dpi:假设分辨率为:x*y像素。屏幕尺寸为L 则
dpi=√ (x²+y²)/L
屏幕分辨率长宽平方和开方除以屏幕尺寸dp&px: px=dpi/160*dp
三、区别与联系
px: px单位不被建议使用。因为同样像素大小的图片在不同手机显示的实际大小可能不同。要用到px的情况是需要画1像素表格线或阴影线的时候,如果用其他单位画则会显得模糊。
dp:Android系统定义了四种像素密度:低(120dpi)、中(160dpi)、高(240dpi)和超高(320dpi),它们对应的dp到px的系数(density)分别为0.75、1、1.5和2,这个系数乘以dp长度就是像素数。在不同分辨率下显示的长度一样。不受分辨率影响,所以称之为设备无关像素。
sp:sp和dp很类似但唯一的区别是,Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),当文字尺寸是“正常”时,1sp=1dp=0.00625英寸,而当文字尺寸是“大”或“超大”时,1sp>1dp=0.00625英寸。类似我们在windows里调整字体尺寸以后的效果——窗口大小不变,只有文字大小改变。
注意:sp使用后用户调整系统字体大小可能会影响到布局。
解决方法:
1、使用dp做字体单位。
2、重写getResource()方法,可以在activity基类(app中所有的activity都应该有继承于我们自己定义的一个activity类)中加上以下代码:
@Override
public Resources getResources() {
Resources res = super.getResources();
Configuration config = new Configuration();
config.setToDefaults();
res.updateConfiguration(config, res.getDisplayMetrics());
return res;
}
在这段代码中new出来了一个Configuration对象,并通过 setToDefaults() 方法将其设为了系统默认的配置,此方法要想生效需调用Resources的updateConfiguration (Configuration config, DisplayMetrics metrics)方法。
附录:
参考文章: