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.pswp.cn/news/920505.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920505.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

48.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--集成网关--解决Refit接口调用未授权的访问问题

我们在项目中集成了Refit,但是在调用接口时,出现了问题,提示未授权的访问。这个问题是怎么导致的呢?我们该怎么处理呢?在这篇文章中我们一起来解决吧。 一、为什么会出现这个问题 让我们来深入分析一下是哪里返回的未授…

nacos登录认证

先看一个现象bootstrap.yml配置如下:spring:application:name: myservicecloud:nacos:discovery:server-addr: 127.0.0.1:8848username: nacospassword: nacosconfig:prefix: testfile-extension: ymlusername: nacos123password: nacos注意:配置中nacos…

论文阅读:arixv 2025 WideSearch: Benchmarking Agentic Broad Info-Seeking

WideSearch:大规模信息检索基准测试 https://arxiv.org/pdf/2508.07999 字节:Agent大规模信息获取基准WideSearch WideSearch:揭示 AI 智能体缺失的「广度」能力 Project Page: https://widesearch-seed.github.io/ get the data&#x…

【Docker基础】Docker-compose进阶配置:资源限制与高可用部署

目录 引言 1 Docker资源限制基础概念 1.1 为什么需要资源限制 1.2 Docker资源限制的类型 2 CPU与内存资源限制配置 2.1 传统资源限制方式(version 2) 2.2 现代资源限制方式(version 3 deploy.resources) 关键参数解释&…

SQL优化--OR

优化 SQL 中的 OR 条件是一个非常常见的性能调优问题。OR 操作符经常会导致性能下降,因为它使得数据库优化器难以高效地使用索引。下面我将从浅入深地为你讲解优化 OR 的多种策略,并附上示例。为什么 OR 性能往往较差?在简单的 WHERE 子句中&…

Java试题-选择题(21)

Java试题-选择题(21) 题目 有关线程的叙述正确的是 ? A:可以获得对任何对象的互斥锁定 B:通过继承Thread类或实现Runnable接口,可以获得对类中方法的互斥锁定 C:线程通过使用synchronized关键字可获得对象的互斥锁定 D:线程调度算法是平台独立的 下面有关forward和re…

预测模型及超参数:3.集成学习:[1]LightGBM

想象你是一位乐队指挥,你的任务是协调乐队中的每位音乐家,以演奏出一场完美的音乐会。每位音乐家(即决策树)擅长不同的乐器或乐章。在指挥过程中,你通过调节各位音乐家演奏的强度(模型参数)&…

Jetson进行旋转目标检测推理实现大疆无人机飞行控制

源码结构 大疆PSDK源码地址: https://github.com/dji-sdk/Payload-SDK其目录结构如下: Payload-SDK-master ├── CMakeLists.txt ├── doc │ ├── dji_sdk_code_style │ └── simple_model ├── EULA.txt ├── LICENSE.txt ├── psd…

阿里云百炼智能体连接云数据库实践(DMS MCP)

这篇文章主要是通过使用阿里云的百炼智能体与阿里云的serverless来实现数据库的操作 欢迎一起交流!! 首先,当然是选择自己需要的数据库啦 在阿里云控制台选择产品 - > 数据库 - > 数据管理DMS进来的界面如下所示 第一次进来的时候是…

某商店JS混淆补环境与纯算逆向分析

文章目录1. 写在前面2. 接口分析3. 补环境分析4. 纯算法还原【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并…

如何安装 mysql-installer-community-8.0.21.0.tar.gz(Linux 详细教程附安装包下载)​

这是一个 ​Linux 下 MySQL 8.0.21 的压缩安装包,虽然名字里有 installer,但它其实就是一个压缩好的二进制安装包,不是 Windows 那种图形化安装程序。 一、准备工作 确保你已经有: Linux 系统(比如 Ubuntu、CentOS、…

IDEA-琴澳研究中心及学术联盟启动,产研协同赋能区域发展

8月30日,IDEA-琴澳中心主导研发的Smaray渲染引擎将发布可免费下载的Tech Preview(技术预览版)。本次发布标志着粤港澳大湾区在政产研协同创新实现成果落地,也是产业“人工智能”的探索迈进。Smaray是国内首个公开服务的、AI驱动的…

如何备份 TECNO 手机上的短信

许多 TECNO 用户都在寻找方法,以防止因手机损坏、被盗或恢复出厂设置而导致重要对话意外丢失,确保在需要时能够访问他们的数据。还有些人希望在释放设备存储空间的同时,仍然保留旧消息的副本以供日后参考。如果你一直在寻找“备份 TECNO 短信…

OpenAI Sora深度解析:AI视频生成技术如何重塑广告电商行业?影业合作已落地

最近刷到一条超震撼的视频:咖啡杯从桌角滑落,在空中转了半圈居然自己弹回桌面,牛奶一滴没洒。你猜怎么着?这居然是AI生成的,就是OpenAI那个叫Sora的工具做的。是不是觉得有点不可思议?现在这技术已经能做到…

力扣p1011在D天送达包裹的能力 详解

题目如下:代码如下,先看代码,再看思路:注意,从check函数下方的left处看,我认为难点在于以啥来二分,都说求啥拿啥分,但实际无从下手,关键在于如何寻找边界,此处…

React Three Fiber

下面,我们来系统的梳理关于 React Three Fiber:WebGL 与 React 的基本知识点: 一、React Three Fiber 核心概念 1.1 什么是 React Three Fiber? React Three Fiber(R3F)是一个用于 Three.js 的 React 渲染…

YARN架构解析:深入理解Hadoop资源管理核心

YARN架构解析:深入理解Hadoop资源管理核心 🌟 你好,我是 励志成为糕手 ! 🌌 在代码的宇宙中,我是那个追逐优雅与性能的星际旅人。 ✨ 每一行代码都是我种下的星光,在逻辑的土壤里生长成璀璨的银…

爬虫代理的核心作用、分类及使用要点

在数据采集场景中,爬虫代理作为“中间传输节点”,通过转发爬虫请求、隐藏真实IP地址,解决传统爬虫面临的诸多限制,其核心价值体现在三个方面:突破IP封锁与访问限制:多数网站会对高频请求的IP进行封锁&#…

EXCEL开发之路(三)sheets梯形样式设计—仙盟创梦IDE

在蔬菜批发行业,高效的信息管理与操作便捷性对于业务的顺畅开展至关重要。梯形 Nav(导航栏)切换这一设计,看似只是界面交互的小细节,实则在提升用户体验、优化业务流程等方面有着不可忽视的意义,对于初学者…

Unity游戏打包——iOS打包pod的重装和使用

本文由 NRatel 历史笔记整理而来,如有错误欢迎指正。 一、重装 pod 和使用 1、下载安装 rvm curl -L get.rvm.io | bash -s stable 2、使环境变量生效 (zsh) source ~/.zshrc source ~/.profile 3、查看rvm版本 rvm -v 4、重装ruby 关闭mac sip(可能需…