Android应用不同分辨率图片的资源目录存放规则相关咨询
Android drawable资源dpi适配相关问题解答
首先先明确Android系统加载drawable资源的核心逻辑:
无特殊后缀的drawable文件夹默认等效dpi为mdpi(160dpi),系统加载资源时会以当前设备的dpi为基准,优先匹配对应dpi文件夹下的资源,未匹配到对应资源时会向上/向下查找其他dpi文件夹的资源,最终按**(设备dpi ÷ 资源所在文件夹的基准dpi)**的比例对图片做缩放处理,图片最终占用的内存和缩放后的像素面积成正比。
以下是针对你三个问题的具体解答:
是否需要将不同分辨率的图片分别放到对应dpi的资源文件夹中?
这是Android官方推荐的最优实践,但不属于强制要求,你可以根据应用的适配范围灵活调整:
- 如果你的应用对显示精度要求高、需要覆盖从ldpi到xxxhdpi全档位设备,建议按规格切多套图分别放到对应dpi文件夹
- 如果你的应用仅面向中高端设备,只提供xxhdpi或xxxhdpi单套图也可正常运行,注意保证单套图的原始分辨率符合对应dpi的规格即可(比如xxhdpi下1dp对应3px,要显示为48dp的图标,原始分辨率要做到144px)
分文件夹放置不同分辨率图片是否会产生实际效果差异?
存在非常明显的实际差异,主要体现在三个方面:
- 显示效果差异:对应dpi文件夹的图片加载时不会被缩放,像素点可以和设备屏幕物理像素完全对齐,不会出现边缘发虚、模糊的问题;仅用单套高dpi图时,低dpi设备会自动缩小图片,小尺寸图标细节会有损失;仅用单套低dpi图时,高dpi设备放大图片后会出现明显的模糊锯齿
- 内存占用差异:你之前遇到的OOM就是不合理的资源放置导致的,如果你把xxhdpi规格的144px图标放到默认
drawable(mdpi基准)文件夹,在xxhdpi设备上加载时会被放大3倍到432px,内存占用直接变成原始的9倍(像素面积为平方关系),很容易触发内存溢出;放到对应dpi文件夹时不会产生额外缩放,内存占用为最优值 - 安装包体积差异:仅放单套图可以有效压缩安装包体积,放多套对应dpi的图会增大包体积,你可以根据应用的用户群体和体验要求做取舍
将低分辨率的图片放在drawable-xxhdpi文件夹中,Android系统是否会对该图片进行缩放?
系统是否缩放图片和图片本身的原始分辨率无关,仅和资源所在文件夹的基准dpi、当前运行设备的dpi有关:
- 如果当前设备为xxhdpi:系统认为该文件夹下的所有图片都符合xxhdpi规格,不会做任何缩放,低分辨率的图片会显示为比你预期更小的尺寸,且清晰度过低
- 如果当前设备dpi低于xxhdpi(比如mdpi、hdpi、xhdpi):系统会按比例缩小图片,低清图片缩小后会进一步丢失细节,显示尺寸也会比预期更小
- 如果当前设备dpi高于xxhdpi(比如xxxhdpi):系统会按比例放大图片,本身分辨率不足的图片放大后会出现明显的模糊、锯齿
如果你完全不需要系统对图片做任何缩放,可以将图片放到drawable-nodpi文件夹,该文件夹下的资源会忽略设备dpi直接按原始分辨率加载,不会触发任何缩放逻辑。
内容的提问来源于stack exchange,提问作者sotiris
相关产品推荐
相关产品推荐

