dp和px的区别

dp和px的区别,baidu一下已有很多很好的解释。本篇主要把自己的理解加了进入。当然也便于自己加深一下印象,不用以后用到,或者被领导问起,再去baidu查一下。


像素点:显示屏显示画面的最小发个单位。
px:屏幕的像素点,也成像素。
dpi:像素密度,一英寸包含的像素数。常见120,240,360。
分辨率:纵横方向上的总像素数,比如:480X800,320X480。
dp:设备无关像素。


像素点和px很好理解。dpi和分辨率可能会有混淆。其实像素密度是用来表示一个屏幕的分辨能力的。分辨率只是表示屏幕的总像素数。但实际中,人们更多的会使用分辨率去描述屏幕分辨能力的好坏。这是不准确的。对于同等大小的设备,这么说是没问题的。因为总像素数越多,密度就越大,当然分辨能力越好。

dpi很少被用来衡量屏幕分辨能力的好坏,这个原因不太清楚。但是为了更好的统一规范,每个设备的dpi不是任意设定的。一般只有120/160/240/320/480 五种。这5种对应特定的分辨率设备:

屏幕(Type) 宽度(Pixels) 高度(Pixels) 尺寸(inches) 密度(dpi)
QVGA 240 320 2.6 - 3.0 120
WQVGA 240 400 3.2 - 3.5 120
FWQVGA 240 432 3.5 - 3.8 120
HVGA 320 480 3.0 - 3.5 160
WVGA 480 800 3.3 - 4.0 240
FWVGA 480 854 3.5 - 4.0 240
WVGA 480 800 4.8 - 5.5 160
FWVGA 480 854 5.0 - 5.8 160

备注:只找到三种。


下面介绍dp的概念,其实它也是像素,只是它不依赖于设备。

那么如何不依赖于设备去定义一个图片的大小呢?这里说的不依赖于设备,是图片的大小相对于不同设备屏幕大小的比例是一样的。如果一个图片100px宽,在FWVGA 比在QVGA显示肯定会明显的要小很多,虽然它们的实际显示的宽度是一样的。为了使得dp不依赖设备,这里就要用到dpi。dpi的大小其实是约定好的,只会有120/160/240/320/480这几种,我们选其中一种作为基准来定义dp:
在屏幕密度为160dpi的情况下, 1dp = 1px。
有了这个基准,其他设备就能很快换算出它的展示大小。比如240dpi的设备,1dp = 1.5px。

通过dpi和一个基准的定义,我们就使得dp对与开发者来说是不依赖于设备的了。


在android开发里,度量的定义一般都在drawable目录下的dimen里,对于不用设备,这个drawable目录是不一样的:

drawable-ldpi: 屏幕密度为120的手机设备
drawable-mdpi: 屏幕密度为160的手机设备
drawable-hdpi: 屏幕密度为240的手机设备
drawable-xhdpi: 屏幕密度为320的手机设备
drawable-xxhdpi:屏幕密度为480的手机设备

那么获取像素大小的方法有:

getDimension
getDimensionPixelOffset
getDimensionPixelSize

在dimen.xml里定义三个长度:

<dimen name="a">16dp</dimen>    
<dimen name="b">16px</dimen>    
<dimen name="c">16sp</dimen>

获取定义的值:

float a1=getResources().getDimension(R.dimen.a);    
int a2=getResources().getDimensionPixelOffset(R.dimen.a);    
int a3=getResources().getDimensionPixelSize(R.dimen.a);    

float b1=getResources().getDimension(R.dimen.b);    
int b2=getResources().getDimensionPixelOffset(R.dimen.b);    
int b3=getResources().getDimensionPixelSize(R.dimen.b);    

float c1=getResources().getDimension(R.dimen.c);    
int c2=getResources().getDimensionPixelOffset(R.dimen.c);    
int c3=getResources().getDimensionPixelSize(R.dimen.c); 

getDimension和getDimensionPixelOffset的功能差不多,都是获取某个dimen的值。如果是dp或sp的单位,将其乘以density,如果是px,则不乘;两个函数的区别是一个返回float,一个返回int.
getDimensionPixelSize则不管写的是dp还是sp还是px,都会乘以denstiy。

猜你喜欢

转载自blog.csdn.net/weixin_38801333/article/details/76640264