1# 资源分类与访问 2 3应用开发过程中,经常需要用到颜色、字体、间距、图片等资源,在不同的设备或配置中,这些资源的值可能不同。 4 5- 应用资源:借助资源文件能力,开发者在应用中自定义资源,自行管理这些资源在不同的设备或配置中的表现。 6 7- 系统资源:开发者直接使用系统预置的资源定义(即[分层参数](../../design/ux-design/design-resources.md),同一资源ID在设备类型、深浅色等不同配置下有不同的取值)。 8 9## 资源分类 10 11应用开发中使用的各类资源文件,需要放入特定子目录中存储管理。资源目录的示例如下所示,base目录、限定词目录、rawfile目录称为资源目录,element、media、profile称为资源组目录。 12 13> **说明** 14> 15> stage模型多工程情况下,共有的资源文件放到AppScope下的resources目录。 16 17资源目录示例: 18``` 19resources 20|---base 21| |---element 22| | |---string.json 23| |---media 24| | |---icon.png 25| |---profile 26| | |---test_profile.json 27|---en_US // 默认存在的目录,设备语言环境是美式英文时,优先匹配此目录下资源 28| |---element 29| | |---string.json 30| |---media 31| | |---icon.png 32| |---profile 33| | |---test_profile.json 34|---zh_CN // 默认存在的目录,设备语言环境是简体中文时,优先匹配此目录下资源 35| |---element 36| | |---string.json 37| |---media 38| | |---icon.png 39| |---profile 40| | |---test_profile.json 41|---en_GB-vertical-car-mdpi // 自定义限定词目录示例,由开发者创建 42| |---element 43| | |---string.json 44| |---media 45| | |---icon.png 46| |---profile 47| | |---test_profile.json 48|---rawfile // 其他类型文件,原始文件形式保存,不会被集成到resources.index文件中。文件名可自定义。 49``` 50### 资源目录 51 52#### base目录 53 54base目录是默认存在的目录,二级子目录element用于存放字符串、颜色、布尔值等基础元素,media、profile存放媒体、动画、布局等资源文件。<br/> 55目录中的资源文件会被编译成二进制文件,并赋予资源文件ID。通过指定资源类型(type)和资源名称(name)引用。 56 57#### 限定词目录 58 59en_US和zh_CN是默认存在的两个限定词目录,其余限定词目录需要开发者根据开发需要自行创建。二级子目录element、media、profile用于存放字符串、颜色、布尔值等基础元素,以及媒体、动画、布局等资源文件。<br/>同样,目录中的资源文件会被编译成二进制文件,并赋予资源文件ID。通过指定资源类型(type)和资源名称(name)来引用。 60 61**限定词目录的命名要求** 62 63限定词目录可以由一个或多个表征应用场景或设备特征的限定词组合而成,包括移动国家码和移动网络码、语言、文字、国家或地区、横竖屏、设备类型、颜色模式和屏幕密度等维度,限定词之间通过下划线(\_)或者中划线(\-)连接。开发者在创建限定词目录时,需要遵守限定词目录的命名规则。 64 65- 限定词的组合顺序:\_移动国家码_移动网络码-语言_文字_国家或地区-横竖屏-设备类型-颜色模式-屏幕密度_。开发者可以根据应用的使用场景和设备特征,选择其中的一类或几类限定词组成目录名称。 66 67- 限定词的连接方式:语言、文字、国家或地区之间采用下划线(\_)连接,移动国家码和移动网络码之间也采用下划线(\_)连接,除此之外的其他限定词之间均采用中划线(-)连接。例如:**zh_Hant_CN**、**zh_CN-car-ldpi**。 68 69- 限定词的取值范围:每类限定词的取值必须符合限定词取值要求表中的条件,如表2。否则,将无法匹配目录中的资源文件。 70 71表2 限定词取值要求 72 73| 限定词类型 | 含义与取值说明 | 74| ----------- | ---------------------------------------- | 75| 移动国家码和移动网络码 | 移动国家码(MCC)和移动网络码(MNC)的值取自设备注册的网络。<br/>MCC可与MNC合并使用,使用下划线(_)连接,也可以单独使用。例如:mcc460表示中国,mcc460_mnc00表示中国_中国移动。<br/>详细取值范围,请查阅**ITU-T E.212**(国际电联相关标准)。 | 76| 语言 | 表示设备使用的语言类型,由2~3个小写字母组成。例如:zh表示中文,en表示英语,mai表示迈蒂利语。<br/>详细取值范围,请查阅**ISO 639**(ISO制定的语言编码标准)。 | 77| 文字 | 表示设备使用的文字类型,由1个大写字母(首字母)和3个小写字母组成。例如:Hans表示简体中文,Hant表示繁体中文。<br/>详细取值范围,请查阅**ISO 15924**(ISO制定的文字编码标准)。 | 78| 国家或地区 | 表示用户所在的国家或地区,由2~3个大写字母或者3个数字组成。例如:CN表示中国,GB表示英国。<br/>详细取值范围,请查阅**ISO 3166-1**(ISO制定的国家和地区编码标准)。 | 79| 横竖屏 | 表示设备的屏幕方向,取值如下:<br/>- vertical:竖屏<br/>- horizontal:横屏 | 80| 设备类型 | 表示设备的类型,取值如下:<br/>- car:车机<br/>- tablet:平板<br/>- tv:智慧屏<br/>- wearable:智能穿戴 | 81| 颜色模式 | 表示设备的颜色模式,取值如下:<br/>- dark:深色模式<br/>- light:浅色模式 | 82| 屏幕密度 | 表示设备的屏幕密度(单位为dpi),取值如下:<br/>- sdpi:表示小规模的屏幕密度(Small-scale Dots Per Inch),适用于dpi取值为(0, 120]的设备。<br/>- mdpi:表示中规模的屏幕密度(Medium-scale Dots Per Inch),适用于dpi取值为(120, 160]的设备。<br/>- ldpi:表示大规模的屏幕密度(Large-scale Dots Per Inch),适用于dpi取值为(160, 240]的设备。<br/>- xldpi:表示特大规模的屏幕密度(Extra Large-scale Dots Per Inch),适用于dpi取值为(240, 320]的设备。<br/>- xxldpi:表示超大规模的屏幕密度(Extra Extra Large-scale Dots Per Inch),适用于dpi取值为(320, 480]的设备。<br/>- xxxldpi:表示超特大规模的屏幕密度(Extra Extra Extra Large-scale Dots Per Inch),适用于dpi取值为(480, 640]的设备。 | 83 84#### rawfile目录 85 86支持创建多层子目录,目录名称可以自定义,文件夹内可以自由放置各类资源文件。<br/>目录中的资源文件会被直接打包进应用,不经过编译,也不会被赋予资源文件ID。通过指定文件路径和文件名引用。 87 88### 资源组目录 89 90资源组目类型包括element、media、profile,用于存放特定类型的资源文件。 91 92 表3 资源组目录说明 93 94| 目录类型 | 说明 | 资源文件 | 95| --------- | ---------------------------------------- | ---------------------------------------- | 96| element | 表示元素资源,以下每一类数据都采用相应的JSON文件来表征(目录下仅支持文件类型)。<br/>- boolean,布尔型<br/>- color,颜色<br/>- float,浮点型<br/>- intarray,整型数组<br/>- integer,整型<br/>- pattern,样式<br/>- plural,复数形式<br/>- strarray,字符串数组<br/>- string,字符串 | element目录中的文件名称建议与下面的文件名保持一致。每个文件中只能包含同一类型的数据。<br/>- boolean.json<br/>- color.json<br/>- float.json<br/>- intarray.json<br/>- integer.json<br/>- pattern.json<br/>- plural.json<br/>- strarray.json<br/>- string.json | 97| media | 表示媒体资源,包括图片、音频、视频等非文本格式的文件(目录下只支持文件类型)。<br/>图片和音视频的类型说明间表4和表5。 | 文件名可自定义,例如:icon.png。 | 98| profile | 表示自定义配置文件,其文件内容可[通过包管理接口](../reference/apis/js-apis-bundleManager.md#bundlemanagergetprofilebyability)获取(目录下只支持文件类型)。 | 文件名可自定义,例如:test_profile.json。 | 99 100**媒体资源类型说明** 101 102表4 图片资源类型说明 103 104| 格式 | 文件后缀名 | 105| ---- | ----- | 106| JPEG | .jpg | 107| PNG | .png | 108| GIF | .gif | 109| SVG | .svg | 110| WEBP | .webp | 111| BMP | .bmp | 112 113表5 音视频资源类型说明 114 115| 格式 | 支持的文件类型 | 116| ------------------------------------ | --------------- | 117| H.263 | .3gp <br>.mp4 | 118| H.264 AVC <br> Baseline Profile (BP) | .3gp <br>.mp4 | 119| MPEG-4 SP | .3gp | 120| VP8 | .webm <br> .mkv | 121 122**资源文件示例** 123 124color.json文件的内容如下: 125 126 127```json 128{ 129 "color": [ 130 { 131 "name": "color_hello", 132 "value": "#ffff0000" 133 }, 134 { 135 "name": "color_world", 136 "value": "#ff0000ff" 137 } 138 ] 139} 140``` 141 142float.json文件的内容如下: 143 144 145```json 146{ 147 "float":[ 148 { 149 "name":"font_hello", 150 "value":"28.0fp" 151 }, 152 { 153 "name":"font_world", 154 "value":"20.0fp" 155 } 156 ] 157} 158``` 159 160string.json文件的内容如下: 161 162 163```json 164{ 165 "string":[ 166 { 167 "name":"string_hello", 168 "value":"Hello" 169 }, 170 { 171 "name":"string_world", 172 "value":"World" 173 }, 174 { 175 "name":"message_arrive", 176 "value":"We will arrive at %s." 177 } 178 ] 179} 180``` 181 182plural.json文件的内容如下: 183 184 185```json 186{ 187 "plural":[ 188 { 189 "name":"eat_apple", 190 "value":[ 191 { 192 "quantity":"one", 193 "value":"%d apple" 194 }, 195 { 196 "quantity":"other", 197 "value":"%d apples" 198 } 199 ] 200 } 201 ] 202} 203``` 204 205## 创建资源目录和资源文件 206 207在resources目录下,可按照限定词目录命名规则,以及资源组目录支持的文件类型和说明,创建资源目录和资源组目录,添加特定类型资源。DevEco Studio支持同时创建资源目录和资源文件,也支持单独创建资源目录或资源文件。 208 209### 创建资源目录和资源文件 210 211在resources目录右键菜单选择“New > Resource File”,可同时创建资源目录和资源文件,文件默认创建在base目录的对应资源组。如果选择了限定词,则会按照命名规范自动生成限定词和资源组目录,并将文件创建在限定词目录中。 212 213图中File name为需要创建的文件名。Resource type为资源组类型,默认是element。Root Element为资源类型。Avaliable qualifiers为供选择的限定词目录,通过右边的小箭头可添加或者删除。<br/>创建的目录名自动生成,格式固定为“限定词.资源组”,例如:创建一个限定词为dark的element目录,自动生成的目录名称为“dark.element”。 214 215  216 217### 创建资源目录 218 219在resources目录右键菜单选择“New > Resource Directory”,可创建资源目录,默认创建的是base目录。如果选择了限定词,则会按照命名规范自动生成限定词和资源组目录。确定限定词后,选择资源组类型,当前资源组类型支持Element、Media、Profile三种,创建后生成资源目录。 220 221  222 223### 创建资源文件 224 225在资源目录(element、media、profile)的右键菜单选择“New > XXX Resource File”,即可创建对应资源组目录的资源文件。例如,在element目录下可新建Element Resource File。 226 227  228 229## 资源访问 230 231### 应用资源 232 233- 对于应用资源,在工程中,通过```"$r('app.type.name')"```形式引用。其中,app为应用内resources目录中定义的资源;type为资源类型或资源的存放位置,取值包含“color”、“float”、“string”、“plural”、“media”;name为资源命名,由开发者定义资源时确定。 234 235- 对于rawfile目录资源,通过```"$rawfile('filename')"```形式引用。其中,filename为rawfile目录下文件的相对路径,文件名需要包含后缀,路径开头不可以以"/"开头。 236 237- 对于rawfile目录的descriptor,可通过资源管理的[getRawFd](../reference/apis/js-apis-resource-manager.md#getrawfd9)接口引用,其返回值descriptor.fd为hap包的fd。此时,访问rawfile文件需要结合{fd, offset, length}一起使用。 238 239> **说明:** 240> 241> 资源描述符不能拼接使用,仅支持普通字符串如`'app.type.name'`。 242> 243> `$r`返回值为Resource对象,可通过[getStringValue](../reference/apis/js-apis-resource-manager.md#getstringvalue9) 方法获取对应的字符串。 244 245[资源组目录](#资源组目录)下的“资源文件示例”显示了.json文件内容,包含color.json文件、string.json文件和plural.json文件,访问应用资源时需先了解.json文件的使用规范。<br/>资源的具体使用方法如下: 246 247```ts 248Text($r('app.string.string_hello')) 249 .fontColor($r('app.color.color_hello')) 250 .fontSize($r('app.float.font_hello')) 251 252Text($r('app.string.string_world')) 253 .fontColor($r('app.color.color_world')) 254 .fontSize($r('app.float.font_world')) 255 256// 引用string.json资源。Text中$r的第一个参数指定string资源,第二个参数用于替换string.json文件中的%s。 257// 如下示例代码value为"We will arrive at five of the clock"。 258Text($r('app.string.message_arrive', "five of the clock")) 259 .fontColor($r('app.color.color_hello')) 260 .fontSize($r('app.float.font_hello')) 261 262// 引用plural$资源。Text中$r的第一个指定plural资源,第二个参数用于指定单复数(在中文,单复数均使用other。在英文,one:代表单数,取值为1;other:代表复数,取值为大于等于1的整数),第三个参数用于替换%d 263// 如下示例代码为复数,value为"5 apples"。 264Text($r('app.plural.eat_apple', 5, 5)) 265 .fontColor($r('app.color.color_world')) 266 .fontSize($r('app.float.font_world')) 267 268Image($r('app.media.my_background_image')) // media资源的$r引用 269 270Image($rawfile('test.png')) // rawfile$r引用rawfile目录下图片 271 272Image($rawfile('newDir/newTest.png')) // rawfile$r引用rawfile目录下图片 273``` 274 275### 系统资源 276 277除了自定义资源,开发者也可以使用系统中预定义的资源,统一应用的视觉风格。可以查看[应用UX设计中关于资源的介绍](../../design/ux-design/design-resources.md),获取支持的系统资源ID及其在不同配置下的取值。 278 279在开发过程中,分层参数的用法与资源限定词基本一致。对于系统资源,可以通过```“$r('sys.type.resource_id')”```的形式引用。其中,sys为系统资源;type为资源类型,取值包括“color”、“float”、“string”、“media”;resource_id为资源id。 280 281> **说明:** 282> 283> - 仅声明式开发范式支持使用系统资源。 284> 285> - 对于系统预置应用,建议使用系统资源;对于三方应用,可以根据需要选择使用系统资源或自定义应用资源。 286 287```ts 288Text('Hello') 289 .fontColor($r('sys.color.ohos_id_color_emphasize')) 290 .fontSize($r('sys.float.ohos_id_text_size_headline1')) 291 .fontFamily($r('sys.string.ohos_id_text_font_family_medium')) 292 .backgroundColor($r('sys.color.ohos_id_color_palette_aux1')) 293 294Image($r('sys.media.ohos_app_icon')) 295 .border({ 296 color: $r('sys.color.ohos_id_color_palette_aux1'), 297 radius: $r('sys.float.ohos_id_corner_radius_button'), width: 2 298 }) 299 .margin({ 300 top: $r('sys.float.ohos_id_elements_margin_horizontal_m'), 301 bottom: $r('sys.float.ohos_id_elements_margin_horizontal_l') 302 }) 303 .height(200) 304 .width(300) 305``` 306 307## 资源匹配 308 309应用使用某资源时,系统会根据当前设备状态优先从相匹配的限定词目录中寻找该资源。只有当resources目录中没有与设备状态匹配的限定词目录,或者在限定词目录中找不到该资源时,才会去base目录中查找。rawfile是原始文件目录,不会根据设备状态去匹配不同的资源。 310 311**限定词目录与设备状态的匹配规则** 312 313- 在为设备匹配对应的资源文件时,限定词目录匹配的优先级从高到低依次为:移动国家码和移动网络码 > 区域(可选组合:语言、语言_文字、语言_国家或地区、语言_文字_国家或地区)> 横竖屏 > 设备类型 > 颜色模式 > 屏幕密度。 314 315- 如果限定词目录中包含移动国家码和移动网络码、语言、文字、横竖屏、设备类型、颜色模式限定词,则对应限定词的取值必须与当前的设备状态完全一致,该目录才能够参与设备的资源匹配。例如,限定词目录“zh_CN-car-ldpi”不能参与“en_US”设备的资源匹配。 316 317应用界面加载资源规则,更多请参考国际化和本地化文档。 318 319**overlay机制** 320 321overylay是一种资源替换机制,针对不同品牌、产品的显示风格,开发者可以在不重新打包业务逻辑hap的情况下,通过配置和使用overlay资源包,实现应用界面风格变换。 322 323- 动态overlay使用方式 324 3251、对应的overlay资源包需要放在对应应用安装路径下。如应用com.example.overlay的安装路径:data/app/el1/bundle/public/com.example.overlay/。 326 3272、应用通过[addResource(path)](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-resource-manager.md#addresource10),实现资源覆盖;通过[removeResource(path)](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-resource-manager.md#removeresource10),实现overlay删除。overlay资源路径需经过元能力的getContext().BundleCodeDir获取此应用对应的沙箱根目录,由应用的沙箱根目录+overlay的hsp名称组成。如:let path = getContext().bundleCodeDir + "hsp名",其对应沙箱路径为:/data/storage/el1/bundle/enter-release-signed.hsp。 328 329- 静态overlay配置方式 330 331在IDE中创建应用工程时,module的配置文件module.json5中包含targetModuleName和targetPriority字段时,该module将会在安装阶段被识别为overlay特征的module。overlay特征的module一般是为设备上存在的非overlay特征的module提供覆盖的资源文件,以便于targetModuleName指向的module在运行阶段可以使用overlay资源文件展示不同的颜色,标签,主题等等。 332 333该功能默认使能,其使能及去使能请参考[包管理接口](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/apis/js-apis-overlay.md)。 334 335## 相关实例 336 337针对访问应用资源,有以下相关实例可供参考: 338 339- [资源管理(ArkTS)(API10)](https://gitee.com/openharmony/applications_app_samples/tree/master/code/BasicFeature/Resource/ResourceManager) 340