Android的手机多种多样,不同手机的屏幕密度也不同,故在相同物理尺寸下的所包含的像素点是不同的。
开发使用
在日常开发中,界面的xml文件中我们使用的是 dp 的单位,但是开发中使用的Android 的 API 则是 px。对于xml文件,系统在进行界面绘制时,会根据手机屏幕密度计算出对应的像素尺寸,所以我们在编写代码需要进行适配,根据不同手机屏幕的密度设置像素尺寸。
密度是单位体积的质量,所以相同物理尺寸下的屏幕区域中,密度越大,那么这块区域内的像素点也就越多。如果在代码中添了设计给的像素尺寸,那么在密度大的手机上,实际的显示效果就会比设计图上的小了。
dp与px转换公式
px = dp * (dpi / 160)
dp = px / (dpi / 160)
这个公式的由来是因为,android官方规定,在dpi为160的设备下,1dp = 1px,其中 dpi / 160 也称之为密度。那么在320dpi设置下,1dp = 2px。
Google的官方文档给出过解释,因为第一款 Android 设备( HTC 的T-Mobile G1)是属于(注意,是属于,不是等于)160dpi的,
dp 与 px 转换代码
public static int dipToPx(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
public static int pxToDip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
在代码中转换时最后加上了0.5f,Android官方文档给的解释是为了向上取整,这样转换也就更精确
相关概念
DPI
DPI 全称为 Dots Per Inch. (Inch的含义是英寸),意思也就是『一英寸内点的个数』。Android 设备采用 DPI 来表示屏幕的『密度』。DPI 原本是印刷行业的概念,意思是一英寸内有多少个墨点。
PPI
PPI(Pixels Per Inch) 意思是『每英寸内的像素数』,这是通用的概念
屏幕尺寸
手机所说的5.0寸指的是屏幕对角线的长度为5.0英寸。1英寸 = 2.54cm
分辨率
指的是屏幕的像素总数,1920 X 1080 的分辨率指的屏幕是由长为1920个像素点,宽为1080个像素点所组成的长方形区域。
屏幕密度
可以通过屏幕的长宽算出对角线的长度除以对角线的长度,就可以算出每英寸的屏幕密度
px
px 就是像素 pixel 的缩写。1px 代表一个显示设备中的一个像素点。
dp
DP 或者 DIP 叫做(Density-Independent pixel),Android 中的特有单位,它的大小是由操作系统根据手机屏幕密度动态渲染出来的,1dp 对应多少 px 在不同的设备上,可能是不一致的。