0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

OpenHarmony資源管理詳解 OpenHarmony資源分類和資源的訪問方式

ArkUI詳解 ? 來源:鴻蒙實驗室 ? 作者:鴻蒙實驗室 ? 2022-07-05 06:24 ? 次閱讀

資源管理

本節(jié)筆者向讀者介紹一下 OpenHarmony 應用的資源分類和資源的訪問方式。廢話不多說,我們直接開始。

資源分類

移動端應用開發(fā)常用到的資源比如圖片,音視頻,字符串等都有固定的存放目錄,OpenHarmony 把這些應用的資源文件統(tǒng)一放在 resources 目錄下的各子目錄中便于開發(fā)者使用和維護, resoures 目錄包括兩大類,實際為一類,為 base 目錄與限定詞目錄,另一類為 rawfile 目錄(不知道是不是官方文檔有誤,我已經(jīng)提了Issue)。新建 OpenHarmony 應用,默認生成的資源目錄如下所示:

image-20220704162100551

base 目錄與限定詞目錄下面可以創(chuàng)建資源組目錄(包括 element 、 media 、animationlayout 、 graphic 、 profile 等),用于存放特定類型的資源文件,各資源目錄說明如下圖所示:

資源組目錄

注意,都是以鍵值對的形式存在,name不能重復,value可以重復,但我相信,既然name都不重復,value肯定也不會重復,不然意義何在。

資源組目錄 目錄說明 資源文件
element 表示元素資源,以下每一類數(shù)據(jù)都采用相應的JSON文件來表征。 - boolean,布爾型 - color,顏色 - float,浮點型 - intarray,整型數(shù)組 - integer,整型 - pattern,樣式 - plural,復數(shù)形式 - strarray,字符串數(shù)組 - string,字符串 element目錄中的文件名稱建議與下面的文件名保持一致。每個文件中只能包含同一類型的數(shù)據(jù)。 - boolean.json - color.json - float.json - intarray.json - integer.json - pattern.json - plural.json - strarray.json - string.json
media 表示媒體資源,包括圖片、音頻、視頻等非文本格式的文件。 文件名可自定義,例如:icon.png。
animation 表示動畫資源,采用XML文件格式。 文件名可自定義,例如:zoom_in.xml。
layout 表示布局資源,采用XML文件格式。 文件名可自定義,例如:home_layout.xml。
graphic 表示可繪制資源,采用XML文件格式。 文件名可自定義,例如:notifications_dark.xml。
profile 表示其他類型文件,以原始文件形式保存。 文件名可自定義。

限定詞目錄

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

限定詞取值要求

限定詞類型 含義與取值說明
移動國家碼和移動網(wǎng)絡碼 移動國家碼(MCC)和移動網(wǎng)絡碼(MNC)的值取自設(shè)備注冊的網(wǎng)絡。MCC后面可以跟隨MNC,使用下劃線()連接,也可以單獨使用。 例如: mcc460表示中國, mcc460_mnc00表示中國中國移動。 詳細取值范圍,請查閱ITU-T E.212(國際電聯(lián)相關(guān)標準)。
語言 表示設(shè)備使用的語言類型,由2~3個小寫字母組成。例如:zh表示中文,en表示英語,mai表示邁蒂利語。 詳細取值范圍,請查閱ISO 639(ISO制定的語言編碼標準)。
文字 表示設(shè)備使用的文字類型,由1個大寫字母(首字母)和3個小寫字母組成。 例如: Hans表示簡體中文, Hant表示繁體中文。 詳細取值范圍,請查閱ISO 15924(ISO制定的文字編碼標準)。
國家或地區(qū) 表示用戶所在的國家或地區(qū),由2~3個大寫字母或者3個數(shù)字組成。例如: CN表示中國, GB表示英國。 詳細取值范圍,請查閱ISO 3166-1(ISO制定的國家和地區(qū)編碼標準)。
橫豎屏 表示設(shè)備的屏幕方向,取值如下: - vertical:豎屏 - horizontal:橫屏
設(shè)備類型 表示設(shè)備的類型,取值如下: - car:車機 - 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è)備。

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

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

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

當然也可以自己創(chuàng)建目錄,將圖片等文件統(tǒng)一存放,比如,我將圖片存放在自己創(chuàng)建的“/common/images”目錄,這樣的話,目錄中的資源文件會被直接打包進應用,不經(jīng)過編譯,也不會被賦予資源文件ID。這一點需要大家注意。

資源訪問

OpenHarmony 應用資源目錄分為三類,一類是應用資源目錄,另一類是系統(tǒng)資源目錄,還有就是自己創(chuàng)建的目錄。

它們的資源訪問方式如下:

訪問應用資源目錄

base 目錄下的資源文件會被編譯成二進制文件并且給這些資源賦予唯一的 ID ,使用相應資源的時候通過資源訪問符 $('app.type.name') 的形式,app 代表是應用內(nèi) resources 目錄中定義的資源;type 表示資源類型,可取值有 color 、 float 、 string 、 string 、 media 等;name 表示資源的文件名字。例如 media 中新加 name 為 Car.svg的圖片,則訪問該字符串資源為 $r('app.media.Car')

筆者在 base 目錄下新建 string.jsoncolor.json 文件,分別存放字符串和顏色,資源內(nèi)容如下圖所示:

image-20220704180833400

通過 $('app.type.name') 訪問資源的簡單樣例如下所示:

  • @Entry
    @Component
    struct Index {
    ?
    build() {
    Row() {
    Column() {
    Text($r('app.string.title_desc')) // 訪問字符串資源
    .fontSize(60).fontWeight(FontWeight.Bold)
    ?
    .fontColor($r('app.color.title_color')) // 訪問字體顏色
    .backgroundImage($r('app.media.Car')) // 設(shè)備背景圖片
    Image("common/images/Car.svg").objectFit(ImageFit.Contain).height(200)
    }
    .width('100%')
    }
    .height('100%')
    }
    }

樣例運行結(jié)果如下圖所示:

image-20220704181110662

訪問系統(tǒng)資源

系統(tǒng)資源包含 顏色圓角 、 字體 、 間距 、 字符串圖片 等,通過使用系統(tǒng)資源,不同的開發(fā)者可以開發(fā)出具有相同視覺風格的應用,開發(fā)者可以通過 $r('sys.type.name') 的形式引用系統(tǒng)資源,和訪問應用資源不同的是使用 sys 代表系統(tǒng)資源,其它和訪問應用資源規(guī)則一致。

訪問系統(tǒng)資源簡單樣例如下所示:

  • @Entry
    @Component
    struct ResourceTest {
    build() {
    Column() {
    Text($r('app.string.title_desc')) //**訪問應用資源目錄**
    .fontColor($r('sys.color.ohos_fa_alert')) //**訪問系統(tǒng)資源目錄**
    .fontSize($r('sys.float.ohos_id_text_size_headline3'))
    .backgroundColor($r('sys.color.ohos_id_color_palette_aux1'))
    Image("/common/images/Car.svg") //**自己創(chuàng)建的目錄**
    .objectFit(ImageFit.None)
    .border({
    color: Color.Orange,
    radius: 20,
    width: 12
    })
    .margin({
    top: 50,
    ?
    })
    .width(200)
    .height(200)
    ?
    }
    .padding(20)
    .width("100%")
    .height("100%")
    }
    }

樣例運行結(jié)果如下圖所示:

image-20220704182124083

訪問自己創(chuàng)建的目錄

我們還可以將圖片文件存放在自己創(chuàng)建的“/common/images”目錄

使用很簡單,如下圖所示:

Image("/common/images/Car.svg") //**自己創(chuàng)建的目錄**

.objectFit(ImageFit.None)

.border({

color: Color.Orange,

radius: 20,

width: 12

})

.margin({

top: 50,

?

})

.width(200)

.height(200)

運行效果

image-20220704182449534

資源管理器

ArkUI開發(fā)框架在 @ohos.resourceManager 模塊里提供了資源管理器 ResourceManager,它可以訪問不同的資源,比如獲取獲取字符串資源,獲取設(shè)備配置信息等等,resourceManager 模塊提供部分 API 如下所示:

declare

namespace

resourceManager

{

// 獲取ResourceManager

export

function

getResourceManager

(

callback

: AsyncCallback

<

ResourceManager

>

): void;

// 獲取指定bundleName的ResourceManager

export

function

getResourceManager

(

bundleName

: string,

callback

: AsyncCallback

<

ResourceManager

>

): void;

?

export

interface

ResourceManager

{

// 獲取字符串資源

getString

(

resId

: number,

callback

: AsyncCallback

<

string

>

): void;

// 獲取字符串數(shù)組資源

getStringArray

(

resId

: number,

callback

: AsyncCallback

<

Array

<

string

>>

): void;

// 獲取媒體資源

getMedia

(

resId

: number,

callback

: AsyncCallback

<

Uint8Array

>

): void;

// 獲取設(shè)備信息,比如當前屏幕密度,設(shè)備類型是手機還是平板等

getDeviceCapability

(

callback

: AsyncCallback

<

DeviceCapability

>

): void;

// 獲取配置信息,比如當前屏幕方向密度,當前設(shè)備語言

getConfiguration

(

callback

: AsyncCallback

<

Configuration

>

): void;

// 釋放ResourceManager資源

release

();

}

}

export

default

resourceManager

;

使用 ResourceManager 之前先調(diào)用 getResourceManager() 方法獲取它,然后再調(diào)用 ResourceManager 的各種 getXXX() 方法獲取對應資源, ResourceManager 使用流程如下所示:

引入 resourceManager

  • import resourceManager from '@ohos.resourceManager';

獲取 ResourceManager

  • aboutToAppear() {
    resourceManager.getResourceManager((error, manager) => {
    // 獲取manager
    })
    }

使用 ResourceManager

  • manager.getString(0x1000001, (innerError, data) => {
    if(data) {
    // 獲取資源成功
    } else {
    console.log("error: " + JSON.stringify(innerError))
    }
    })

完整樣例如下所示:

import

resourceManager

from

'@ohos.resourceManager'

;

?

@

Entry

@

Component

struct

ResourceTest

{

?

@

State

text_string

:

string

=

"跟著堅果學習"

;

@

State

capability

:

string

=

"OpenHarmony"

;

@

State

configuration

:

string

=

"應用開發(fā)"

;

?

aboutToAppear

() {

resourceManager

.

getResourceManager

((

error

,

manager

)

=>

{

manager

.

getString

(

0x1000001

, (

innerError

,

data

)

=>

{

if

(

data

) {

this

.

text_string

=

data

;

}

else

{

console

.

log

(

"error: "

+

JSON

.

stringify

(

innerError

));

}

})

?

manager

.

getDeviceCapability

((

innerError

,

deviceCapability

)

=>

{

if

(

deviceCapability

) {

this

.

capability

=

JSON

.

stringify

(

deviceCapability

);

}

})

?

manager

.

getConfiguration

((

innerError

,

configuration

)

=>

{

if

(

configuration

) {

this

.

configuration

=

JSON

.

stringify

(

configuration

);

}

})

})

}

?

build

() {

Column

({ }) {

Text

(

this

.

text_string

)

// 訪問字符串資源

// 設(shè)置尺寸

.

fontSize

(

29

)

.

fontColor

(

$r

(

'app.color.title_color'

))

// 訪問字體顏色

?

?

Text

(

this

.

capability

)

// capability信息

.

fontSize

(

40

).

fontWeight

(

FontWeight

.

Bold

)

?

Text

(

this

.

configuration

)

// configuration信息

.

fontSize

(

60

)

}

.

width

(

'100%'

)

.

height

(

'100%'

)

.

padding

(

10

)

}

}

樣例運行結(jié)果如下圖所示:

IMG_0219

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • HarmonyOS
    +關(guān)注

    關(guān)注

    79

    文章

    1966

    瀏覽量

    29962
  • OpenHarmony
    +關(guān)注

    關(guān)注

    25

    文章

    3640

    瀏覽量

    16061
收藏 人收藏

    相關(guān)推薦

    OpenHarmony硬件資源池化架構(gòu)介紹 OpenHarmony如何實現(xiàn)多設(shè)備協(xié)同

    OpenHarmony的硬件資源池化框架,為大家揭曉OpenHarmony是如何實現(xiàn)多設(shè)備協(xié)同的。 1. 硬件資源訪問的演進 硬件
    的頭像 發(fā)表于 05-05 09:17 ?2957次閱讀
    <b class='flag-5'>OpenHarmony</b>硬件<b class='flag-5'>資源</b>池化架構(gòu)介紹 <b class='flag-5'>OpenHarmony</b>如何實現(xiàn)多設(shè)備協(xié)同

    鴻蒙ArkUI聲明式學習:【UI資源管理

    OpenHarmony 應用的資源分類資源訪問以及應用開發(fā)使用的像素單位以及各單位之間相互轉(zhuǎn)換的方法。
    的頭像 發(fā)表于 04-08 22:08 ?734次閱讀
    鴻蒙ArkUI聲明式學習:【UI<b class='flag-5'>資源管理</b>】

    鴻蒙開發(fā)接口資源管理:【@ohos.resourceManager (資源管理)】

    資源管理模塊,根據(jù)當前configuration(語言,區(qū)域,橫豎屏,mccmnc)和device capability(設(shè)備類型,分辨率)提供獲取應用資源信息讀取接口。
    的頭像 發(fā)表于 06-03 15:10 ?1015次閱讀
    鴻蒙開發(fā)接口<b class='flag-5'>資源管理</b>:【@ohos.resourceManager (<b class='flag-5'>資源管理</b>)】

    OpenHarmony3.1 Release版本特性解析——OpenHarmony硬件資源池化架構(gòu)介紹

    訪問。1.2 一對多隨著全場景智慧生活的不斷深入,“一對一”的設(shè)備硬件資源訪問方式已不能滿足某些復雜場景的業(yè)務需求。OpenHarmony
    發(fā)表于 05-23 16:42

    OpenHarmony輕量系統(tǒng)中內(nèi)核資源主要管理方式

    資源少,一般的數(shù)據(jù)資源都是小批量的,所以其資源管理方式都比較簡單且相似,本文重點講解在輕量系統(tǒng)內(nèi)核中,典型的資源的存儲和訪問
    發(fā)表于 10-21 11:34

    WCDMA無線資源管理

    本課程介紹了無線資源管理的相關(guān)知識。首先通過對無線資源管理的總體介紹,讓大家對無線資源管理有了一個大體上的概念接著對無線資源管理的幾個方面:信道配置、
    發(fā)表于 06-01 16:02 ?5次下載

    WCDMA無線資源管理綜述

    無線資源管理RRM Radio Resource Management)WCDMA系統(tǒng)是一個自干擾的系統(tǒng),無線資源管理的過程就是一個控制自己系統(tǒng)內(nèi)的干擾的過程功率是最終的無線資源,最有效地使用無線
    發(fā)表于 06-09 14:34 ?65次下載

    網(wǎng)格資源管理模型研究

    文章分析了網(wǎng)格資源管理中的三種模型:傳統(tǒng)的資源管理,基于代理的資源管理和基于經(jīng)濟學的資源管理。以Globus 為例討論了傳統(tǒng)的資源管理方法;
    發(fā)表于 08-07 14:30 ?15次下載

    基于樹形的網(wǎng)格資源管理研究

    資源管理是計算機網(wǎng)格研究的基礎(chǔ)內(nèi)容之一。首先介紹了當前的主流網(wǎng)格資源管理模型,然后提出了一種新型的資源管理模型――基于樹形的網(wǎng)格資源管理模型。模型以代理作為基
    發(fā)表于 12-30 14:17 ?15次下載

    什么是無線資源管理,主要的技術(shù)有哪些?

    什么是無線資源管理,主要的技術(shù)有哪些? 無線資源管理(Radio Resource Management,RRM)的目標是在有限帶寬的條件下,為網(wǎng)絡內(nèi)無線用戶終
    發(fā)表于 06-15 13:33 ?2649次閱讀

    Hadoop的YARN資源管理系統(tǒng)

    本質(zhì)上是資源管理系統(tǒng)。YARN提供了資源管理資源調(diào)度等機制
    的頭像 發(fā)表于 03-15 17:00 ?2194次閱讀
    Hadoop的YARN<b class='flag-5'>資源管理</b>系統(tǒng)

    鴻蒙內(nèi)核源碼分析:進程是內(nèi)核的資源管理單元

    從系統(tǒng)的角度看,進程是資源管理單元。進程可以使用或等待CPU、使用內(nèi)存空間等系統(tǒng)資源,并獨立于其它進程運行。OpenHarmony內(nèi)核的進程模塊可以給用戶提供多個進程,實現(xiàn)了進程之間的切換和通信,幫助用戶
    發(fā)表于 11-24 17:52 ?23次下載
    鴻蒙內(nèi)核源碼分析:進程是內(nèi)核的<b class='flag-5'>資源管理</b>單元

    擬態(tài)通用運行環(huán)境的資源管理調(diào)度及框架

    資源管理與調(diào)度等方面論述擬態(tài)資源管理服務與調(diào)度算法的設(shè)計與實現(xiàn),構(gòu)造擬態(tài)運行節(jié)點軟硬件資源異構(gòu)特征分類器及基于三級異構(gòu)度分類的節(jié)點N元組和N
    發(fā)表于 05-12 11:20 ?6次下載

    OpenHarmony硬件資源池化模型

    在設(shè)計初期,為解決兩臺設(shè)備間的協(xié)同問題,我們通過 OpenHarmony 提供的分布式設(shè)備虛擬化能力將兩臺設(shè)備的硬件資源進行融合,實現(xiàn)了“一對一”的硬件資源訪問。這便是硬件
    的頭像 發(fā)表于 05-11 10:24 ?1489次閱讀

    OpenHarmony實例:【資源管理器】

    本工程使用[@ohos.app.ability.common]?接口中的AbilityContext類,獲取資源管理器resourceManager
    的頭像 發(fā)表于 04-09 15:10 ?406次閱讀
    <b class='flag-5'>OpenHarmony</b>實例:【<b class='flag-5'>資源管理</b>器】