0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenHarmony资源管理详解 OpenHarmony资源分类和资源的访问方式

ArkUI详解 来源:鸿蒙实验室 作者:鸿蒙实验室 2022-07-05 06:24 次阅读

资源管理

本节笔者向读者介绍一下 OpenHarmony 应用的资源分类和资源的访问方式。废话不多说,我们直接开始。

资源分类

移动端应用开发常用到的资源比如图片,音视频,字符串等都有固定的存放目录,OpenHarmony 把这些应用的资源文件统一放在 resources 目录下的各子目录中便于开发者使用和维护, resoures 目录包括两大类,实际为一类,为 base 目录与限定词目录,另一类为 rawfile 目录(不知道是不是官方文档有误,我已经提了Issue)。新建 OpenHarmony 应用,默认生成的资源目录如下所示:

image-20220704162100551

base 目录与限定词目录下面可以创建资源组目录(包括 elementmediaanimationlayoutgraphicprofile 等),用于存放特定类型的资源文件,各资源目录说明如下图所示:

资源组目录

注意,都是以键值对的形式存在,name不能重复,value可以重复,但我相信,既然name都不重复,value肯定也不会重复,不然意义何在。

资源组目录 目录说明 资源文件
element 表示元素资源,以下每一类数据都采用相应的JSON文件来表征。 - boolean,布尔型 - color,颜色 - float,浮点型 - intarray,整型数组 - integer,整型 - pattern,样式 - plural,复数形式 - strarray,字符串数组 - string,字符串 element目录中的文件名称建议与下面的文件名保持一致。每个文件中只能包含同一类型的数据。 - 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 表示其他类型文件,以原始文件形式保存。 文件名可自定义。

限定词目录

限定词目录可以由一个或多个表征应用场景或设备特征的限定词组合而成,包括移动国家码和移动网络码、语言、文字、国家或地区、横竖屏、设备类型、颜色模式和屏幕密度等维度,限定词之间通过下划线(_)或者中划线(-)连接。开发者在创建限定词目录时,需要掌握限定词目录的命名要求,以及限定词目录与设备状态的匹配规则。

限定词取值要求

限定词类型 含义与取值说明
移动国家码和移动网络码 移动国家码(MCC)和移动网络码(MNC)的值取自设备注册的网络。MCC后面可以跟随MNC,使用下划线()连接,也可以单独使用。 例如: mcc460表示中国, mcc460_mnc00表示中国中国移动。 详细取值范围,请查阅ITU-T E.212(国际电联相关标准)。
语言 表示设备使用的语言类型,由2~3个小写字母组成。例如:zh表示中文,en表示英语,mai表示迈蒂利语。 详细取值范围,请查阅ISO 639(ISO制定的语言编码标准)。
文字 表示设备使用的文字类型,由1个大写字母(首字母)和3个小写字母组成。 例如: Hans表示简体中文, Hant表示繁体中文。 详细取值范围,请查阅ISO 15924(ISO制定的文字编码标准)。
国家或地区 表示用户所在的国家或地区,由2~3个大写字母或者3个数字组成。例如: CN表示中国, GB表示英国。 详细取值范围,请查阅ISO 3166-1(ISO制定的国家和地区编码标准)。
横竖屏 表示设备的屏幕方向,取值如下: - vertical:竖屏 - horizontal:横屏
设备类型 表示设备的类型,取值如下: - car:车机 - tv:智慧屏 - wearable:智能穿戴
颜色模式 表示设备的颜色模式,取值如下: - dark:深色模式 - light:浅色模式
屏幕密度 表示设备的屏幕密度(单位为dpi),取值如下: - sdpi:表示小规模的屏幕密度(Small-scale Dots Per Inch),适用于dpi取值为(0, 120]的设备。 - mdpi:表示中规模的屏幕密度(Medium-scale Dots Per Inch),适用于dpi取值为(120, 160]的设备。 - ldpi:表示大规模的屏幕密度(Large-scale Dots Per Inch),适用于dpi取值为(160, 240]的设备。 - xldpi:表示特大规模的屏幕密度(Extra Large-scale Dots Per Inch),适用于dpi取值为(240, 320]的设备。 - xxldpi:表示超大规模的屏幕密度(Extra Extra Large-scale Dots Per Inch),适用于dpi取值为(320, 480]的设备。 - xxxldpi:表示超特大规模的屏幕密度(Extra Extra Extra Large-scale Dots Per Inch),适用于dpi取值为(480, 640]的设备。

限定词目录与设备状态的匹配规则

在为设备匹配对应的资源文件时,限定词目录匹配的优先级从高到低依次为:移动国家码和移动网络码 > 区域(可选组合:语言、语言文字、语言国家或地区、语言文字国家或地区)> 横竖屏 > 设备类型 > 颜色模式 > 屏幕密度。

如果限定词目录中包含移动国家码和移动网络码、语言、文字、横竖屏、设备类型、颜色模式限定词,则对应限定词的取值必须与当前的设备状态完全一致,该目录才能够参与设备的资源匹配。例如,限定词目录“zh_CN-car-ldpi”不能参与“en_US”设备的资源匹配。

当然也可以自己创建目录,将图片等文件统一存放,比如,我将图片存放在自己创建的“/common/images”目录,这样的话,目录中的资源文件会被直接打包进应用,不经过编译,也不会被赋予资源文件ID。这一点需要大家注意。

资源访问

OpenHarmony 应用资源目录分为三类,一类是应用资源目录,另一类是系统资源目录,还有就是自己创建的目录。

它们的资源访问方式如下:

访问应用资源目录

base 目录下的资源文件会被编译成二进制文件并且给这些资源赋予唯一的 ID ,使用相应资源的时候通过资源访问符 $('app.type.name') 的形式,app 代表是应用内 resources 目录中定义的资源;type 表示资源类型,可取值有 colorfloatstringstringmedia 等;name 表示资源的文件名字。例如 media 中新加 name 为 Car.svg的图片,则访问该字符串资源为 $r('app.media.Car')

笔者在 base 目录下新建 string.jsoncolor.json 文件,分别存放字符串和颜色,资源内容如下图所示:

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')) // 设备背景图片
    Image("common/images/Car.svg").objectFit(ImageFit.Contain).height(200)
    }
    .width('100%')
    }
    .height('100%')
    }
    }

样例运行结果如下图所示:

image-20220704181110662

访问系统资源

系统资源包含 颜色圆角字体间距字符串图片 等,通过使用系统资源,不同的开发者可以开发出具有相同视觉风格的应用,开发者可以通过 $r('sys.type.name') 的形式引用系统资源,和访问应用资源不同的是使用 sys 代表系统资源,其它和访问应用资源规则一致。

访问系统资源简单样例如下所示:

  • @Entry
    @Component
    struct ResourceTest {
    build() {
    Column() {
    Text($r('app.string.title_desc')) //**访问应用资源目录**
    .fontColor($r('sys.color.ohos_fa_alert')) //**访问系统资源目录**
    .fontSize($r('sys.float.ohos_id_text_size_headline3'))
    .backgroundColor($r('sys.color.ohos_id_color_palette_aux1'))
    Image("/common/images/Car.svg") //**自己创建的目录**
    .objectFit(ImageFit.None)
    .border({
    color: Color.Orange,
    radius: 20,
    width: 12
    })
    .margin({
    top: 50,

    })
    .width(200)
    .height(200)

    }
    .padding(20)
    .width("100%")
    .height("100%")
    }
    }

样例运行结果如下图所示:

image-20220704182124083

访问自己创建的目录

我们还可以将图片文件存放在自己创建的“/common/images”目录

使用很简单,如下图所示:

Image("/common/images/Car.svg") //**自己创建的目录**

.objectFit(ImageFit.None)

.border({

color: Color.Orange,

radius: 20,

width: 12

})

.margin({

top: 50,

})

.width(200)

.height(200)

运行效果

image-20220704182449534

资源管理器

ArkUI开发框架在 @ohos.resourceManager 模块里提供了资源管理器 ResourceManager,它可以访问不同的资源,比如获取获取字符串资源,获取设备配置信息等等,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;

// 获取字符串数组资源

getStringArray

(

resId

: number,

callback

: AsyncCallback

<

Array

<

string

>>

): void;

// 获取媒体资源

getMedia

(

resId

: number,

callback

: AsyncCallback

<

Uint8Array

>

): void;

// 获取设备信息,比如当前屏幕密度,设备类型是手机还是平板等

getDeviceCapability

(

callback

: AsyncCallback

<

DeviceCapability

>

): void;

// 获取配置信息,比如当前屏幕方向密度,当前设备语言

getConfiguration

(

callback

: AsyncCallback

<

Configuration

>

): void;

// 释放ResourceManager资源

release

();

}

}

export

default

resourceManager

;

使用 ResourceManager 之前先调用 getResourceManager() 方法获取它,然后再调用 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

=

"应用开发"

;

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

)

// 访问字符串资源

// 设置尺寸

.

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

)

}

}

样例运行结果如下图所示:

IMG_0219

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • HarmonyOS
    +关注

    关注

    79

    文章

    1967

    浏览量

    30012
  • OpenHarmony
    +关注

    关注

    25

    文章

    3658

    浏览量

    16138
收藏 人收藏

    评论

    相关推荐

    OpenHarmony硬件资源池化架构介绍 OpenHarmony如何实现多设备协同

    OpenHarmony的硬件资源池化框架,为大家揭晓OpenHarmony是如何实现多设备协同的。 1. 硬件资源访问的演进 硬件
    的头像 发表于 05-05 09:17 2969次阅读
    <b class='flag-5'>OpenHarmony</b>硬件<b class='flag-5'>资源</b>池化架构介绍 <b class='flag-5'>OpenHarmony</b>如何实现多设备协同

    鸿蒙ArkUI声明式学习:【UI资源管理

    OpenHarmony 应用的资源分类资源访问以及应用开发使用的像素单位以及各单位之间相互转换的方法。
    的头像 发表于 04-08 22:08 742次阅读
    鸿蒙ArkUI声明式学习:【UI<b class='flag-5'>资源管理</b>】

    鸿蒙开发接口资源管理:【@ohos.resourceManager (资源管理)】

    资源管理模块,根据当前configuration(语言,区域,横竖屏,mccmnc)和device capability(设备类型,分辨率)提供获取应用资源信息读取接口。
    的头像 发表于 06-03 15:10 1043次阅读
    鸿蒙开发接口<b class='flag-5'>资源管理</b>:【@ohos.resourceManager (<b class='flag-5'>资源管理</b>)】

    OpenHarmony3.1 Release版本特性解析——OpenHarmony硬件资源池化架构介绍

    访问。1.2 一对多随着全场景智慧生活的不断深入,“一对一”的设备硬件资源访问方式已不能满足某些复杂场景的业务需求。OpenHarmony
    发表于 05-23 16:42

    OpenHarmony轻量系统中内核资源主要管理方式

    资源少,一般的数据资源都是小批量的,所以其资源管理方式都比较简单且相似,本文重点讲解在轻量系统内核中,典型的资源的存储和访问
    发表于 10-21 11:34

    WCDMA无线资源管理

    本课程介绍了无线资源管理的相关知识。首先通过对无线资源管理的总体介绍,让大家对无线资源管理有了一个大体上的概念接着对无线资源管理的几个方面:信道配置、
    发表于 06-01 16:02 5次下载

    WCDMA无线资源管理综述

    无线资源管理RRM Radio Resource Management)WCDMA系统是一个自干扰的系统,无线资源管理的过程就是一个控制自己系统内的干扰的过程功率是最终的无线资源,最有效地使用无线
    发表于 06-09 14:34 65次下载

    网格资源管理模型研究

    文章分析了网格资源管理中的三种模型:传统的资源管理,基于代理的资源管理和基于经济学的资源管理。以Globus 为例讨论了传统的资源管理方法;
    发表于 08-07 14:30 15次下载

    基于树形的网格资源管理研究

    资源管理是计算机网格研究的基础内容之一。首先介绍了当前的主流网格资源管理模型,然后提出了一种新型的资源管理模型――基于树形的网格资源管理模型。模型以代理作为基
    发表于 12-30 14:17 15次下载

    什么是无线资源管理,主要的技术有哪些?

    什么是无线资源管理,主要的技术有哪些? 无线资源管理(Radio Resource Management,RRM)的目标是在有限带宽的条件下,为网络内无线用户终
    发表于 06-15 13:33 2664次阅读

    Hadoop的YARN资源管理系统

    本质上是资源管理系统。YARN提供了资源管理资源调度等机制
    的头像 发表于 03-15 17:00 2209次阅读
    Hadoop的YARN<b class='flag-5'>资源管理</b>系统

    鸿蒙内核源码分析:进程是内核的资源管理单元

    从系统的角度看,进程是资源管理单元。进程可以使用或等待CPU、使用内存空间等系统资源,并独立于其它进程运行。OpenHarmony内核的进程模块可以给用户提供多个进程,实现了进程之间的切换和通信,帮助用户
    发表于 11-24 17:52 23次下载
    鸿蒙内核源码分析:进程是内核的<b class='flag-5'>资源管理</b>单元

    拟态通用运行环境的资源管理调度及框架

    资源管理与调度等方面论述拟态资源管理服务与调度算法的设计与实现,构造拟态运行节点软硬件资源异构特征分类器及基于三级异构度分类的节点N元组和N
    发表于 05-12 11:20 6次下载

    OpenHarmony硬件资源池化模型

    在设计初期,为解决两台设备间的协同问题,我们通过 OpenHarmony 提供的分布式设备虚拟化能力将两台设备的硬件资源进行融合,实现了“一对一”的硬件资源访问。这便是硬件
    的头像 发表于 05-11 10:24 1501次阅读

    OpenHarmony实例:【资源管理器】

    本工程使用[@ohos.app.ability.common] 接口中的AbilityContext类,获取资源管理器resourceManager
    的头像 发表于 04-09 15:10 414次阅读
    <b class='flag-5'>OpenHarmony</b>实例:【<b class='flag-5'>资源管理</b>器】