1、常用单位及其关系
px:像素
inch:英寸
pt:1/72 英寸
dpi:一英寸长的直线上的像素点的数量,即像素密度。不同的设备,dpi值不同,显示效果不同,dpi的值跟设备硬件有关。标准值是160dp。
dp(dip):独立像素密度。即在标准屏幕下,1个像素点的长度,标准屏幕是160dpi,可以理解为1英寸长度上有160个像素。标准屏幕中1dp=1px。
px = dp*(dpi/160);//当dpi=160时,1px=1dp
分辨率:屏幕上长宽方向上像素点的数量,即一个屏幕上像素的数量。
例如:720*1280 = 屏幕x轴上有720个像素,屏幕y轴上有1280个像素
分辨率单位:dpi(点每英寸)、lpi(线每英寸)、ppi(像素每英寸)
屏幕的物理尺寸:屏幕对角线的长度,单位是inch
sp:专用于设定文字大小,受dpi影响和用户的字体偏好设定影响。
各单位和px的换算关系见TypedValue.applyDimension方法
public static float applyDimension(int unit, float value,
DisplayMetrics metrics)
{
switch (unit) {
case COMPLEX_UNIT_PX:
return value;
case COMPLEX_UNIT_DIP:
return value * metrics.density;
case COMPLEX_UNIT_SP:
return value * metrics.scaledDensity;
case COMPLEX_UNIT_PT:
return value * metrics.xdpi * (1.0f/72);
case COMPLEX_UNIT_IN:
return value * metrics.xdpi;
case COMPLEX_UNIT_MM:
return value * metrics.xdpi * (1.0f/25.4f);
}
return 0;
}
//显示器
DisplayMetrics d = getResources().getDisplayMetrics();//可以获得scaledDensity,densityDpi,heightPixels,widthPixels等信息。
Configuration configuration = getResources().getConfiguration();//获取设备的配置信息
//configuration.screenHeightDp 当前屏幕可用空间的高度,单位是dp
//configuration.screenWidthDp 当前屏幕可用空间的宽度,单位是dp
//configuration.densityDpi 当前设备的dpi信息
例子:
已知设备1080*1920,使用DisplayMetrics获取的实际信息是1080*1776,y轴方向上的像素有误差是因为软键盘,实际屏幕要小。
使用Configuration获取的设备的dpi=480dpi,根据公式px=dp*(dpi/160)。
现在px=1080,dpi=480,则dp=360.
使用configuration.screenWidthDp得到的数值为360,和上面用公式算出的一致。
但是y轴方向上用公式计算出来的应该是1776/3=592.但是用scrrenHeightDp获取的只有567。
通过源码验证上述是否成立:
applyDimension方法就是通过输入的任何值转换成px,也就是说,该方法是任何单位和px的换算关系。
COMPLEX_UNIT_DIP 就是dip单位,就是平时说的dp。和px