当前位置: 首页 > news >正文

android 不同分辨图片放错对应文件夹会怎样?

多年前有人问过我这个问题,当时没太了解这个东西,觉得是无所谓的东西,不过没答上来这个问题还是让我记了很久。

今天又看到有人发文章讨论这个问题,我也就特意再研究下。

1,了解一下Android分辨率是什么。

2,同一个元素在不同分辨率下,应该如何准备图?

3,图片错放的情况:一,大图放小文件夹;二,小图放大文件夹。

4,Android中图片是怎么显示的。

1.Android分辨率

Android 的 res/drawable-ldpi/drawable-mdpi/drawable-hdpi/drawable-xhdpi/ 等文件夹,本质上是给不同 屏幕密度 (dpi) 的设备提供最合适的图片资源。

  • ldpi ≈ 120 dpi

  • mdpi ≈ 160 dpi(基准)

  • hdpi ≈ 240 dpi

  • xhdpi ≈ 320 dpi

  • xxhdpi ≈ 480 dpi

  • xxxhdpi ≈ 640 dpi

系统会根据设备屏幕的 density 去选择匹配文件夹中的资源。

2. 同一个元素在不同分辨率下,应该如何准备图?

Android 的多分辨率机制就是:同一个逻辑大小 (dp),用不同像素密度的图去填充

例如,设计稿上一个按钮是 100dp × 100dp

densitypx 换算结果应该提供的图尺寸
mdpi (160dpi)100px × 100px100×100
hdpi (240dpi)150px × 150px150×150
xhdpi (320dpi)200px × 200px200×200
xxhdpi (480dpi)300px × 300px300×300
xxxhdpi (640dpi)400px × 400px400×400

这样,系统才能在不同密度下,保证 UI 逻辑大小一致,看起来一样大且清晰

3.图片错放的情况

3.1大图放到小文件夹

如:xhdpi的图(200*200)放到了mdpi(本来只需要100*100就能满足)的文件夹,Android还是会按照图片本来的规格显示成200*200的图片,相当于用犀牛拉磨,确实有点浪费内存,但并没有使用多内存。因为你放错了,它本来解析这张200*200的图片需要多少内存还是多少,只是比100*100要用的多。

3.2小图放大文件夹

如:mdpi的图(100*100)放到了xhdpi(本来需要200*200)的文件夹,Android还是会按照图片本来的规格显示成100*100的图片,但是本文件夹是需要200*200的,会补足没有用完的内存,但是会放大图片,导致显示模糊,没有浪费内存,本来就该用200*200的,只是效果不好。

4.Android 图片显示流程

4.1. 资源目录与密度分类

Android 为了适配不同屏幕密度,把图片放在不同目录:

  • drawable-mdpi/ → 160dpi(基准密度)

  • drawable-hdpi/ → 240dpi

  • drawable-xhdpi/ → 320dpi

  • drawable-xxhdpi/ → 480dpi

  • drawable-xxxhdpi/ → 640dpi

你在布局里用 @drawable/xxx 引用时,系统不会直接找“文件名”,而是根据 当前设备的屏幕密度 (dpi) 去选择最合适的资源目录。


4.2. 系统选择资源的逻辑

假设设备是 xxhdpi (480dpi),系统会按以下规则找:

  1. 首先找 drawable-xxhdpi/,有的话直接用。

  2. 如果没有,就找最接近的目录(比如 xhdpi/xxxhdpi/)。

  3. 找到后,如果资源和设备 density 不匹配,会自动缩放解码

    • 比设备密度低 → 解码时放大。

    • 比设备密度高 → 解码时缩小。

例子:

  • 设备是 xxhdpi (480dpi),但你只有 drawable-mdpi/

    • 系统会拿 mdpi 图,按 3× 放大解码。


4.3. 显示时的过程

  1. 系统 decodeResource() → 把压缩文件 (PNG/JPG/WebP) 解码成 Bitmap 像素矩阵

    • 如果目录和设备 density 不一致,会在这里 自动缩放像素矩阵

    • 这一步决定了 Bitmap 的实际像素大小,进而决定内存占用。

  2. 把 Bitmap 交给 Canvas/GPU 去绘制到屏幕上。

    • 这时再根据 控件大小(以 dp 为单位换算 px) 进行绘制缩放。

    • 这一阶段只影响显示效果,不改变内存。


4.4. 文件夹缺失时怎么办?

如果某个密度目录缺图,系统会这样处理:

  • 优先找最近的目录

    • 例如:xxhdpi 缺图 → 系统可能用 xhdpi 图放大 1.5×,或者 xxxhdpi 图缩小 0.75×。

  • 如果所有密度目录都没有,但 drawable/ 目录(无后缀)里有 → 就用这个(不会缩放)。

  • 如果连 drawable/ 都没有 → 直接报错 Resources$NotFoundException


4.5. 特殊情况

  • mipmap/ 文件夹:逻辑和 drawable/ 一样,只是 Google 推荐用来放应用图标。

  • drawable-nodpi/:放在这里的图片 不会被自动缩放,无论设备 density。

  • VectorDrawable:矢量图与 density 无关,系统会在绘制时直接放大/缩小,不存在缺失问题。


5.总结

  • Android 显示图片的流程:
    选择资源目录 → 解码为 Bitmap(可能缩放)→ 控件绘制(可能再缩放)

  • 文件夹缺失时:系统会自动选择最接近的 density 目录,必要时缩放 → 如果完全没有,就报错。

  • 最佳实践:为主流 density 提供对应图(至少 mdpi、xhdpi、xxhdpi),小图标建议用 VectorDrawable,能避免内存浪费和模糊。

  • 是需要注意别放错文件夹,但是如果总是深究这些细枝末节,就太浪费时间吹毛求疵了,技术的热爱大家各有方向,知道不代表你厉害,不知道也不代表你不行。

  • 祝安好~

http://www.dtcms.com/a/356836.html

相关文章:

  • Python 编码与加密全解析:从字符编码到 RSA 签名验证
  • (笔记)Android ANR检测机制深度分析
  • 【微知】如何撤销一个git的commit?以及撤销的3种方式?
  • 多代理系统架构:Supervisor 与 Swarm 架构详解
  • Java面试-MySQL事务
  • Word文档怎么打印?Word打印技巧?【图文详解】单面/双面/指定页面/逆序等Word打印选项
  • 微信小程序中蓝牙打印机中文编码处理:使用iconv-lite库
  • Java 大视界 -- Java 大数据在智能安防入侵检测系统中的多模态数据融合与检测精度提升(405)
  • 将数据赋值到多个文档里,并将多个word放入压缩包并下载
  • Elasticsearch 9.X 使用推理 API 进行语义搜索
  • JAVA 请求第三方接口,将JSON数据转为对象
  • 微软正在公开测试其首个完全自主训练的大语言模型——MAI-1-preview
  • week5-[二维数组]翻转
  • 【性能优化】Unity 渲染优化全解析:Draw Call、Batch、SetPass 与批处理技术
  • 整理python接口自动化相关——10、自动考虑点(待续)
  • 动态规划--Day02--爬楼梯--2466. 统计构造好字符串的方案数,2533. 好二进制字符串的数量,2266. 统计打字方案数
  • 匠心传承,古韵新生——记木雕名家龙巍的艺术人生
  • v-model与v-bind区别
  • 吴恩达机器学习作业五:神经网络正向传播
  • Python Imaging Library (PIL) 全面指南:PIL基础入门-图像合成与处理技巧
  • 基于 Python asyncio 和币安 WebSocket 打造高频加密货币预警机器人
  • TypeScript: Reflect.ownKeys 操作(针对 Symbol)
  • Lenovo C225 一体机拆机维修教程
  • 2025牛客暑期多校训练营4 G Ghost in the Parentheses 题解记录
  • LoRA三种不同训练流程在配置和保存权重的差异(64)
  • 《Shell 大道:筑基篇(下)—— 流控筑根基,数据任驱驰》
  • shell学习笔记-实战:创建、运行与变量操作
  • Python Imaging Library (PIL) 全面指南:PIL基础入门-构建简易图像编辑器
  • matlab利用模糊算法控制PID参数实现模糊控制
  • LabVIEW实现跨 VI 簇按钮控制功能