简述Android单位dp、sp、dip、px、等的区别和使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Ae_fring/article/details/52126177

 废话就不多说了,直接说重点。首先解释下这几个单位的代表意思。

由于过去通常以像素为单位设计计算机用户界面。当一个像素在80x80的时候,在高分辨率显示器上运行该程序,则用户界面会显得很小。所以采用与分辨率无关的度量单位来开发程序就能够解决这个问题。而Android应用开发支持不同的度量单位。

一.解释下:

dip: device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持 WVGA、HVGA和QVGA 推荐使用这个,不依赖像素。

dp: dip是一样的

px: pixels(像素). 不同设备显示效果相同,一般我们HVGA代表320x480像素,这个用的比较多。

pt: point,是一个标准的长度单位,1pt=1/72英寸=0.035厘米,用于印刷业,非常简单易用;
sp: scaled pixels(放大像素). 主要用于字体显示best for textsize。

in(英寸):长度单位。 1英寸=2.54厘米(约);
mm(毫米):长度单位。

当然我们光是了解不会用那就不行了。

二.度量单位的换算公式

在android源码包TypedValue.java中,我们看如下函数:

    public static float applyDimension(int unit, float value, DisplayMetrics metrics) {

        switch (unit) {

        case COMPLEX_UNIT_PX:

            return value;

        case COMPLEX_UNIT_DIP:

            return value * metrics.density;

        case COMPLEX_UNIT_SP:

            return value * metrics.scaledDensity;

        case COMPLEX_UNIT_PT:

            return value * metrics.xdpi * (1.0f/72);

        case COMPLEX_UNIT_IN:

            return value * metrics.xdpi;

        case COMPLEX_UNIT_MM:

            return value * metrics.xdpi * (1.0f/25.4f);

        }

        return 0;

    }

   该函数功能:是把各单位换算为像素。

   metrics.density:默认值为DENSITY_DEVICE / (float) DENSITY_DEFAULT;

   metrics.scaledDensity:默认值为DENSITY_DEVICE / (float) DENSITY_DEFAULT;

   metrics.xdpi:默认值为DENSITY_DEVICE;

   DENSITY_DEVICE:为屏幕密度

   DENSITY_DEFAULT:默认值为160

然后我们还得了解Android有哪些屏:如下表

屏幕

Tyep

宽度

Pixels

高度

Pixels

尺寸

Range(inches)

屏幕密度

QVGA

240

320

2.6-3.0

low

WQVGA

240

400

3.2-3.5

low

FWQVGA 

240

432

3.5-3.8

low

HVGA 

320

480

3.0-3.5

Medium

WVGA 

480

800

3.3-4.0

High

FWVGA

480

854

3.5-4.0

High

WVGA

480

800

4.8-5.5

Medium

FWVGA 

480

854

5.0-5.8

Medium

备注

目前android默认的low=120 ;Medium =160; High = 240

px和dip的区别
px就是像素的意思:1px代表屏幕上一个物理的像素点;所以用像素相当于实际像素画。那么100px的图片不同的手机上就会出现大小不一样。就向100长度的线在200屏幕宽上显示的就是一半,而在300屏幕上就只占用了1/3。

dip与dp完全相同,只是名字不同而已。在早期的Android版本里多使用dip,后来为了与sp统一就建议使用dp这个名字了。这里就细细解释下dp:它与“像素密度”密切相关,所以首先我们解释一下什么是像素密度?

像素密度:假设手机屏幕分辨率为240x320,屏幕的物理尺寸为1.5英寸x2英寸,(1英寸(in)=2.54厘米(cm)),那么每英寸包含的像素点的数量为240/1.5=160dpi(宽)或320/2=160dpi(高),160dpi就是这部手机的像素密度。

刚才表中已经说明了Android手机分(low=120 ;Medium =160; High = 240,VeryHigh=320)低,中,高,超高四等密度,而他们对应的dp到px的系数分别为0.75、1、1.5和2,这个系数乘以dp长度就是像素数。

最后:在大小屏幕相同,分辨率不一样时候(480x320分辨率或者800x480),假设一个80dp长度的图片,换算成240dpi的手机上实际显示为80x1.5=120px,在320dpi的手机上实际显示为80x2=160px,这样使用dp就感觉差别不是很大了。

sp:

与缩放无关的抽象像素(Scale-independent Pixel)。sp和dp很类似但唯一的区别是,Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),当文字尺寸是“正常”时1sp=1dp=0.00625英寸,而当文字尺寸是“大”或“超大”时,1sp>1dp=0.00625英寸。类似我们在windows里调整字体尺寸以后的效果——窗口大小不变,只有文字大小改变。

        使用建议文字的尺寸一律用sp单位,非文字的尺寸一律使用dp单位。例如textSize="16sp"、layout_width="60dp";偶尔需要使用px单位,例如需要在屏幕上画一条细的分隔线时:

         欢迎各位留言指点。

猜你喜欢

转载自blog.csdn.net/Ae_fring/article/details/52126177