一、常用的单位:
相对单位主要有:px、sp、dp</p>
绝对单位主要有:pt、in、mm
px:pixels
sp:Scale-independent pixels
dp:device independent pixels(设备独立像素)
pt:point
in:inch
mm:毫米
二、单位应用总结:一般用相对单位,而不是绝对单位
1、字体的大小一般使用SP,用此单位的字体能够根据用户设置字体的大小而自动缩放
2、空间等相对距离一般使用dp(dip),随着密度变化,对应的像素数量也变化,但并没有直接的相对比例的变化。
3、px与实际像素有关,及与密度有关!dp和sp和实际像素没有关系,对于一定分辨率但不同密度的屏幕,px单位的应用可能会导致长度的相对比例的变化。
三、密度与分辨率:
密度值表示每英寸有多少个显示点,与分辨率是两个概念。
其屏幕密度标准是:HVGA屏density=160;QVGA屏density=120;WVGA屏density=240;WQVGA屏density=120
具体的应用运算关系:假设分辨率是 x*y, 密度为 d, 屏幕实际大小为 a*b那么关系为 x*y = d * a * b (约等于)
不同density下屏幕分辨率信息,以480dip*800dip的 WVGA(density=240)为例density=120时 屏幕实际分辨率为240px*400px (两个点对应一个分辨率)
四、对比总结:
1、在相同密度(即同一实体屏幕)不同分辨率的情况下,与实体密度无关的相对单位sp和dp显示正常
2、在相同分辨率不同密度的情况下,因为一般情况下,都用的标准密度,所以分析的意义不是很大
五、下面不同单位的相互转换:
说明:PPI = √(长度像素数² + 宽度像素数²) / 屏幕对角线英寸数
举个简单的列子,iphone5的ppi是多少?ppi=√(1136px²+ 640px²)/4 in=326ppi(视网膜Retina屏)
(1)距离单位
<span style="white-space:pre"> </span>public static int dip2px(Context context, float dipValue) {
<span style="white-space:pre"> </span>final float scale = context.getResources().getDisplayMetrics().density;
<span style="white-space:pre"> </span>return (int) (dipValue * scale + 0.5f);
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>public static int px2dip(Context context, float pxValue) {
<span style="white-space:pre"> </span>final float scale = context.getResource().getDisplayMetrics().density;
<span style="white-space:pre"> </span>return (int) (pxValue / scale + 0.5f);
<span style="white-space:pre"> </span>}
dp和px的换算公式 :dp*ppi/160 =px
比如,在一个240ppi的屏幕里,比如1dp x 240/160 = 1.5px。 即 1dp=1.5px,
mdpi: 1.0 (baseline
(160ppi) ) 1dp=px
hdpi: 1.5 (240ppi) 1dp=1.5px
xhdpi: 2.0 (320ppi) 1dp=2px
xxhdpi3.0 (480ppi) 1dp=3px
把dp 转化为px 公式为:
dp乘以每个密度下面的系数比值
(2)字体单位
<span style="white-space:pre"> </span>WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
int screenWidth = screenWidth = display.getWidth();
int screenHeight = screenHeight = display.getHeight();
float scale = MainActivity.this.getResources().getDisplayMetrics().density;
UIUtil.showMessage(MainActivity.this, screenWidth+"--"+screenHeight+"--"+scale);