一、相关概念
- px(pixel):像素。像素这个概念平时生活中经常遇到,是作为图像构成的基本单元,单个像素的大小并不固定,跟随屏幕大小和像素数量的关系变化(屏幕越大,像素越低,单个像素越大,反之亦然)。所以在使用像素作为设计单位时,在不同的设备上可能会有缩放或拉伸的情况。
- dpi:像素密度。是指屏幕上每英寸(1英寸 = 2.54 厘米)距离中有多少个像素点。如果屏幕为 320*240,屏幕长 2 英寸宽 1.5 英寸,Dpi = 320 / 2 = 240 / 1.5 = 160。
- dp/dip(device independent pixels):设备独立像素。也可以叫做dp,长度单位,同一个单位在不同的设备上有不同的显示效果,具体效果根据设备的密度有关。也就是我们经常在写layout的时候使用的尺寸单位。
- sp:sp是开发写layout时关于字体的字号单位,且dp与sp总为1:1关系。
在我们实际开发中,因为要支持手机上的多种分辨如WVGA、HVGA和QVGA,都会使用dp/dip作为长度的单位。Android系统定义了四种像素密度:ldpi(120dpi)、mdpi(160dpi)、hdpi(240dpi)、xhdpi(320dpi)。dp和px的关系:px = dp * (dpi / 160),因此它们对应的dp到px的系数分别为0.75、1、1.5和2,这个系数乘以dp长度就是像素数。例如界面上有一个长度为“80dp”的图片,那么它在240dpi的手机上实际显示为80×1.5=120px,在320dpi的手机上实际显示为80×2=160px。如果你拿这两部手机放在一起对比,会发现这个图片的物理尺寸“差不多”,这就是使用dp作为单位的效果。sp则作为字体的单位。
二、dip和px之间的转换
- dip转换为px:
public static int diptopx(Context context, float dipValue){
final float scale = context.getResources().getDisplayMetrics().density;
return (int)(dipValue * scale + 0.5f);
}
- px转换为dip:
public static int pxtodip(Context context, float pxValue){
final float scale = context.getResource().getDisplayMetrics().density;
return (int)(pxValue / scale + 0.5f);
}
三、如何获取屏幕分辨率
DisplayMetrics metric = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metric);
int width = metric.widthPixels; // 屏幕宽度(像素)
int height = metric.heightPixels; // 屏幕高度(像素)
float density = metric.density; // 屏幕密度(0.75 / 1.0 / 1.5)
int densityDpi = metric.densityDpi; // 屏幕密度DPI(120 / 160 / 240)
tips:假设你是用java代码作图时,比如canvas.drawCircle()
画圆时,半径的单位为px,可以先把你要设置的大小的dp转换为px,这样在可以匹配不同分辨率手机。