資源分類與訪問(wèn)

2024-01-25 11:59 更新

應(yīng)用開發(fā)過(guò)程中,經(jīng)常需要用到顏色、字體、間距、圖片等資源,在不同的設(shè)備或配置中,這些資源的值可能不同。

  • 應(yīng)用資源:借助資源文件能力,開發(fā)者在應(yīng)用中自定義資源,自行管理這些資源在不同的設(shè)備或配置中的表現(xiàn)。

  • 系統(tǒng)資源:開發(fā)者直接使用系統(tǒng)預(yù)置的資源定義(即分層參數(shù),同一資源ID在設(shè)備類型、深淺色等不同配置下有不同的取值)。

資源分類

應(yīng)用開發(fā)中使用的各類資源文件,需要放入特定子目錄中存儲(chǔ)管理。資源目錄的示例如下所示,base目錄、限定詞目錄、rawfile目錄稱為資源目錄,element、media、profile稱為資源組目錄。

說(shuō)明

stage模型多工程情況下,共有的資源文件放到AppScope下的resources目錄。

資源目錄示例:

  1. resources
  2. |---base
  3. | |---element
  4. | | |---string.json
  5. | |---media
  6. | | |---icon.png
  7. | |---profile
  8. | | |---test_profile.json
  9. |---en_US // 默認(rèn)存在的目錄,設(shè)備語(yǔ)言環(huán)境是美式英文時(shí),優(yōu)先匹配此目錄下資源
  10. | |---element
  11. | | |---string.json
  12. | |---media
  13. | | |---icon.png
  14. | |---profile
  15. | | |---test_profile.json
  16. |---zh_CN // 默認(rèn)存在的目錄,設(shè)備語(yǔ)言環(huán)境是簡(jiǎn)體中文時(shí),優(yōu)先匹配此目錄下資源
  17. | |---element
  18. | | |---string.json
  19. | |---media
  20. | | |---icon.png
  21. | |---profile
  22. | | |---test_profile.json
  23. |---en_GB-vertical-car-mdpi // 自定義限定詞目錄示例,由開發(fā)者創(chuàng)建
  24. | |---element
  25. | | |---string.json
  26. | |---media
  27. | | |---icon.png
  28. | |---profile
  29. | | |---test_profile.json
  30. |---rawfile // 其他類型文件,原始文件形式保存,不會(huì)被集成到resources.index文件中。文件名可自定義。

資源目錄

base目錄

base目錄是默認(rèn)存在的目錄,二級(jí)子目錄element用于存放字符串、顏色、布爾值等基礎(chǔ)元素,media、profile存放媒體、動(dòng)畫、布局等資源文件。

目錄中的資源文件會(huì)被編譯成二進(jìn)制文件,并賦予資源文件ID。通過(guò)指定資源類型(type)和資源名稱(name)引用。

限定詞目錄

en_US和zh_CN是默認(rèn)存在的兩個(gè)限定詞目錄,其余限定詞目錄需要開發(fā)者根據(jù)開發(fā)需要自行創(chuàng)建。二級(jí)子目錄element、media、profile用于存放字符串、顏色、布爾值等基礎(chǔ)元素,以及媒體、動(dòng)畫、布局等資源文件。

同樣,目錄中的資源文件會(huì)被編譯成二進(jìn)制文件,并賦予資源文件ID。通過(guò)指定資源類型(type)和資源名稱(name)來(lái)引用。

限定詞目錄的命名要求

限定詞目錄可以由一個(gè)或多個(gè)表征應(yīng)用場(chǎng)景或設(shè)備特征的限定詞組合而成,包括移動(dòng)國(guó)家碼和移動(dòng)網(wǎng)絡(luò)碼、語(yǔ)言、文字、國(guó)家或地區(qū)、橫豎屏、設(shè)備類型、顏色模式和屏幕密度等維度,限定詞之間通過(guò)下劃線(_)或者中劃線(-)連接。開發(fā)者在創(chuàng)建限定詞目錄時(shí),需要遵守限定詞目錄的命名規(guī)則。

  • 限定詞的組合順序:_移動(dòng)國(guó)家碼_移動(dòng)網(wǎng)絡(luò)碼-語(yǔ)言_文字_國(guó)家或地區(qū)-橫豎屏-設(shè)備類型-顏色模式-屏幕密度_。開發(fā)者可以根據(jù)應(yīng)用的使用場(chǎng)景和設(shè)備特征,選擇其中的一類或幾類限定詞組成目錄名稱。

  • 限定詞的連接方式:語(yǔ)言、文字、國(guó)家或地區(qū)之間采用下劃線(_)連接,移動(dòng)國(guó)家碼和移動(dòng)網(wǎng)絡(luò)碼之間也采用下劃線(_)連接,除此之外的其他限定詞之間均采用中劃線(-)連接。例如:zh_Hant_CN、zh_CN-car-ldpi

  • 限定詞的取值范圍:每類限定詞的取值必須符合限定詞取值要求表中的條件,如表2。否則,將無(wú)法匹配目錄中的資源文件。

表2 限定詞取值要求

限定詞類型

含義與取值說(shuō)明

移動(dòng)國(guó)家碼和移動(dòng)網(wǎng)絡(luò)碼

移動(dòng)國(guó)家碼(MCC)和移動(dòng)網(wǎng)絡(luò)碼(MNC)的值取自設(shè)備注冊(cè)的網(wǎng)絡(luò)。

MCC可與MNC合并使用,使用下劃線(_)連接,也可以單獨(dú)使用。例如:mcc460表示中國(guó),mcc460_mnc00表示中國(guó)_中國(guó)移動(dòng)。

詳細(xì)取值范圍,請(qǐng)查閱ITU-T E.212(國(guó)際電聯(lián)相關(guān)標(biāo)準(zhǔn))。

語(yǔ)言

表示設(shè)備使用的語(yǔ)言類型,由2~3個(gè)小寫字母組成。例如:zh表示中文,en表示英語(yǔ),mai表示邁蒂利語(yǔ)。

詳細(xì)取值范圍,請(qǐng)查閱ISO 639(ISO制定的語(yǔ)言編碼標(biāo)準(zhǔn))。

文字

表示設(shè)備使用的文字類型,由1個(gè)大寫字母(首字母)和3個(gè)小寫字母組成。例如:Hans表示簡(jiǎn)體中文,Hant表示繁體中文。

詳細(xì)取值范圍,請(qǐng)查閱ISO 15924(ISO制定的文字編碼標(biāo)準(zhǔn))。

國(guó)家或地區(qū)

表示用戶所在的國(guó)家或地區(qū),由2~3個(gè)大寫字母或者3個(gè)數(shù)字組成。例如:CN表示中國(guó),GB表示英國(guó)。

詳細(xì)取值范圍,請(qǐng)查閱ISO 3166-1(ISO制定的國(guó)家和地區(qū)編碼標(biāo)準(zhǔn))。

橫豎屏

表示設(shè)備的屏幕方向,取值如下:

- vertical:豎屏

- horizontal:橫屏

設(shè)備類型

表示設(shè)備的類型,取值如下:

- car:車機(jī)

- tablet:平板

- tv:智慧屏

- wearable:智能穿戴

顏色模式

表示設(shè)備的顏色模式,取值如下:

- dark:深色模式

- light:淺色模式

屏幕密度

表示設(shè)備的屏幕密度(單位為dpi),取值如下:

- sdpi:表示小規(guī)模的屏幕密度(Small-scale Dots Per Inch),適用于dpi取值為(0, 120]的設(shè)備。

- mdpi:表示中規(guī)模的屏幕密度(Medium-scale Dots Per Inch),適用于dpi取值為(120, 160]的設(shè)備。

- ldpi:表示大規(guī)模的屏幕密度(Large-scale Dots Per Inch),適用于dpi取值為(160, 240]的設(shè)備。

- xldpi:表示特大規(guī)模的屏幕密度(Extra Large-scale Dots Per Inch),適用于dpi取值為(240, 320]的設(shè)備。

- xxldpi:表示超大規(guī)模的屏幕密度(Extra Extra Large-scale Dots Per Inch),適用于dpi取值為(320, 480]的設(shè)備。

- xxxldpi:表示超特大規(guī)模的屏幕密度(Extra Extra Extra Large-scale Dots Per Inch),適用于dpi取值為(480, 640]的設(shè)備。

rawfile目錄

支持創(chuàng)建多層子目錄,目錄名稱可以自定義,文件夾內(nèi)可以自由放置各類資源文件。

目錄中的資源文件會(huì)被直接打包進(jìn)應(yīng)用,不經(jīng)過(guò)編譯,也不會(huì)被賦予資源文件ID。通過(guò)指定文件路徑和文件名引用。

資源組目錄

資源組目類型包括element、media、profile,用于存放特定類型的資源文件。

表3 資源組目錄說(shuō)明

目錄類型

說(shuō)明

資源文件

element

表示元素資源,以下每一類數(shù)據(jù)都采用相應(yīng)的JSON文件來(lái)表征(目錄下僅支持文件類型)。

- boolean,布爾型

- color,顏色

- float,浮點(diǎn)型

- intarray,整型數(shù)組

- integer,整型

- pattern,樣式

- plural,復(fù)數(shù)形式

- strarray,字符串?dāng)?shù)組

- string,字符串

element目錄中的文件名稱建議與下面的文件名保持一致。每個(gè)文件中只能包含同一類型的數(shù)據(jù)。

- boolean.json

- color.json

- float.json

- intarray.json

- integer.json

- pattern.json

- plural.json

- strarray.json

- string.json

media

表示媒體資源,包括圖片、音頻、視頻等非文本格式的文件(目錄下只支持文件類型)。

圖片和音視頻的類型說(shuō)明間表4和表5。

文件名可自定義,例如:icon.png。

profile

表示自定義配置文件,其文件內(nèi)容可通過(guò)包管理接口獲?。夸浵轮恢С治募愋停?/p>

文件名可自定義,例如:test_profile.json。

媒體資源類型說(shuō)明

表4 圖片資源類型說(shuō)明

格式

文件后綴名

JPEG

.jpg

PNG

.png

GIF

.gif

SVG

.svg

WEBP

.webp

BMP

.bmp

表5 音視頻資源類型說(shuō)明

格式

支持的文件類型

H.263

.3gp

.mp4

H.264 AVC

Baseline Profile (BP)

.3gp

.mp4

MPEG-4 SP

.3gp

VP8

.webm

.mkv

資源文件示例

color.json文件的內(nèi)容如下:

  1. {
  2. "color": [
  3. {
  4. "name": "color_hello",
  5. "value": "#ffff0000"
  6. },
  7. {
  8. "name": "color_world",
  9. "value": "#ff0000ff"
  10. }
  11. ]
  12. }

float.json文件的內(nèi)容如下:

  1. {
  2. "float":[
  3. {
  4. "name":"font_hello",
  5. "value":"28.0fp"
  6. },
  7. {
  8. "name":"font_world",
  9. "value":"20.0fp"
  10. }
  11. ]
  12. }

string.json文件的內(nèi)容如下:

  1. {
  2. "string":[
  3. {
  4. "name":"string_hello",
  5. "value":"Hello"
  6. },
  7. {
  8. "name":"string_world",
  9. "value":"World"
  10. },
  11. {
  12. "name":"message_arrive",
  13. "value":"We will arrive at %s."
  14. }
  15. ]
  16. }

plural.json文件的內(nèi)容如下:

  1. {
  2. "plural":[
  3. {
  4. "name":"eat_apple",
  5. "value":[
  6. {
  7. "quantity":"one",
  8. "value":"%d apple"
  9. },
  10. {
  11. "quantity":"other",
  12. "value":"%d apples"
  13. }
  14. ]
  15. }
  16. ]
  17. }

創(chuàng)建資源目錄和資源文件

在resources目錄下,可按照限定詞目錄命名規(guī)則,以及資源組目錄支持的文件類型和說(shuō)明,創(chuàng)建資源目錄和資源組目錄,添加特定類型資源。DevEco Studio支持同時(shí)創(chuàng)建資源目錄和資源文件,也支持單獨(dú)創(chuàng)建資源目錄或資源文件。

創(chuàng)建資源目錄和資源文件

在resources目錄右鍵菜單選擇“New > Resource File”,可同時(shí)創(chuàng)建資源目錄和資源文件,文件默認(rèn)創(chuàng)建在base目錄的對(duì)應(yīng)資源組。如果選擇了限定詞,則會(huì)按照命名規(guī)范自動(dòng)生成限定詞和資源組目錄,并將文件創(chuàng)建在限定詞目錄中。

圖中File name為需要?jiǎng)?chuàng)建的文件名。Resource type為資源組類型,默認(rèn)是element。Root Element為資源類型。Avaliable qualifiers為供選擇的限定詞目錄,通過(guò)右邊的小箭頭可添加或者刪除。

創(chuàng)建的目錄名自動(dòng)生成,格式固定為“限定詞.資源組”,例如:創(chuàng)建一個(gè)限定詞為dark的element目錄,自動(dòng)生成的目錄名稱為“dark.element”。

創(chuàng)建資源目錄

在resources目錄右鍵菜單選擇“New > Resource Directory”,可創(chuàng)建資源目錄,默認(rèn)創(chuàng)建的是base目錄。如果選擇了限定詞,則會(huì)按照命名規(guī)范自動(dòng)生成限定詞和資源組目錄。確定限定詞后,選擇資源組類型,當(dāng)前資源組類型支持Element、Media、Profile三種,創(chuàng)建后生成資源目錄。

創(chuàng)建資源文件

在資源目錄(element、media、profile)的右鍵菜單選擇“New > XXX Resource File”,即可創(chuàng)建對(duì)應(yīng)資源組目錄的資源文件。例如,在element目錄下可新建Element Resource File。

資源訪問(wèn)

應(yīng)用資源

  • 對(duì)于應(yīng)用資源,在工程中,通過(guò)"$r('app.type.name')"形式引用。其中,app為應(yīng)用內(nèi)resources目錄中定義的資源;type為資源類型或資源的存放位置,取值包含“color”、“float”、“string”、“plural”、“media”;name為資源命名,由開發(fā)者定義資源時(shí)確定。

  • 對(duì)于rawfile目錄資源,通過(guò)"$rawfile('filename')"形式引用。其中,filename為rawfile目錄下文件的相對(duì)路徑,文件名需要包含后綴,路徑開頭不可以以"/"開頭。

  • 對(duì)于rawfile目錄的descriptor,可通過(guò)資源管理的getRawFd接口引用,其返回值descriptor.fd為hap包的fd。此時(shí),訪問(wèn)rawfile文件需要結(jié)合{fd, offset, length}一起使用。

說(shuō)明

資源描述符不能拼接使用,僅支持普通字符串如'app.type.name'。

$r返回值為Resource對(duì)象,可通過(guò)getStringValue 方法獲取對(duì)應(yīng)的字符串。

資源組目錄下的“資源文件示例”顯示了.json文件內(nèi)容,包含color.json文件、string.json文件和plural.json文件,訪問(wèn)應(yīng)用資源時(shí)需先了解.json文件的使用規(guī)范。

資源的具體使用方法如下:

  1. Text($r('app.string.string_hello'))
  2. .fontColor($r('app.color.color_hello'))
  3. .fontSize($r('app.float.font_hello'))
  4. Text($r('app.string.string_world'))
  5. .fontColor($r('app.color.color_world'))
  6. .fontSize($r('app.float.font_world'))
  7. // 引用string.json資源。Text中$r的第一個(gè)參數(shù)指定string資源,第二個(gè)參數(shù)用于替換string.json文件中的%s。
  8. // 如下示例代碼value為"We will arrive at five of the clock"。
  9. Text($r('app.string.message_arrive', "five of the clock"))
  10. .fontColor($r('app.color.color_hello'))
  11. .fontSize($r('app.float.font_hello'))
  12. // 引用plural$資源。Text中$r的第一個(gè)指定plural資源,第二個(gè)參數(shù)用于指定單復(fù)數(shù)(在中文,單復(fù)數(shù)均使用other。在英文,one:代表單數(shù),取值為1;other:代表復(fù)數(shù),取值為大于等于1的整數(shù)),第三個(gè)參數(shù)用于替換%d
  13. // 如下示例代碼為復(fù)數(shù),value為"5 apples"。
  14. Text($r('app.plural.eat_apple', 5, 5))
  15. .fontColor($r('app.color.color_world'))
  16. .fontSize($r('app.float.font_world'))
  17. Image($r('app.media.my_background_image')) // media資源的$r引用
  18. Image($rawfile('test.png')) // rawfile$r引用rawfile目錄下圖片
  19. Image($rawfile('newDir/newTest.png')) // rawfile$r引用rawfile目錄下圖片

系統(tǒng)資源

除了自定義資源,開發(fā)者也可以使用系統(tǒng)中預(yù)定義的資源,統(tǒng)一應(yīng)用的視覺(jué)風(fēng)格??梢圆榭?a rel="external nofollow" target="_blank" rel="external nofollow" target="_blank" target="_blank">應(yīng)用UX設(shè)計(jì)中關(guān)于資源的介紹,獲取支持的系統(tǒng)資源ID及其在不同配置下的取值。

在開發(fā)過(guò)程中,分層參數(shù)的用法與資源限定詞基本一致。對(duì)于系統(tǒng)資源,可以通過(guò)“$r('sys.type.resource_id')”的形式引用。其中,sys為系統(tǒng)資源;type為資源類型,取值包括“color”、“float”、“string”、“media”;resource_id為資源id。

說(shuō)明
  • 僅聲明式開發(fā)范式支持使用系統(tǒng)資源。

  • 對(duì)于系統(tǒng)預(yù)置應(yīng)用,建議使用系統(tǒng)資源;對(duì)于三方應(yīng)用,可以根據(jù)需要選擇使用系統(tǒng)資源或自定義應(yīng)用資源。

  1. Text('Hello')
  2. .fontColor($r('sys.color.ohos_id_color_emphasize'))
  3. .fontSize($r('sys.float.ohos_id_text_size_headline1'))
  4. .fontFamily($r('sys.string.ohos_id_text_font_family_medium'))
  5. .backgroundColor($r('sys.color.ohos_id_color_palette_aux1'))
  6. Image($r('sys.media.ohos_app_icon'))
  7. .border({
  8. color: $r('sys.color.ohos_id_color_palette_aux1'),
  9. radius: $r('sys.float.ohos_id_corner_radius_button'), width: 2
  10. })
  11. .margin({
  12. top: $r('sys.float.ohos_id_elements_margin_horizontal_m'),
  13. bottom: $r('sys.float.ohos_id_elements_margin_horizontal_l')
  14. })
  15. .height(200)
  16. .width(300)

資源匹配

應(yīng)用使用某資源時(shí),系統(tǒng)會(huì)根據(jù)當(dāng)前設(shè)備狀態(tài)優(yōu)先從相匹配的限定詞目錄中尋找該資源。只有當(dāng)resources目錄中沒(méi)有與設(shè)備狀態(tài)匹配的限定詞目錄,或者在限定詞目錄中找不到該資源時(shí),才會(huì)去base目錄中查找。rawfile是原始文件目錄,不會(huì)根據(jù)設(shè)備狀態(tài)去匹配不同的資源。

限定詞目錄與設(shè)備狀態(tài)的匹配規(guī)則

  • 在為設(shè)備匹配對(duì)應(yīng)的資源文件時(shí),限定詞目錄匹配的優(yōu)先級(jí)從高到低依次為:移動(dòng)國(guó)家碼和移動(dòng)網(wǎng)絡(luò)碼 > 區(qū)域(可選組合:語(yǔ)言、語(yǔ)言_文字、語(yǔ)言_國(guó)家或地區(qū)、語(yǔ)言_文字_國(guó)家或地區(qū))> 橫豎屏 > 設(shè)備類型 > 顏色模式 > 屏幕密度。

  • 如果限定詞目錄中包含移動(dòng)國(guó)家碼和移動(dòng)網(wǎng)絡(luò)碼、語(yǔ)言、文字、橫豎屏、設(shè)備類型、顏色模式限定詞,則對(duì)應(yīng)限定詞的取值必須與當(dāng)前的設(shè)備狀態(tài)完全一致,該目錄才能夠參與設(shè)備的資源匹配。例如,限定詞目錄“zh_CN-car-ldpi”不能參與“en_US”設(shè)備的資源匹配。

應(yīng)用界面加載資源規(guī)則,更多請(qǐng)參考國(guó)際化和本地化文檔。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)