当我们在粘贴一张图片到AS的drawable目录下的时候,不知道你有没有注意到会让你选择具体的分辨率的文件夹.
前段时间在写一个自绘VIew的时候用到了这个方法,发现返回值并不是我图片的分辨率,很是郁闷,于是乎自己就思考和实践后发现,在此记录:
1,当我们把图片粘贴到drawable目录下,默认是放在mdpi目录下的.(还有一个没有具体dpi的目录,其效果就是mdpi,不知道老外什么意思......估计应该是因为mdpi是标准dpi的原因,然后那个没有指定dpi的目录是一个简化目录,默认为标准dpi)
2,在这个目录下的图片的分辨率就相当于dp,所以也就是说粘贴进去的图片宽如果为300px,那么其宽就是300dp,所以也就可以解释为什么在这个目录下的图片如果你粘贴进去的分辨率只有300px,而却在2k屏幕的手机上不会显示的很小很小.
3,所以说,我们粘贴进去的图片,在不同的目录下,会使用不同的换算公式,换算出不同的dp值.比如是mdpi的话,1px=1dp.然后显示这张图片时就是根据这个dp值来决定具体显示多大,所以可以肯定的说,同一张图片,粘贴进不同的目录,最终显示大小不一样(已验证!!)不相信的读者可以自行去验证一下!!
通过上面的解释,就可以回答为什么getIntrinsicXXX方法获取的不直接是我们粘贴进去的图片的分辨率了,
因此可以这么说,drawable的getIntrinsicXXX()方法返回的是和设备有关的该图片占用的像素大小,其实也就是图片在不同分辨率目录下换算出来的宽高的dp值再根据当前设备分辨率再换算出来的像素宽高值,不仅drawable,bitmap的getXXX也是如此.
如果我们是从网络或者文件加载的图片,是不会换算的,图片的像素是多少就直接是多少.