news 2026/4/15 23:05:18

鸿蒙中 资源分类与访问

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
鸿蒙中 资源分类与访问

本文同步发表于微信公众号,微信搜索程语新视界即可关注,每个工作日都有文章更新

一、资源定义

  • 应用开发中使用的字符串、颜色、字体、间距、图标等内容

  • 不同设备或配置下,资源值可能不同

资源分类

类别来源特点获取方式
应用资源开发者自定义管理不同设备/配置下的表现资源文件管理
系统资源系统提供系统组件和底层能力参数主题图标库、系统资源分层设计表、系统色彩全量表

系统资源获取渠道

资源类型获取方式说明
Symbol图标主题图标库系统symbol图标资源信息
颜色、间距、圆角系统资源分层设计表系统基础UI资源
颜色系统色彩全量表与分层设计表不重合,均为推荐使用的系统颜色资源

二、资源目录结构

完整目录结构

resources/ ├── base/ # 默认存在的基础目录 │ ├── element/ # 元素资源(字符串、颜色等) │ │ └── string.json # 字符串资源文件 │ ├── media/ # 媒体资源 │ │ └── icon.png # 图片、视频等媒体文件 │ └── profile/ # 自定义配置文件 │ └── test_profile.json # 自定义profile文件 ├── en_GB-vertical-car-mdpi/ # 自定义限定词目录示例 │ ├── element/ │ │ └── string.json │ ├── media/ │ │ └── icon.png │ └── profile/ │ └── test_profile.json ├── rawfile/ # 原始文件目录(不编译) └── resfile/ # 原始文件目录(安装后解压)

1.资源目录说明

目录类型说明文件处理访问方式
base目录默认存在,存放基础元素和媒体资源编译成二进制,分配资源ID$r('app.type.name')
限定词目录开发者根据需要创建编译成二进制,分配资源ID$r('app.type.name')
rawfile目录支持多层子目录,自由放置各类文件直接打包,不编译,不分配ID$rawfile('filename')
resfile目录支持多层子目录,自由放置各类文件直接打包,安装后解压到沙箱通过Context.resourceDir获取路径后访问

2.资源组目录说明

目录类型说明支持的文件类型
element元素资源,JSON格式boolean.json,color.json,float.json,intarray.json,integer.json,plural.json,strarray.json,string.json
media媒体资源(图片、音频、视频).jpg,.png,.gif,.svg,.webp,.bmp,.3gp,.mp4
profile自定义配置文件.json文件

3.媒体资源格式

类型格式文件后缀
图片JPEG.jpg
PNG.png
GIF.gif
SVG.svg
WEBP.webp
BMP.bmp
音视频H.264 AVC.3gp,.mp4

三、限定词目录

1.命名规则

  • 组合顺序移动国家码_移动网络码-语言_文字_国家或地区-横竖屏-设备类型-颜色模式-屏幕密度

  • 连接方式

    • 移动国家码和移动网络码:下划线_

    • 语言、文字、国家或地区:下划线_

    • 其他限定词:中划线-

  • 示例mcc460_mnc00-zh_Hant_CNzh_CN-car-ldpi

2.限定词取值范围

限定词类型含义与取值标准
移动国家码和移动网络码mcc460(中国),mcc460_mnc00(中国_中国移动)ITU-T E.212
语言zh(中文),en(英语),mai(迈蒂利语)ISO 639
文字Hans(简体中文),Hant(繁体中文)ISO 15924
国家或地区CN(中国),GB(英国)ISO 3166-1
横竖屏vertical(竖屏),horizontal(横屏)-
设备类型phone(手机),car(车机),tablet(平板),tv(智慧屏),wearable(智能穿戴),2in1(PC设备)-
颜色模式dark(深色模式),light(浅色模式)-
屏幕密度sdpi(0-120dpi),mdpi(120-160dpi),ldpi(160-240dpi),xldpi(240-320dpi),xxldpi(320-480dpi),xxxldpi(480-640dpi)

四、资源文件示例

1.color.json

{ "color": [ { "name": "color_hello", "value": "#ffff0000" // 前两位透明度,后六位颜色值 }, { "name": "color_world", "value": "#ff0000ff" } ] }

2.float.json

{ "float": [ { "name": "font_hello", "value": "28.0fp" // 浮点型,单位fp }, { "name": "font_world", "value": "20.0fp" } ] }

3.string.json

{ "string": [ { "name": "string_hello", "value": "Hello" }, { "name": "string_world", "value": "World" }, { "name": "message_arrive", "value": "We will arrive at %1$s." // 占位符 }, { "name": "message_notification", "value": "Hello, %1$s!,You have %2$d new messages." } ] }

4.plural.json

{ "plural": [ { "name": "eat_apple", "value": [ { "quantity": "one", "value": "%d apple" // 单数 }, { "quantity": "other", "value": "%d apples" // 复数 } ] } ] }

五、资源可翻译特性

1.功能介绍

  • 标记字符串是否需要翻译和翻译状态

  • 仅适用于:base目录下的stringstrarrayplural类型资源

  • 默认:未配置attr属性时,需要翻译

2.attr支持属性

名称类型说明
translatablebooleantrue:需要翻译
false:不需要翻译
prioritystringcode:未翻译
translate:翻译未验证
LT:翻译已验证
customer:用户定制字符串

3.示例

{ "string": [ { "name": "string1", "value": "1", "attr": { "translatable": false // 不需要翻译 } }, { "name": "string2", "value": "Hello world!", "attr": { "translatable": true, "priority": "LT" // 翻译已验证 } } ] }

六、资源访问方式

1.单HAP包应用资源访问

(1) 编译型资源(base/限定词目录)
// 基础访问 $r('app.type.name') // app: resources目录定义,type: 资源类型,name: 资源名 // 实际使用 Text($r('app.string.string_hello')) .fontColor($r('app.color.color_emphasize')) .fontSize($r('app.float.text_size_headline1')) // 带占位符的字符串 Text($r('app.string.message_notification', 'LiHua', 2)) // 复数资源 Text($r('app.plural.eat_apple', 2, 2)) // 第一个参数控制单复数,第二个参数替代占位符
(2) 原始文件资源(rawfile目录)
// 访问方式 $rawfile('filename') // filename: 相对路径,包含后缀,不以"/"开头 // 示例:假设rawfile目录下有icon.png Image($rawfile('icon.png'))
(3) 编程式访问
// 获取ResourceManager const resMgr = getContext().resourceManager; // 获取字符串 resMgr.getStringByNameSync('test_string'); // 获取rawfile文件描述符 resMgr.getRawFd('rawfilepath'); // 返回{fd, offset, length}

2.跨HAP/HSP包应用资源访问

(1) bundle相同,跨module访问
// 1. 添加依赖(entry的oh-package.json5) "dependencies": { "library": "file:../library" } // 2. 访问资源 @Entry @Component struct Second { // 字面量方式 text: string = '[library].string.test_string'; // 变量方式 textVar: string = '[library].string.test_string'; build() { Column() { // 字面量访问 Text($r('[library].string.test_string')) // 变量访问 Text($r(this.text)) // rawfile访问(多层目录) Image($rawfile('[library].firstDir/secondDir/icon.png')) } } }
(2) 通过createModuleContext访问
// 创建其他module的上下文 const context = createModuleContext(this.context, 'moduleName'); const resMgr = context.resourceManager; resMgr.getStringByNameSync('resource_name');

3.系统资源访问

// 访问方式 $r('sys.type.name') // sys: 系统资源,type: 资源类型,name: 资源名称 // 实际使用 Text('Hello') .fontColor($r('sys.color.ohos_id_color_emphasize')) .fontSize($r('sys.float.ohos_id_text_size_headline1')) .fontFamily($r('sys.string.ohos_id_text_font_family_medium')) // Symbol图标资源 SymbolGlyph($r('sys.symbol.xxxx'))

七、资源匹配规则

1.匹配优先级

resources/ ├── 限定词目录(匹配设备状态)← 优先 └── base目录(默认)← 次优

2.限定词目录匹配顺序

优先级从高到低

  1. 移动国家码和移动网络码

  2. 区域(语言、文字、国家或地区)

  3. 横竖屏

  4. 设备类型

  5. 颜色模式

  6. 屏幕密度

3.匹配规则细节

  • 完全匹配:移动国家码、网络码、语言、文字、横竖屏、设备类型、颜色模式必须与设备状态完全一致

  • 屏幕密度匹配:优先向上匹配最接近的,否则向下匹配最接近的

  • rawfile/resfile:不参与设备状态匹配

4.AppScope合并规则

  • stage模型多工程下,共有资源放到AppScope的resources目录

  • 编译时AppScope资源合入模块资源

  • 重名资源:只保留AppScope目录下的资源

八、获取指定配置的资源

1.接口说明

接口描述
getOverrideResourceManager(configuration)获取可加载指定配置的资源管理对象
getOverrideConfiguration()获取指定的配置
updateOverrideConfiguration(configuration)更新指定的配置

2.使用示例

// 获取非当前系统语言的资源 getString(): string { const resMgr = this.getUIContext().getHostContext()?.resourceManager; // 获取当前系统语言的资源 const resId = $r('app.string.greetings').id; const currentLanguageString = resMgr.getStringSync(resId); // 获取英文资源 let overrideConfig = resMgr.getOverrideConfiguration(); overrideConfig.locale = 'en_US'; // 指定语言为英语 let overrideResMgr = resMgr.getOverrideResourceManager(overrideConfig); this.englishString = overrideResMgr.getStringSync(resId); // 获取日文资源 overrideConfig.locale = 'ja_JP'; overrideResMgr.updateOverrideConfiguration(overrideConfig); this.japaneseString = overrideResMgr.getStringSync(resId); return currentLanguageString; }

九、Overlay机制

1.机制说明

  • 资源替换机制,实现界面风格变换

  • 不重新打包HAP,通过配置overlay资源包实现

  • overlay资源包包含:资源文件、资源索引文件、配置文件

2.动态Overlay

// 添加overlay资源 const path = getContext().bundleCodeDir + "overlay资源包名称"; resourceManager.addResource(path); // 删除overlay resourceManager.removeResource(path);

3.静态Overlay配置

app.json5配置:
{ "app": { "bundleName": "com.example.myapplication.overlay", "vendor": "example", "versionCode": "1000000", "versionName": "1.0.0.1", "icon": "$media:app_icon", "label": "$string:app_name" } }
module.json5配置:
{ "module": { "name": "entry_overlay_module_name", "type": "shared", "description": "$string:entry_overlay_desc", "deviceTypes": ["default", "tablet"], "deliverywithInstall": true, "targetModuleName": "entry_module_name", // 指定目标module "targetPriority": 1 // overlay优先级 } }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 15:57:35

零基础Python下载教程:5分钟搞定你的第一个脚本

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个最简单的Python文件下载示例,要求:1.不超过20行代码 2.使用标准库urllib 3.包含基础错误处理 4.输出友好提示信息 5.提供可直接运行的在线演示。代…

作者头像 李华
网站建设 2026/4/16 12:28:14

堆排序VS快速排序:大数据场景下的效率对决

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个算法性能对比工具,要求:1. 实现堆排序和快速排序 2. 支持自定义数据规模(1k-1M) 3. 记录并可视化比较时间和空间复杂度 4. 分析最坏情况表现 5. 生…

作者头像 李华
网站建设 2026/4/10 5:34:37

传统VS现代:REPKG处理效率提升300%的秘诀

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个高效的REPKG批处理GUI工具,要求实现:1.多任务并行处理 2.操作记录和回放 3.预设工作流 4.性能监控面板。重点优化大文件处理速度,提供处…

作者头像 李华
网站建设 2026/4/14 9:51:02

VS Code安装效率对比:传统 vs 自动化方案

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 设计一个对比工具,展示手动安装VS Code(包括插件配置、环境设置)与使用自动化脚本/工具(如快马平台)的耗时和成功率对比…

作者头像 李华
网站建设 2026/4/16 12:00:08

数据结构之线索二叉树

一文读懂线索二叉树的原理与用法 前言须知 先了解以下概念,再来学习线索二叉树⬇️ 前驱结点:二叉树里的前驱结点,是某一种遍历顺序下,上一个被遍历的结点。不同的遍历顺序(中序、前序、后序),同…

作者头像 李华
网站建设 2026/4/7 3:21:48

零基础学编程:用JavaScript实现第一个冒泡排序

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个面向初学者的冒泡排序教学程序:1. 使用JavaScript实现 2. 每一步操作都有详细注释说明 3. 包含动态可视化展示排序过程 4. 提供交互式练习功能 5. 内置常见错误…

作者头像 李华