dp和px的区别

本文探讨了Android开发中dp和px的区别,指出dp是一种设备无关像素,旨在保证不同密度屏幕上的显示比例一致。通过dpi作为基准,1dp在160dpi屏幕上等于1px,其他密度屏幕按比例换算。Android系统通过不同的drawable目录适应不同密度的设备,并提供了getDimension系列方法来获取尺寸值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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)
QVGA2403202.6 - 3.0120
WQVGA2404003.2 - 3.5120
FWQVGA2404323.5 - 3.8120
HVGA3204803.0 - 3.5160
WVGA4808003.3 - 4.0240
FWVGA4808543.5 - 4.0240
WVGA4808004.8 - 5.5160
FWVGA4808545.0 - 5.8160

备注:只找到三种。


下面介绍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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值