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

非常经典的Android开发问题-mipmap图标目录和drawable图标目录的区别和适用场景实战举例-优雅草卓伊凡

非常经典的Android开发问题-mipmap图标目录和drawable图标目录的区别和适用场景实战举例-优雅草卓伊凡

核心结论(先看这个)

  • 对于应用图标(App Icon):永远放在 mipmap 目录中。
  • 对于其他所有图标和图片资源:如图标按钮、标签页图标、背景图、占位图等,都放在 drawable 目录中。

这是Google自Android Studio 1.0版本后官方推荐的最佳实践。


详细区别与适用场景

1. mipmap 目录
  • 设计初衷:专门为应用启动器图标(Launcher Icon) 设计。
  • 关键特性系统永远不会对 mipmap 目录下的资源进行缩放。无论你的应用安装在哪一种屏幕密度的设备上,Launcher(桌面)都会获取到为该设备分辨率精确匹配的 mipmap 资源,从而确保应用图标始终清晰、无锯齿。
  • 适用场景
    • 有且仅有:你的应用图标,即 ic_launcheric_launcher_round 等。这些图标会显示在手机桌面、应用列表、设置界面以及分享菜单中。
  • 为什么不放别的:如果把其他UI图标也放在 mipmap 中,系统不会缩放它们,你在布局中引用时可能需要自己处理尺寸,反而增加麻烦。而且这违背了该目录的设计初衷。
2. drawable 目录
  • 设计初衷:存放应用内所有其他的图片资源
  • 关键特性:系统可能会根据设备的屏幕密度(dpi)对 drawable 目录下的图片进行缩放,以适配不同屏幕。系统会选择最接近的密度版本,然后缩放至合适大小。
  • 适用场景除了应用启动图标之外的所有图片。包括但不限于:
    • UI图标(如返回箭头、菜单图标、心形收藏图标等)
    • 按钮背景(Button Backgrounds)
    • 界面背景(Backgrounds)
    • 位图(Bitmaps)
    • XML绘制的形状(Shapes)、选择器(Selectors)等

为什么会有这个区分?—— 历史与优化

在早期Android版本中,所有图片资源都放在 drawable 目录下。但这样做有一个问题:

当设备屏幕密度很高(比如xxhdpi)而你的应用只提供了低密度(比如mdpi)的应用图标时,系统会从 drawable 目录中获取这个低清图标,并放大它来显示在桌面上。放大必然导致图标模糊、失真,用户体验很差。

为了解决这个问题,Android引入了 mipmap 目录。mipmap 一词源自计算机图形学,指的是一组预先生成的、不同精度的纹理图片。系统可以精确地为设备选择最合适的那一个,而无需进行缩放。

因此,将应用图标单独放入 mipmap 目录,确保了桌面Launcher总能拿到最精确尺寸的图标,与设备DPI完美匹配。而应用内部的UI元素因为布局复杂,缩放是不可避免的,所以继续留在 drawable 目录中由系统处理。

目录结构示例

一个标准的项目资源目录结构看起来是这样的:

src/main/res/
├── drawable/          // 默认drawable目录(通常放xml资源,如selector, shape)
├── drawable-hdpi/     // 为hdpi屏幕准备的png/jpg图片
├── drawable-xhdpi/    // 为xhdpi屏幕准备的png/jpg图片
├── drawable-xxhdpi/   // 为xxhdpi屏幕准备的png/jpg图片
├── mipmap-hdpi/       // 只放应用图标 ic_launcher.png
├── mipmap-xhdpi/      // 只放应用图标 ic_launcher.png
├── mipmap-xxhdpi/     // 只放应用图标 ic_launcher.png
├── mipmap-xxxhdpi/    // 只放应用图标 ic_launcher.png (建议提供,作为高分辨率设备的基准)
├── layout/
└── values/

总结与最佳实践

特性

mipmap

目录

drawable

目录

主要用途

应用启动器图标(App Launcher Icon)

应用内所有其他UI元素和图片

系统缩放

永不缩放,保证图标清晰

会根据设备dpi进行缩放

包含内容

`ic_launcher(.webp

.png

.xml)`

按钮图标、背景、位图、选择器、形状等

最佳实践

所有密度版本都应提供该图标

为不同密度提供相应的图片以优化性能和效果

记住这个黄金法则:

mipmap for the app icon, drawable for everything else.
(mipmap放应用图标,drawable放其他所有东西。)

实际项目举例

看到这两个图标了没,一个是默认页面的背景图,另一个是被选中按钮激活后的选项背景图

结论先行

这两个资源都属于“应用内其他图片资源”,都应该放在 drawable 目录中。

  • 按钮选中状态的背景 -> drawable 目录
  • 主页面整体背景 -> drawable 目录

详细解释

1. 按钮选中状态的背景

这个背景是应用内部UI交互的一部分。它可能是一个图片(.png, .jpg, .webp),也可能是一个用XML定义的选择器(Selector)形状(Shape)

  • 如果是图片文件(如 btn_selected_bg.png):
    你应该将它放入对应的密度文件夹中,例如 drawable-xhdpi/, drawable-xxhdpi/ 等。系统会根据设备屏幕密度自动选择最合适的一个,并在需要时进行缩放,以保证在不同设备上显示比例正确。
  • 如果是XML文件(如 btn_selected_bg.xml,里面可能是 <selector><shape>):
    你应该将它直接放入默认的 drawable/ 目录(不带密度后缀)。因为XML是矢量性的,系统可以根据描述在任何密度下完美地绘制出图形,无需为不同密度提供多个版本。

放置路径示例:

  • res/drawable/btn_selected_bg.xml (XML选择器)
  • res/drawable-xhdpi/btn_selected_bg.png (XHDPI密度图片)
  • res/drawable-xxhdpi/btn_selected_bg.png (XXHDPI密度图片)
2. 主页面整体背景

这个背景同样是应用内部的装饰性图片,不属于应用图标。它通常是一张较大的图片(如 bg_home.jpg)。

  • 你应该根据它的尺寸和预期效果,为不同屏幕密度提供优化后的版本,并放入对应的 drawable-dpi 目录中。例如,为高密度设备提供更高分辨率的背景图,可以避免在大屏手机上被拉伸而模糊。

放置路径示例:

  • res/drawable-mdpi/bg_home.jpg (通常不需要,但遵循规范的话应该提供)
  • res/drawable-hdpi/bg_home.jpg
  • res/drawable-xhdpi/bg_home.jpg
  • res/drawable-xxhdpi/bg_home.jpg (这是目前最主流的基准尺寸)

为什么不能放 mipmap

回顾一下 mipmap 的核心特性:系统永不缩放

如果你把主页背景图 bg_home.jpg 放在 mipmap-xxhdpi/ 目录下,然后在一个 hdpi 的设备上运行:

  1. 系统会去 mipmap-hdpi/ 找,但你没提供这个版本。
  2. 系统不会像处理 drawable 那样自动缩放 mipmap-xxhdpi 里的图来适配。
  3. 它会直接使用 mipmap-xxhdpi/ 里的原图,这张图在 hdpi 设备上会显得非常大,可能超出屏幕,导致显示异常。

把按钮背景放在 mipmap 里也会有类似的问题,因为系统不会帮你做任何缩放适配,你需要自己写代码去控制大小,这完全违背了Android资源适配的初衷。

总结表格

资源类型

推荐目录

原因

应用图标 (ic_launcher)

mipmap-*dpi/

确保桌面启动器获取未缩放的清晰图标

按钮背景 (图片或XML)

drawable/

drawable-*dpi/

属于应用内UI,需要系统进行密度适配

页面背景图

drawable-*dpi/

属于应用内装饰性图片,需要系统进行密度适配

XML选择器/形状

drawable/

(无密度后缀)

XML可自适应不同密度,一份资源即可

简单记忆:只要不是那个会被手机桌面用到的图标,统统扔进 drawable


文章转载自:

http://4cCThZeP.mkydt.cn
http://oi0az5yD.mkydt.cn
http://weRFuD1C.mkydt.cn
http://UxxDmaJ9.mkydt.cn
http://0A2u7yll.mkydt.cn
http://7Q6bh3EW.mkydt.cn
http://DqNrpNjf.mkydt.cn
http://nsnWQib6.mkydt.cn
http://X5rjhn1u.mkydt.cn
http://jjIFmDXf.mkydt.cn
http://Y6b5qKUA.mkydt.cn
http://9cGxqsyU.mkydt.cn
http://S27kxlQZ.mkydt.cn
http://0EKUxUqq.mkydt.cn
http://61haIz3Y.mkydt.cn
http://BJbxhlA7.mkydt.cn
http://8Evg9uBA.mkydt.cn
http://KVcrlVlU.mkydt.cn
http://IXkZTaCQ.mkydt.cn
http://Ebf3U1kn.mkydt.cn
http://ms6Yhxrt.mkydt.cn
http://ZJx5rQER.mkydt.cn
http://xqIv7wiQ.mkydt.cn
http://ks9WVsPV.mkydt.cn
http://bjXBsF8m.mkydt.cn
http://BUSDnXoE.mkydt.cn
http://y3ssB33e.mkydt.cn
http://pNjgg4CD.mkydt.cn
http://HSGwNRWH.mkydt.cn
http://HYn8X3X4.mkydt.cn
http://www.dtcms.com/a/386119.html

相关文章:

  • Linux-> UDP 编程2
  • EPLAN-关联参考
  • 实验部分撰写要求
  • R语言入门课| 08 变量的重编码与重命名
  • Ubuntu 系统下搭建 FTP 服务器及文件传输
  • Field II 超声成像仿真 --2-CPWC (Coherent Plane-Wave Compounding)
  • 具身导航技能分解与重组!SkillNav:基于技能的视觉语言导航智能体混合架构
  • 【ADB】多设备文件传输工具
  • Vue3 通过JSON渲染el-table-column生成完整el-table
  • 传输层协议——TCP协议
  • ChromaDB探索
  • 无人设备遥控器之帧同步技术篇
  • redis如何搭建哨兵集群(docker,不同机器部署的redis和哨兵)
  • C#之开放泛型和闭合泛型
  • typescript+vue+node项目打包部署
  • Python/JS/Go/Java同步学习(第十五篇)四语言“字符串去重“对照表: 财务“小南“纸式去重术处理凭证内容崩溃(附源码/截图/参数表/避坑指南)
  • 数据库基础知识入门:从概念到架构的全面解析
  • 负载均衡器和CDN层面保护敏感文件:防止直接访问.git等敏感目录
  • 微算法科技(NASDAQ: MLGO)研究隐私计算区块链框架,赋能敏感数据流通
  • 分析并预测糖尿病患者 R
  • 【Cesium 开发实战教程】第四篇:动态数据可视化:实时 GPS 轨迹与时间轴控制
  • 大数据毕业设计选题推荐-基于大数据的快手平台用户活跃度分析系统-Spark-Hadoop-Bigdata
  • HTML打包EXE工具中的WebView2内核更新指南
  • 固定资产管理软件是什么?哪家好?对比分析10款产品
  • gdb-dashboard使用
  • 【脑电分析系列】第13篇:脑电源定位:从头皮到大脑深处,EEG源定位的原理、算法与可视化
  • 【51单片机】【protues仿真】基于51单片机SHT11温湿度系统
  • 【Vue3 ✨】Vue3 入门之旅 · 第二篇:安装与配置开发环境
  • 【30】C# WinForm入门到精通 ——字体控件FontDialog 【属性、方法、事件、实例、源码】
  • 使用Nginx+uWSGI部署Django项目