Android中dp的概念

以前刚接触Android时就知道一个概念:由于android设备种类繁多,屏幕分辨率的ppi(pixels per inche,有时也叫dpi dots per inch)也各有不同,因此定义大小时如果使用像素(pix)作为单位的话,必然导致在不同设备上看起来不一样大小,甚至差别很大。比如一张160px大小的控件,在160ppi的屏幕上看,刚好是1英寸;但是到了240ppi的屏幕上,就只有2/3英寸了,这个差别,对于布局来说,是毁灭性的。

于是为了保证在不同设备上定义的控件尺寸都一样,一般的教程上都推荐使用dp(就是dip,device independent pixels)作为单位,文字使用sp(scaled pixels)。dp的原理是这样的,对于160ppi的分辨率,1dp=1px;对于其他分辨率
1dp=(trueppi/160)px(1)
其中的trueppi就是设备的实际分辨率。这样,对于上面的例子,如果定义控件的尺寸为160dp,那么在160ppi的屏幕上,它的大小仍旧为1英寸;在240ppi的屏幕上,由于1dp=240/160=1.5px,所以160dp就相当于160*1.5px=240px,也是1英寸。这就保证了使用dp定义的尺寸,在各种设备上都是一样的。

故事讲到这里,一切都合情合理,但如果真这么简单,那今天这篇博文就不用写了。我们知道,实际中的屏幕ppi都是各种规格都有,217ppi,257ppi等等,按照上面的换算关系,160dp的尺寸会换算出各种大小的px来。对于形状,文字等,没什么问题,因为都是矢量图嘛,缩放不影响清晰度。但是对于图片,这就带来了问题。Android规定为了适配不同屏幕,必须对drawable资源提供四种不同分辨率的资源文件,分别为: ldpi(120),mdpi(160),hdpi(240),xhdpi(320)。比如对于一张160px的图片,在hdpi的屏幕上就会显得很小,因此需要为hdpi专门提供一个大小240px的图片,这样在hdpi下也是1英寸。问题来了,假设我的屏幕分辨率是257dpi的,那么我定义一个160dp的控件来容纳这张图片,按照换算关系,就应该是257px,此时图片就比控件小了。解决这个问题的一个办法是把图片改成257px的,但屏幕规格千千万,碰到其他dpi不同的,尺寸还是会有偏差。另外也可以把240px的图片强制缩放成257px,但图片不同于矢量,缩放会引起清晰度的下降。

实际情况是,android就硬性地把屏幕分成四类,对于dp和px的转换,实际上并不严格按照(1)式换算,而是先把屏幕分类,再按该类分辨率的标准来换算。所以对于257dpi的屏幕,android系统认为它是hdpi设备,所以160dp并不是换算成257px,而是换算成240px。这样,以160dp定义的控件和以240px提供的hdpi图片资源就能在像素尺寸上统一起来了。提供资源图片的时候,只要提供120px,160px,240px,320px这四种规格的图片分别放在对应的drawable-#dpi下面就可以了。这样的做的代价是160dp在不同设备上物理尺寸并不严格等于1英寸,比如在180dpi和220dpi(它们都属于mdpi)上,物理尺寸就会有差别。带来的好处是资源只需要提供四种规格。

本文参考了这篇博客
http://blog.csdn.net/findsafety/article/details/9129831

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值