1、px
即像素,1px代表屏幕上的一个物理像素点。
“pixel” 的缩写,像素。是画面显示的基本单位,真实的像素并不是点或者方块(虽然有时这样显示),也没有实际固定长度,只是一个抽象的取样。设计中的像素和实际显示屏上的像素相对应。
屏幕的分辨率一般就描述为“宽向像素数X纵向像素数”。比如 Android手机常见的分辨率有:320 X 480, 480 X 800, 1080 X 1920等。
2、dp
dip:device independent pixels(设备独立像素),dp与dip一样,不同的设备有不同的显示效果,一般为了支持WVGA、HVGA和QVGA推荐使用这个,不依赖像素。
定义dp为 160dpi 时的一个像素大小;那么到 320 dpi 时,它就相当于两个像素。
px= dp (dpi/160)
这样的话,假如做一个5050dp的icon,放到160dpi的屏幕上就是50px50px,放到320dpi的屏幕上就是100px100px。各元素的布局和比例便不会失调。
3、sp
sp:scale-independent pixels(缩放独立像素),与缩放无关的抽象像素,它和dp很相似,但唯一的区别在于,Android系统允许用户自定义文字尺寸大小(小,正常,大,超大等),当文字尺寸是“正常”时,1sp=1dp=0.00625inch(英寸),当文字尺寸是“大”或“超大”时,1sp>1dp=0.00625inch
这里插一句 sp 这个单位,sp 跟 dp 类似,全称是 scale-independent pixel (也会缩写为 sip), 即“独立比例像素”。sp 主要用作字体的单位,开发用此单位设置文字大小,这样在不同像素密度的屏幕上能进行同比例的扩大缩小。
4、dpi
dpi是像素密度,指的是在系统软件上指定的单位尺寸的像素数量,它往往是写在系统出厂配置文件的一个固定值
我为什么要强调它是软件系统上的概念?
因为大家买手机的时候,往往会听到另一个叫ppi的参数,这个在手机屏幕中指的也是像素密度,但是这个是物理上的概念,它是客观存在的不会改变。dpi是软件参考了物理像素密度后,人为指定的一个值,这样保证了某一个区间内的物理像素密度在软件上都使用同一个值。这样会有利于我们的UI适配。
比如,几部相同分辨率不同尺寸的手机的ppi可能分别是是430,440,450,那么在Android系统中,可能dpi会全部指定为480.这样的话,dpi/160就会是一个相对固定的数值,这样就能保证相同分辨率下不同尺寸的手机表现一致。
我们可以说,通过dp加上自适应布局和weight比例布局可以基本解决不同手机上适配的问题,这基本是最原始的Android适配方案。
dpi:dots per inch(每英寸点数,或者说每英寸像素数目 更易懂),即:是指屏幕上每英寸(1英寸 = 2.54 厘米)距离中有多少个像素点。如果屏幕为 320*240,屏幕长 2 英寸宽 1.5 英寸,Dpi = 320 / 2 = 240 / 1.5 = 160。
由设备决定,是写死的,可以通过context.getResources().getDisplayMetrics().densityDpi获取到。当然,也可以通过以下方法算出:
dpi=横向分辨率/横向英寸数=纵向分辨率/纵向英寸数
安卓手机种类多样,有各种屏幕像素密度。比如120dpi是低密度(ldpi)类型,160dpi 是中密度(mdpi),240dpi是高密度(hdpi),320dpi是超高密度(xhdpi),480dpi是超超高密度(xxhdpi)。
Google 规定的屏幕密度列表:
ldpi (low) ~120dpi
mdpi (medium) ~160dpi
hdpi (high) ~240dpi
xhdpi (extra-high) ~320dpi
xxhdpi (extra-extra-high) ~480dpi
xxxhdpi (extra-extra-extra-high) ~640dpi
就如有的UI给的图会有这样的标注:
屏幕快照 2019-05-21 上午10.00.15.png
5、 ppi
这个在手机屏幕中指的也是像素密度,但是这个是物理上的概念,它是客观存在的不会改变
dpi是软件参考了物理像素密度后,人为指定的一个值,这样保证了某一个区间内的物理像素密度在软件上都使用同一个值。这样会有利于我们的UI适配
6、 in
inches的缩写,英寸。就是屏幕的物理长度单位。一英寸等于2.54cm。比如Android手机常见的尺寸有5寸、5.5寸、6寸等,这里的长度都是指手机对角线的长度。
7、pt
“points” 的缩写,点。一个点等于1/72英寸,所以“点”也是个长度单位而已。
8、 Density(密度)
这个是指屏幕上每平方英寸(2.54 ^ 2 平方厘米)中含有的像素点数量。
单位的换算:
dpi与density的关系
dpi = density*160
px与density
px = density * dp
px = (dpi / 160)*dp
dp与px
px=dp*(dpi/160)
dp=px/(dpi/160)
sp与px
px=sp*(dpi/160)
sp=px/(dpi/160)
获取DisplayMetrics对象方法:
DisplayMetrics dm=new DisplayMetrics();
//获得DisplayMetrics对象方法一
//dm=context.getResources().getDisplayMetrics();
//获得DisplayMetrics对象方法二
((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(dm);
px转其他单位代码:(该方法来自TypedValue)
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;
}
另外一种px转dp的代码:
/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
dp转px:
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
作者:枫叶1234