android中dip、dp、px、sp和屏幕密度

1. dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA、HVGA和QVGA 推荐使用这    这个,不依赖像素。 
    这里要特别注意dip与屏幕密度有关,而屏幕密度又与具体的硬件有关,硬件设置不正确,有可能导致dip不能正常显示。在屏幕密度为160的显示屏上,1dip=1px,有时候可能你的屏幕分辨率很大如480*800,但是屏幕密度没有正确设置比如说还是160,那么这个时候凡是使用dip的都会显示异常,基本都是显示过小。 
     dip的换算: 
           dip(value)=(int) (px(value)/1.5 + 0.5) 
2. dp: 很简单,和dip是一样的。 
3. px: pixels(像素),不同的设备不同的显示屏显示效果是相同的,这是绝对像素,是多少就永远是多少不会改变。 
4.  sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。 

备注: 根据google的推荐,像素统一使用dip,字体统一使用sp  
举个例子区别px和dip:
px就是像素,如果用px,就会用实际像素画,比个如吧,用画一条长度为240px的横线,在480宽的模拟器上看就是一半的屏宽,而在320宽的模拟器上看就是2/3的屏宽了。
而dip,就是把屏幕的高分成480分,宽分成320分。比如你做一条160dip的横线,无论你在320还480的模拟器上,都是一半屏的长度。

public static int dip2px(Context context, float dipValue){ 
                final float scale = context.getResources().getDisplayMetrics().density; 
                return (int)(dipValue * scale + 0.5f); 
        } 
        
    public static int px2dip(Context context, float pxValue){ 
                final float scale = context.getResources().getDisplayMetrics().density; 
                return (int)(pxValue / scale + 0.5f); 
        } 
 
我们在页面布局的时候,经常会设置容器的长度,但是到底该使用哪个作为长度的单位而懊恼。 在Android中支持的描述大小区域的类型有以下几种。 px(pixels)——像素:不同的设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。 dip(device independent pixels)——设备独立像素:这个和设备硬件有关,一般哦我们为了支持WCGA、HVGA和QVGA推荐使用这个,不依赖于像素。等同于dp。 sp(scaled pixels—best for text size)——带比例的像素。 pt(points)——磅:1pt = 1/72英寸 in(inches)——英寸 mm(millimeters)——毫米 到底px和dip有什么区别呢? dip != px 主要是针对不同设备而言的 在Density是160的设备上,比如用AVDManager创建的默认模拟器,dip和px是一样的 但是如果同样的代码,换到不同Density的设备上,比如换到一个Density是240的设备上,dip和px体现出来的大小就不一样了 px不管在什么样的设备上都是那样长,但是dip会根据设备变化 WQVGA屏density=120;QVGA屏density=120;HVGA屏density=160;WVGA屏density=240; density值表示每英寸有多少个显示点,与分辨率是两个概念。 当屏幕density=240时使用hdpi标签的资源 当屏幕density=160时,使用mdpi标签的资源 当屏幕density=120时,使用ldpi标签的资源。 不加任何标签的资源是各种分辨率情况下共用的。 布局时尽量使用单位dip,少使用px 换算公式为 pixs = dips * (densityDpi/160). dips=(pixs*160)/densityDpi 如何获得设备的屏幕分辨率和屏幕密度: 如分辨率为480*800,密度为240的设备 DisplayMetrics dm =getResources().getDisplayMetrics(); dm.densityDpi=240 dm.widthPixels=480 dm.heightPixels=800
原文地址:https://www.cnblogs.com/bdbw2012/p/4562879.html