安卓系统中的常用尺寸单位(dp, sp)快速入门教程

  

  

Android开发中的常用尺寸单位有如下几种:

  
      <李> dp (dip)   <李> px李   <李> pt李   <李>英寸   <李> sp
      李   
  

算不知道确切含义,相信对于以上这几种尺寸单位大家也都比较脸熟,这里先让我们重新认识一下它们:

  
      <李> dp(下降):即设备无关像素(设备独立的像素),这种尺寸单位在不同设备上的物理大小相同。   <李> px:即像素(像素),这个不用多说。李   <李> pt:通常用来作为字体的尺寸单位,1 pt相当于英1/72寸。   <李>英寸:英寸,1英寸约等于2.54厘米,主要用来描述手机屏幕的大小。   <李> sp:大部分人只知道它通常用作字体的尺寸单位,实际大小还与具体设备上的用户设定有关。(如果你对“sp”的了解停留于此,那么看完这篇文章后你会更透彻的理解它^ _ ^)
      李   
  

在上面几种常见的尺寸单位,dp和sp可以看做是虚拟尺寸。其中dp是与设备无关的虚拟像素单位,开发者为UI控件指定以迪拜为单位的大小后,在不同屏幕密度的Android设备上便能够具有相同的物理尺寸.dp的出现让开发者无需关注屏幕密度,物理像素之间的换算关系. sp则与dp相似,但它主要用作字体的尺寸单位,与dp的区别是:Android系统支持用户设定字体大小,因而sp的实际大小还会根据用户设定在原基础上进行缩放。

  

下面来详细介绍dp与sp这两种尺寸单位。

  

  

dp的全称是与设备无关的像素,在具有不同屏幕密度的设备上,1 dp的物理大小是相同的。那么,什么是屏幕密度呢?

  

<强>屏幕密度

  

手机的屏幕密度通常指的是手机屏幕的dpi(每英寸点),也就是每英寸的像素数。对于安卓手机来说,常见的dpi有如下几种:

  
      <李> ldpi:对应的dpi范围为0 ~ 120,也就是说每英寸有0到120个像素点的屏幕的屏幕密度都属于ldpi李   <李> mdpi: dpi范围为120 ~ 160李   <李> hdpi: dpi范围为160 ~ 240李   <李> xhdpi: dpi范围为240 ~ 320李   <李> xxhdpi: dpi范围为320 ~ 480
      李   
  

在实际开发中,通常以120160240320480 dpi值分别指代ldpi, mdpi, hdpi, xhdpi, xxhdpi。通常屏幕密度越大的手机显示的图像会越细腻。可以通过如下代码获取当前Android设备的屏幕密度:

        私人空间getDpi () {   .getDisplayMetrics DisplayMetrics dm=getresource () ();   日志。我(“标签”,“密度=" + dm.density);   日志。我(“标签”、“densityDpi=" + dm.densityDpi);   }      

若我们在一台屏幕密度为320 dpi的安卓手机上运行以上代码,会得到如下输出:

        密度=2   densityDpi=320      

上面输出中的densityDpi就是Android手机屏幕的dpi值,那么密度是什么呢?实际上它代表的是当前屏幕的dpi值与基准dpi值的比值,这个基准dpi值为160。
  现在我们已经理解了dpi,接下来让我们揭开dp的神秘面纱。

  

<强> dp

  

上面我们提到了选择160 dpi值作为基准屏幕密度,这个基准屏幕密度人为建立起了dp与像素间的关系:在160 dpi为Android的设备上,1 dp=1 px。假设x为某UI控件以像素为单位的大小,y为同一UI控件以迪拜为单位的大小,densityDpi表示屏幕密度,则x与y的关系为:x=y * densityDpi/160。
  

  

介绍完了dp,接下来让我们探究一下sp这个尺寸单位的真面目。

  

  

在介绍sp之前,我们先来一起看下TypedValue类中包含的一个用户将dp, sp等单位转换为px的静态方法:

        公共静态浮动applyDimension (int,浮动值,DisplayMetrics度量){   开关(单位){   案例COMPLEX_UNIT_PX:   返回值;   案例COMPLEX_UNIT_DIP:   返回值* metrics.density;   案例COMPLEX_UNIT_SP:   返回值* metrics.scaledDensity;   案例COMPLEX_UNIT_PT:   *返回值指标。xdpi * (1.0 f/72);   案例COMPLEX_UNIT_IN:   返回值* metrics.xdpi;   案例COMPLEX_UNIT_MM:   *返回值指标。xdpi * (1.0 f/25.4华氏度);   }   返回0;   }      

若要将dp转换为px,会执行如下代码:

        返回值* metrics.density;      

密度我们在前面介绍过,指的是当前dpi与基准dpi(160)的比值.density的计算方式就是当前屏幕的dpi除以160。也就是说,在屏幕的dpi为120160320480时,密度的值分别为0.75,1,2,3。

安卓系统中的常用尺寸单位(dp, sp)快速入门教程