先说结论:

不同drawable文件下图片在同一手机图片尺寸是不同的

同一个drawable文件夹下的图片在不同分辨率的手机图片尺寸是不同的

先聊下DP

android 一倍图二倍图_缩放

要在密度不同的屏幕上保留界面的可见尺寸,您必须使用密度无关像素 (dp) 作为度量单位来设计界面。dp 是一个虚拟像素单位,1 dp 约等于中密度屏幕(160dpi;“基准”密度)上的 1 像素。对于其他每个密度,Android 会将此值转换为相应的实际像素数。

例如,考虑图 1 中的两部设备。如果将某个视图定义为“100px”宽,那么它在左侧设备上看起来要大得多。因此,您必须改用“100dp”来确保它在两个屏幕上看起来大小相同。

将 dp 单位转换为像素单位

在某些情况下,您需要以 dp 表示尺寸,然后将其转换为像素。dp 单位转换为屏幕像素很简单:

px = dp * (dpi / 160)

密度限定符

android 一倍图二倍图_android 一倍图二倍图_02

系统都会根据屏幕的 dpi 选择适当的位图。如果您没有为某个密度提供特定于密度的资源,那么系统会选取下一个最佳匹配项并对其进行缩放以适合屏幕。

提示:如果您有一些不想让系统缩放的可绘制资源(可能是因为您要在运行时自行对图片做一些调整),则应将这些资源放在带有 nodpi 配置限定符的目录中。带有此限定符的资源被视为与密度无关,系统将不会对它们进行缩放。

问题

1 为什么这张 720x1280 图片放到 锤子T1 的 xxhdpi 目录下,能够以 720x1280 的尺寸加载进内存?

1080p的锤子T1手机,ppi=445,和 xxhdpi 目录(320ppi ~ 480ppi)的缩放比是匹配的 ,

所以锤子T1手机从drawable-xxhdpi文件夹加载一个尺寸是720x1280的图片,加载到内存后的图片的尺寸也是720x1280。

2 为什么这张 720x1280 图片放到锤子T1的 drawable-hdpi 目录下,加载进内存的宽高为1440x2560?

上面说过,适用于锤子T1手机的是drawable-xxhdpi,但是图片放在了hdpi文件夹下,为了在屏幕上显示相同的dp,所以必然会导致图片的缩放。那么到底应该缩放多少倍呢?

看上图,hdpi对应的缩放比是1.5(1dp代表2个像素),xxhdpi对应的缩放比是3(1dp代表3个像素)。

那么放在drawable-hdpi下的图片,为了能在锤子T1手机上显示相同的dp,就需要缩放3 / 1.5 = 2倍。

(这也很好理解,本来应该缩放为3倍,现在才缩放了1.5倍了,所以还需要再缩放2倍)

所以这张 720x1280 图片放到锤子T1的 drawable-hdpi 目录下,加载进内存后,缩放了2倍,图片宽高变为1440x2560?

扩展

DPI/PPI

DPI = Dots Per Inch:屏幕每英寸对应多少个物理点

PPI = Pixel Per Inch:屏幕每英寸对应多少个像素点

两个参数的区别就在于Dot和Pixel的区别,dot值的是显示器上每一个物理的点,而pixel指的是屏幕分辨率中的最小单位。这个两个难道会不一样么?会!当一个像素需要多于一个屏幕上的物理点来显示的时候dot就跟pixel不一样了。这个有另一个叫法叫做dppx(dot per pixel),即每个像素中有多少个点。大部分的显示器中一个像素即一个点,但目前一些比较好的屏幕和一些手机屏幕中dppx会大于1。比如说Mac Retina,iPhone,HTC One等。

总结来说我们一般针对Android手机说的 dpi 和 ppi 是等价的。

Android adb 修改手机分辨率与DPI
// shell
adb shell
// 修改分辨率
wm size 1080x1920
// 修改dpi
wm density 480
查看
wm size
wm density
// 重置
wm size reset
wm desity reset