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

来源:互联网 发布:网络发国际传真 编辑:程序博客网 时间:2024/06/06 02:44

一、相关概念

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

阅读全文
0 0
原创粉丝点击