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

Android进阶之路 - res、raw、assets 资源解析、区别对比

那天遇到一个资源目录层级的问题,索性重新整理记录一下,希望能帮到如吾往昔之少年的你们,哈哈哈哈哈哈…

一脸茫然,越写越多,时间成本属实有点大,就当一起来基础扫盲吧

    • res
      • drawable
      • mipmap
      • values
      • color
    • assets(&res区别)
    • 兴趣衍生
      • res 和 asset 都是存储的静态资源吗?
      • res下 raw 和 assets 有何区别?
      • drawable-v24、mipmap-anydpi-v26、mipmap-anydpi-v33

新建了一个Demo,以下为初始目录,那么就从这里开始讲吧

Android

在这里插入图片描述

.Project(更全面、清晰)

在这里插入图片描述

res

主要存放静态资源,不过存储的都是资源文件,同时资源分类较多,该类文件在打包时会直接通过 aapt(资源文件打包工具)打包res资源文件,然后映射到Android工程的R文件中,生成 R.资源文件对应的ID,通常都可通过 R + 资源类型 + 资源具体名称(R.drawable.ic_launcher_background)访问到资源文件(注意:raw下的文件会被原封不动的打包到apk中)

常用与否,仅取决于个人定义

常用

  • drawable (res/drawable):存放图片资源,如图标、背景等
  • mipmap (res/mipmap):存放应用的启动器图标资源,为不同屏幕密度提供不同版本的图标
  • values (res/values):存放配置值,如字符串、样式、颜色、尺寸等
  • layout (res/layout):存放XML布局文件,定义用户界面的结构(常见于Activity、Fragment、Dialog等组件的视图xml )
  • dimens (res/dimens):存放尺寸资源文件,定义间距、字体大小等
  • color (res/color):存放颜色资源文件
  • menu (res/menu):存放菜单资源文件,定义应用的菜单项 - Android进阶之路 - BottomNavigationView的使用与问题处理方案
  • xml (res/xml):存放XML文件,如网络配置、偏好设置等 - Android 9.0 兼容适配
  • font (res/font):存放自定义字体文件(也支持放在 assets 目录) - Android进阶之路 - 深入浅出字体、字体库

关于动画一般放置于 anim下,其他的更细分一些,好像尚未使用过

  • anim (res/anim):存放动画资源文件,定义视图的动画效果
  • animator (res/animator):存放属性动画XML文件
  • transition (res/transition):存放场景转换动画资源

raw (res/raw):存放原始文件,如音频、视频文件等(有些特殊,单独讲讲)

rawasset 有些类似,它们存储的文件范围一般为音频、视频等,而且均在打包时不会被压缩,简单来看它们存储的位置不同,当然区别点还挺多,我在兴趣扩展中有详细介绍俩者之间的具体区别

不常用

  • layout-<version> (res/layout-land, res/layout-port):为不同布局方向或屏幕尺寸提供特定的布局

values 限制场景

  • values-<language> (res/values-en, res/values-fr, etc.):为不同语言提供特定的字符串资源(适用多语言定制,一般用于海外app)
  • values-v21 (res/values-v21):为API级别21及以上版本提供特定的资源
  • values-night (res/values-night):为夜间模式提供特定的资源

关于 drawablemipmap 都说到了图片视频,之所以进行图片适配,主要有以下几点原因

  • 一致性、适应性:保持界面的统一视觉效果,同时都足够清晰
  • 性能:避免在高密度屏幕上使用过大的图像文件,从而减少内存使用和提高加载速度(相对的因为图片适配,会适当增大一些apk体积,可适当在不影响图片的效果下进行图片压缩)

drawable

存放种类比较广,兼容性较强,支持存入以下类型 - 当然还有一些其他 xml 标签,但是因为一时想不起来,或者不常用就先不总结了,若有有需要再来补充

  1. 支持存放 图片(JPEG、PNG、GIF、WebP 等格式),在 mipmap 目录未出现前,统一将图片放于drawable下,同时此前图片适配也在该处

drawable 存放不区分密度的图片资源,这些资源将被所有密度级别的设备使用(假设未进行图片适配,那么有可能会加载这里的图片)

  • drawable-mdpi 中等密度,基准密度,大约为160dpi,Android的基准密度
  • drawable-hdpi 高密度,大约240dpi
  • drawable-xhdpi 超高密度,大约320dpi
  • drawable-xxhdpi 超超高密度,大约480dpi
  • drawable-xxxhdpi 超超超高密度,大约640dpi
  1. 支持 shapeselectorLayer-list 等 xml 标签
  • shape 支持实现圆角、矩形、圆形等效果 - Android入门之路 - shape保姆级手册
  • selector 状态选择器,支持点击、按压等状态监听后的不同实现效果 - Android进阶之路 - selector状态选择器
  • Layer-list 视图层,涉及层级覆盖,根据场景使用(之前做阴影效果时有接触过)- Android进阶之路 - 背景阴影、阴影背景
  1. 支持 animation-list 帧动画 xml 标签 - Android入门之路 - Frame帧动画

mipmap

mipmap 出现之前,我们一般会将图片统一放置于 drawable 目录,在其出现之后我们大多将图片放于该目录下,实现了单一职责

在前端、客户端经常需要进行适配,其中图片适配必不可少,针对于手机的不同分辨率,为了用户有更好的体验,通常需要在对应目录下放置同名不同分辨率的图片,目前使用较多的目录主要有 mipmap-xhdpimipmap-xxhdpi

  • mipmap-mdpi 中密度屏幕(Medium Density),大约为160dpi,Android的基准密度
  • mipmap-hdpi 高密度屏幕(High Density),大约为240dpi
  • mipmap-xhdpi 超高密度屏幕(Extra High Density),大约为240dpi
  • mipmap-xxhdpi 超超高密度屏幕(Extra Extra High Density),大约为320dpi
  • mipmap-xxxhdpi 超超超高密度屏幕(Extra Extra Extra High Density),大约为480dpi

Tip:当系统运行时一般会根据手机分辨率加载对应目录下的图片,如果该目录没有相关图片,就会就近同名的其他目录下的图片


values

values 目录下的资源也是常用的核心资源目录之一,在其内部的资源类别也比较多

valuesvalues-night 可以看出相比其他资源目录,values 提供了常规模式和夜间模式的区别 ,接下来我们看看具体有哪些常见资源文件

常用

  • strings.xml:存放应用中使用的所有字符串资源
  • styles.xml:定义应用的样式和主题,这些样式可以应用于应用的布局和控件(共性布局抽取,主题样式声明)
  • colors.xml:定义应用的颜色资源,可以用于文本、背景、控件等(颜色管理)
  • dimens.xml:定义应用的尺寸资源,如字体大小、间距、边距等(尺寸适配)
  • attrs.xml:定义自定义属性,这些属性可以用于样式和主题

不常用

  • arrays.xml:定义字符串数组、整数数组等
  • integers.xml:存放整数值,例如版本号、动画持续时间等
  • bools.xml:存放布尔值,用于配置开关选项
  • plurals.xml:用于定义复数规则,根据数量的不同显示不同的字符串
  • themes.xml:定义应用的主题,可以包含样式和其他主题相关的配置 - Android10.0 特性 - 暗黑模式、深色主题
  • ids.xml:定义资源ID,虽然通常这些ID是在XML布局文件中定义的
  • config.xml:定义应用的配置选项,如屏幕方向、导航键配置等
  • preferences.xml:定义应用的偏好设置,用于PreferenceActivity
  • public.xml:定义公共资源,这些资源可以在应用之外被其他应用访问

color

values 中可以看到有一个 colors.xml文件,那么它和 res-color 目录有何区别?

  • values - colors.xml 更多的是声明某个颜色的色值
  • res-color 下的 xml 文件可以提供对应事件的色值,效果更单一(区别于 drawable 下的 selector 标签)
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_pressed="true" android:color="#FF4081"/><item android:state_focused="true" android:color="#FFA726"/><item android:color="#9E9E9E"/>
</selector>

drawable - selector标签

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"><item android:state_checked="true"><shape><solid android:color="@color/white" /></shape></item><item android:state_checked="false"><shape><solid android:color="#f9f9f9" /></shape></item><item><shape><solid android:color="#f9f9f9" /></shape></item>
</selector>

assets(&res区别)

首先说明一下 assetsres 属于同级关系,别放错位置

在这里插入图片描述

assets 也用于存放静态资源,只不过存储的是原始文件,常用于存放 文本文件、音频文件、视频文件、图像文件、HTML文件、CSS文件、JavaScript文件

除去对比区别特性外,额外记录俩条特性

  • 不支持资源重载:当APK被安装后,assets中的文件不能被更新或重载,除非重新安装APK(未验证,按理apk更新后同文件可覆盖, 不确定重载场景的产生)
  • 与NDK交互:可以与NDK代码交互,NDK可以访问assets目录下的文件(未验证,关于NDK方面经验有限,不做误导)

一般我们都会将 asset 和 res 做对比

为方便下方简介对比,简化名称
res = R
assets = A

访问方式

R:在.R文件中生成对应的资源ID,可通过 R + 资源类型 + 资源具体名称(R.drawable.ic_launcher_background·)访问到资源文件
A:需要通过 AssetManager 来访问,不能通过资源ID直接访问

编译、压缩

R:在应用编译时会被处理,如,图片文件可以被压缩(减少APK大小),布局文件(.xml)会被转换成View对象等
A:在打包时文件不会被压缩,以原始形式在APK中存在,不经过编译处理,可以保留资源文件的原始结构和内容,便于应用程序在运行时动态地读取和使用

目录(文件)结构
R:不同类型文件被存储于不同资源目录下,如 drawable、mipmap、layout、values等,且编译后不保留目录结构
A:可以包含文件夹和子文件夹,文件的目录结构在APK中得以保留

适用场景
R:适用于存储应用的界面资源,如图片、布局、样式、颜色定义等
A:适用于存储不希望被编译或需要保持原始目录结构的文件,如配置文件、原始数据文件、大型媒体文件等

访问效率
R:由于资源在编译时被处理,访问速度通常较快
A:访问速度可能较慢,因为需要从APK中通过I/O操作来读取原始文件

资源可见性
R:资源默认是私有的,但可以通过特定的方式(如Content Provider)被其他应用访问
A:资源默认是私有的,只能通过 AssetManager 访问

资源管理
R:资源管理由系统自动完成,如根据屏幕密度选择合适的图片资源
A:需要手动管理,如遍历文件夹和读取文件

资源命名
R:资源文件名不区分大小写
A:文件名区分大小写(大小写敏感)


兴趣衍生

res 和 asset 都是存储的静态资源吗?

从一定层面可以说 res 和 asset 都是存储的静态资源,但是不同点在于静态资源也有所区分, 如果你有从上自下看过的话,可以看出俩者区别

文件类型 - 它们都属于静态资源文件,俩种文件类型区别上面有也说明,可以从访问方式、存储资源类型等方面来综合考虑

  • res:存放的是资源文件
  • assets: 存放的是原始文件

res下 raw 和 assets 有何区别?

我很诧异于res下既然都已经有了raw用于存储原始文件,为何还要再搞一个assets?

后面AI搜了搜,发现还是有一些区别的,除了上面在assets提到的区别之外,还有以下区别

适用场景

  • res/raw:适合存放小到中等大小的文件,如音频片段、视频片段、JSON配置文件等。
  • assets:适合存放较大的文件或需要保持原始目录结构的文件,如整个文件夹的文档、大型数据库文件等

文件操作

  • res/raw:文件操作通常通过 openRawResource() 方法进行
  • assets:文件操作通过 AssetManager的open()方法进行

关于最终是选择使用 res/raw 还是 assets 取决于你的具体需求,如文件大小、访问速度、是否需要保持目录结构等因素


drawable-v24、mipmap-anydpi-v26、mipmap-anydpi-v33

在上方的时候有看到这里的目录吗?一起来扫个盲...

在这里插入图片描述

Tip: 假设 v24是限制7.0版本,那么v25、v30是不是都可以做限制?(未尝试过,大多app为保持高兼容性,这种限制应该有一些场景局限性,具体场景具体定义吧)

  • drawable 目录上方已经具体解释过了,不区分 Android 版本均可正常使用
  • drawable-v24 目录中 v24指的是API级别24,对应于Android 7.0(Nougat),也就是仅支持7.0以上的机型加载对应资源,低于这个版本的都不会访问该目录下资源

mipmap-anydpi-v33为例,适用于API级别33及以上的机型,对于API级别低于33的机型,系统会回退到使用传统的mipmap目录下的图标资源(v26同理,针对于API26机型)

  • mipmap 代表图片
  • anydpi 代表任意密度
  • v33 代表版本兼容

具体看一下 ic_launcher.xml (标签较全)

在这里插入图片描述

标签解析

<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android"><background android:drawable="@drawable/ic_launcher_background" /><foreground android:drawable="@drawable/ic_launcher_foreground" /><monochrome android:drawable="@drawable/ic_launcher_foreground" />
</adaptive-icon>
  • adaptive-icon:根元素,用于定义自适应图标;它包含一个命名空间声明 xmlns:android,指定了Android资源的XML命名空间
  • background :定义了图标的背景部分;android:drawable 属性指定了一个drawable资源ID
  • foreground :定义了图标的前景部分,通常是图标的主要视觉元素;android:drawable属性指向一个drawable资源
  • monochrome:定义了一个单色版本的前景 drawable,用于在某些情况下(如深色背景上)提供更好的可见性(默认为foreground资源)

资源指向

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 生态系统NPP及碳源、碳汇模拟(土地利用变化、未来气候变化、空间动态模拟)
  • 【瑞芯微RV1126(板端摄像头图像数据采集)】②使用v4l2视频设备驱动框架采集图像数据,按键拍照并显示
  • 《Hadoop大数据技术与实践》+ 数仓版本
  • 使用免费图书馆条形码扫描仪快速扫描书籍
  • HarmonyOS应用开发者高级认证(一)
  • AI学习记录 - 自注意力机制中掩码的注意事项
  • 在亚马逊云科技上安全、合规地创建AI大模型训练基础设施并开发AI应用服务
  • 传输层安全性 ——TLS(Transport Layer Security)简介
  • Web Image scr图片从后端API获取基本实现
  • 【源码+论文】基于SpringBoot的网上订餐系统
  • ThinkPHP5漏洞分析之文件包含
  • UE开发中的设计模式(三) —— 对象池模式
  • duilib 之 窗口枚举显示实例 一
  • 高阶数据结构(Java):AVL树插入机制的探索
  • spring boot-18
  • 【EOS】Cleos基础
  • Docker下部署自己的LNMP工作环境
  • echarts花样作死的坑
  • go语言学习初探(一)
  • JavaScript服务器推送技术之 WebSocket
  • java中的hashCode
  • js 实现textarea输入字数提示
  • leetcode388. Longest Absolute File Path
  • MYSQL 的 IF 函数
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 中文输入法与React文本输入框的问题与解决方案
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • ​ 无限可能性的探索:Amazon Lightsail轻量应用服务器引领数字化时代创新发展
  • ​【已解决】npm install​卡主不动的情况
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #stm32驱动外设模块总结w5500模块
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (十七)Flink 容错机制
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)ABI是什么
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .gitignore文件忽略的内容不生效问题解决
  • .NET 反射的使用
  • .net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护
  • [2]十道算法题【Java实现】
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [BIZ] - 1.金融交易系统特点
  • [Bzoj4722]由乃(线段树好题)(倍增处理模数小快速幂)
  • [C++从入门到精通] 14.虚函数、纯虚函数和虚析构(virtual)