BitmapDrawable.getIntrinsicWidth()和getIntrinsicHeight()理解

       在使用TextView的android:drawableLeft或者android:drawableRight属性的时候,突然想到一个问题:同样的图片在不同分辨率的机器上所占的空间是一样的吗?

       出乎意料,居然一样!说明不同的像素密度的机器上图片的像素是不一样的。遂看源码,过程比较啰嗦。直接贴出结论吧。

       一般使用的都是BitmapDrawable,其尺寸由getIntrinsicWidth和getIntrinsicHeight给出。以IntrinsicWidth为例,它的计算公式为

    1、             ((size * tdensity) + (sdensity >> 1)) / sdensity 

 size代表bitmap的width ,tdensity表示目标像素密度,sdensity 是机器像素密度,放在res文件夹下的图片都是tdensity=sdensity。也就是说同样的图片在不同像素密度的情况下size是不一样的这是因为Resources在解释图片的时候做了转换(具体看源码):

    2、               size = width * sdensity/indensity  

width为图片的真实的宽度,indensity由图片所在的文件夹决定(例如在drawable-mdpi下的 indensity=160)。

       举个例子,图片a的真实像素为48*48,假如a放在drawable-hdpi下,在像素密度为240的机器中生成的BitmapDrawable的IntrinsicWidth和IntrinsicHeight为48*48;在像素密度320的机器中为72*72,在像素密度160的机器中为32*32。在屏幕上占的空间都一样为24dp * 24dp。

       对于不在res资源文件夹下的图片,生成的Bitmap像素跟原图片的像素一样;但是通过此Bitmap生成的

BitmapDrawable,如果没有指定Resources的话tdensity默认为160(具体rom可能有偏差);由公式1得出的IntrinsicWidth和IntrinsicHeight不一定和图片原本的像素一致。

猜你喜欢

转载自yezimianbao.iteye.com/blog/2068655