您的位置:首页 > 移动开发 > Android开发

android 中 dp(dip),dpi,px,sp概念以及联系

2017-10-15 18:15 519 查看

一、相关概念

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,这样在可以匹配不同分辨率手机。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android dp sp 单位转换