安卓中px,dp,dpi的概念
- 屏幕尺寸:屏幕对角线的长度,一般以英寸为单位,1英寸=2.54厘米
- px:像素。屏幕上可视的点,不随设备改变,不同设备显示效果一样。
- 分辨率:手机屏幕上水平方向和垂直方向上的像素个数,一般用:垂直个数 * 水平个数 来表示。常见的分辨率1920 *1080,1080 * 720,2160 *1080等。
- dpi:像素密度。每英寸内的像素值。例如一个分辨率480 * 360的手机,屏幕水平长2英寸,高长3英寸,则水平方向上的dpi为160,垂直方向上的dpi为160。或者知道分辨率以及屏幕尺寸,可以用勾股定理近似计算。
google将160dpi作为标准 - dp(或者dip):屏幕无关密度。是一个抽象意义上的像素,它和dpi有着直接的关系。其中px,dp,dpi之间的换算关系可以表示为以下公式:
px = dp*(dpi / 160)
也就是说:
当dpi = 160时,dp = 1,px = 1*(160 / 160) = 1,即:1dp = 1px。
当dpi = 320时,dp = 1,px = 1*(320 / 160) = 2,即:1dp = 2px。
可以把dp想象成屏幕上的一个固定大小的区域,该区域内部包含px,而内部px的个数是由dpi决定的。dpi越大,1dp内的px个数越多,当dpi = 160时,1dp内包含一个px,此时1dp和一个px大小相同。由此我们可以看出,安卓在屏幕适配是最好使用dp,不要使用px。如果使用px,现在假设有两部手机屏幕尺寸一样,分辨率不同,在小分辨率手机上像素点的大小比较大,在大分辨率的手机上像素点的大小比较小,这就导致使用相同px来设置,图形在小分辨率手机上显示偏大,在大分辨率手机上显示偏小,无法适配。因此我们在适配尺寸时用dp不要用px。相同的对于文字大小的设置google推荐我们用sp来代替px。
- density:密度。它和dpi的关系:
density = dpi / 160。
所以上面的px和dp的关系也可以用density来表示为:
px = dp*density
安卓中我们可以通过DisplayMetrics类来获取:
DisplayMetrics displayMetrics =context.getResources().getDisplayMetrics();
float density = displayMetrics.density;//密度
int densityDpi = displayMetrics.densityDpi;//dpi
int widthPixels = displayMetrics.widthPixels;//屏幕宽度
int heightPixels = displayMetrics.heightPixels;//屏幕高度
下面是px和dp互相转换的代码:
/**
* dp转px
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f); //加0.5f表示四舍五入
}
/**
* px转dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f); //加0.5f表示四舍五入
}