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

OpenHarmony 应用的资源分类和资源的访问以及应用开发使用的像素单位以及各单位之间相互转换的方法。

资源分类

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

2_3_1_1

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

2_3_1_2

鸿蒙OS开发更多内容↓点击HarmonyOS与OpenHarmony技术
鸿蒙技术文档开发知识更新库gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md在这。

搜狗高速浏览器截图20240326151547.png

资源访问

如果失效请添加mau123789是v直接拿取鸿蒙学习文档

OpenHarmony 应用资源分为两类,一类是应用资源,另一类是系统资源,它们的资源访问方式如下:

  • 访问应用资源

    base 目录下的资源文件会被编译成二进制文件并且给这些资源赋予唯一的 ID ,使用相应资源的时候通过资源访问符  r ( ′ a p p . t y p e . n a m e ′ ) ∗ ∗ 的形式, ∗ ∗ a p p ∗ ∗ 代表是应用内  ‘ r e s o u r c e s ‘ 目录中定义的资源; ∗ ∗ t y p e ∗ ∗ 表示资源类型,可取值有  ‘ c o l o r ‘ 、  ‘ f l o a t ‘ 、  ‘ s t r i n g ‘ 、  ‘ s t r i n g ‘ 、  ‘ m e d i a ‘ 等; ∗ ∗ n a m e ∗ ∗ 表示资源的文件名字。例如  ∗ ∗ s t r i n g . j s o n ∗ ∗ 中新加  ∗ ∗ n a m e ∗ ∗ 为  ∗ ∗ t e x t s t r i n g ∗ ∗ 的字符串,则访问该字符串资源为  ∗ ∗ r('app.type.name')**  的形式,**app** 代表是应用内 `resources` 目录中定义的资源;**type** 表示资源类型,可取值有 `color` 、 `float` 、 `string` 、 `string` 、 `media` 等;**name** 表示资源的文件名字。例如 **string.json** 中新加 **name** 为 **text_string** 的字符串,则访问该字符串资源为  ** r(app.type.name) 的形式,app 代表是应用内 ‘resources‘ 目录中定义的资源;type 表示资源类型,可取值有 ‘color‘  ‘float‘  ‘string‘  ‘string‘  ‘media‘ 等;name 表示资源的文件名字。例如 string.json 中新加 name  textstring 的字符串,则访问该字符串资源为 r(‘app.string.text_string’)

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

    2_3_2_1

    通过  $(‘app.type.name’)  访问资源的简单样例如下所示:

    @Entry @Component struct ResourceTest {build() {Column({space: 10}) {Text($r('app.string.text_string'))                       // 访问字符串资源.size({width: 300, height: 120})                       // 设置尺寸.fontSize($r('app.float.text_size'))                   // 访问字体大小.fontColor($r('app.color.text_color'))                 // 访问字体颜色.backgroundImage($r('app.media.test'), ImageRepeat.XY) // 设备背景图片}.width('100%').height('100%').padding(10)}
    }
    

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

    2_3_2_2

  • 访问系统资源

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

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

    @Entry @Component struct ResourceTest {build() {Column() {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')).backgroundColor($r('sys.color.ohos_id_color_palette_aux1'))Image($r('sys.media.ohos_app_icon')).border({color: $r('sys.color.ohos_id_color_palette_aux1'),radius: $r('sys.float.ohos_id_corner_radius_button'),width: 2}).margin({top: $r('sys.float.ohos_id_elements_margin_horizontal_m'),bottom: $r('sys.float.ohos_id_elements_margin_horizontal_l')}).height(200).width(300)}.padding(10).width("100%").height("100%")}
    }
    

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

    2_3_2_3

像素单位

ArkUI开发框架提供了 4 种像素单位供开发者使用,分别是: px 、 vp 、 fp 和 lpx ,它们之间的区别如下表所示:

名称描述
px屏幕物理像素单位。
vp屏幕密度相关像素单位,根据屏幕像素密度转换为屏幕物理像素。
fp字体像素,与vp类似适用于屏幕密度变化,随系统字体大小设置变化。
lpx视窗逻辑像素单位,lpx单位为实际屏幕宽度与逻辑宽度(在 config.json 中配置的 designWidth )的比值,如配置 designWdith 为 720 时,在实际宽度为 1440 物理像素的屏幕上, 1px 为 2px 。

ArkUI开发框架也提供了全局方法把这些不同的尺寸单位相互转换,全局方法如下所示:

declare function vp2px(value: number): number;
declare function px2vp(value: number): number;
declare function fp2px(value: number): number;
declare function px2fp(value: number): number;
declare function lpx2px(value: number): number;
declare function px2lpx(value: number): number;
  • vp2px:将 vp 单位的数值转换为以 px 为单位的数值。
  • px2vp:将 px 单位的数值转换为以 vp 为单位的数值。
  • fp2px:将 fp 单位的数值转换为以 px 为单位的数值。
  • px2fp:将 px 单位的数值转换为以 fp 为单位的数值。
  • lpx2px:将 lpx 单位的数值转换为以 px 为单位的数值。
  • px2lpx:将 px 单位的数值转换为以 lpx 为单位的数值。

这些单位尺寸具体大小,笔者举个简单样例演示一下:

@Entry @Component struct ResourceTest {build() {Column() {Flex({ wrap: FlexWrap.Wrap }) {Column() {Text("width(220)").width(220).height(40).backgroundColor(Color.Pink).textAlign(TextAlign.Center).fontSize('12vp')}.margin(5)Column() {Text("width('220px')").width('220px').height(40).backgroundColor(Color.Pink).textAlign(TextAlign.Center)}.margin(5)Column() {Text("width('220vp')").width('220vp').height(40).backgroundColor(Color.Pink).textAlign(TextAlign.Center).fontSize('12vp')}.margin(5)Column() {Text("width('220lpx') designWidth:720").width('220lpx').height(40).backgroundColor(Color.Pink).textAlign(TextAlign.Center).fontSize('12vp')}.margin(5)Column() {Text("width(vp2px(220) + 'px')").width(vp2px(220) + 'px').height(40).backgroundColor(Color.Pink).textAlign(TextAlign.Center).fontSize('12vp')}.margin(5)Column() {Text("fontSize('12fp')").width(220).height(40).backgroundColor(Color.Pink).textAlign(TextAlign.Center).fontSize('12fp')}.margin(5)}.width('100%').height("100%")}.width('100%').height("100%").padding(10)}
}

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

2_3_3_1

资源管理器

ArkUI开发框架在 @ohos.resourceManager 模块里提供了资源管理器 ResourceManager,它可以访问不同的资源,比如获取获取字符串资源,获取设备配置信息等等,resourceManager 模块提供部分 API 如下所示:

declare namespace resourceManager {// 省略部分代码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 之前先调用 getContext(this) 方法获取当前组件的 Context,该 Conetxt 内部定义了一个 ResourceManager 的属性,因此可以直接使用 ResourceManager 的各种 getXXX() 方法获取对应资源, ResourceManager 使用流程如下所示:

  • 引入 resourceManager

    import resourceManager from '@ohos.resourceManager';
    

    1

  • 获取 ResourceManager

    aboutToAppear() {// 获取ResourceManagerlet manager = getContext(this).resourceManager;
    }
    
  • 使用 ResourceManager

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

    this.manager.release();
    

完整样例如下所示:

import resourceManager from '@ohos.resourceManager';@Entry @Component struct ResourceTest {@State text_string: string = "";@State capability: string = "";@State configuration: string = "";private resManager: resourceManager.ResourceManager;build() {Column({ space: 10 }) {Text(this.text_string)                   // 访问字符串资源.size({ width: 300, height: 120 })     // 设置尺寸.fontSize($r('app.float.text_size'))   // 访问字体大小.fontColor($r('app.color.text_color')) // 访问字体颜色.backgroundImage($r('app.media.test')) // 设备背景图片Text(this.capability)                    // capability信息.fontSize(20)Text(this.configuration)                 // configuration信息.fontSize(20)}.width('100%').height('100%').padding(10)}aboutToAppear() {this.resManager = getContext(this).resourceManager;this.resManager.getStringValue(0x1000001, (innerError, data) => {if(data) {this.text_string = data;} else {console.log("error: " + JSON.stringify(innerError));}})this.resManager.getDeviceCapability((innerError, deviceCapability) => {if(deviceCapability) {this.capability = JSON.stringify(deviceCapability);}})this.resManager.getConfiguration((innerError, configuration) => {if(configuration) {this.configuration = JSON.stringify(configuration);}})}aboutToDisappear() {this.resManager?.release(); // 释放 ReleaseManager 资源}}

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

2_3_4_1

渲染出来的 mock string 是因为在预览器上暂时不支持 ResourceManager 的用法,在实际设备上是没问题的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/801413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python+django教师业绩考评考核评分系统flask

在设计过程中&#xff0c;将参照一下国内外的一些同类网站&#xff0c;借鉴下他们的一些布局框架&#xff0c;将课题要求的基本功能合理地组织起来&#xff0c;形成友好、高效的交互过程。开发的具体步骤为&#xff1a;   第一步&#xff0c;进行系统的可行性分析&#xff0c…

java实现TCP交互

服务器端 import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.PriorityQueue; import java.util.Scanner;public class TCP_Serv…

【Leetcode每日一题】 递归 - 二叉树剪枝(难度⭐⭐)(50)

1. 题目解析 题目链接&#xff1a;814. 二叉树剪枝 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 想象一下&#xff0c;你有一堆层层叠叠的积木&#xff0c;你想从底部开始&#xff0c;把那些标记为0的积木拿走。如…

C++奇迹之旅:我与类和对象相遇

文章目录 &#x1f4dd;面向过程和面向对象初步认识&#x1f320; 类&#x1f309;类的引入&#x1f309;类的定义 &#x1f320;类的访问限定符&#x1f320;访问限定符 &#x1f320;类的两种定义方式&#x1f309;封装 &#x1f6a9;总结 &#x1f4dd;面向过程和面向对象初…

spring cloud gateway openfeign 联合使用产生死锁问题

spring cloud gateway openfeign 联合使用产生死锁问题&#xff0c;应用启动的时候阻塞卡住。 spring.cloud 版本如下 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><vers…

国际数字影像产业园以数字影像技术,重构文创生活

国际数字影像产业园区&#xff0c;作为树莓集团与成都市金牛区人民政府合作的重点项目&#xff0c;于2023年3月正式在金牛区落地生根。这一园区不仅是第五代产业园区的代表&#xff0c;更是数字影像相关产业服务的特色园区&#xff0c;其独特的定位和宏大的愿景“以数字影像技术…

达梦关键字(如:XML,EXCHANGE,DOMAIN,link等)配置忽略

背景&#xff1a;在使用达梦数据库时&#xff0c;查询SQL中涉及XML,EXCHANGE,DOMAIN,link字段&#xff0c;在达梦中是关键字&#xff0c;SQL报关键词不能使用的错误。 解决办法&#xff1a; 配置达梦安装文件E:\MyJava\dmdbms\data\DAMENG\dm.ini 忽略这些关键词&#xff0c;…

景联文科技:为AI大模型提供高质海量训练数据

在全球AI浪潮的推动下&#xff0c;大量训练数据已成为AI算法模型发展和演进中的关键一环。 艾瑞咨询数据显示&#xff0c;包括数据采集、数据处理&#xff08;标注&#xff09;、数据存储、数据挖掘等模块在内的AI基础数据服务市场&#xff0c;将在未来数年内持续增长。 预计到…

MySQL典型示例

目录 1.使用环境 2.设计表 3.创建表 4.准备数据 5.查询 1.使用环境 数据库&#xff1a;MySQL 8.0.30 客户端&#xff1a;Navicat 15.0.12 2.设计表 假设我们已经建好了一个名为test的数据库。我们添加如下几个表&#xff1a;教师、课程、学生、班级、成绩。实体联系图设…

跨平台私人ChatGPT应用ChatGPT-Next-Web

什么是 NextChat (ChatGPT Next Web) &#xff1f; NextChat (ChatGPT Next Web) 是可以一键免费部署的跨平台私人 ChatGPT 应用, 支持 GPT3, GPT4 & Gemini Pro 模型。 准备 因为老苏没有 OpenAI Key&#xff0c;所以使用 FreeGPT35 来提供无限免费的 GPT-3.5-Turbo API …

qt调试日志文件生成

系列文章目录 第一章 qt日志文件生成功能 文章目录 系列文章目录前言一、qt日志文件生成功能二、使用步骤1.代码示例2.运行截图 前言 qt有固定的调试日志接口&#xff0c;可以通过终端去打印&#xff0c;但是仅适用在本地去调试&#xff0c;例如想长期放到测试台去检测&#…

如何给MySQL数据库的所有表统一加上字段

在开发过程中&#xff0c;有时候慢慢的建了很多数据库表&#xff0c;但是后来发现需要统一增加某些字段的时候&#xff0c;可以通过alter语句 ALTER TABLE 表名 ADD 列名 数据类型;比如我要给t_user表增加gmt_create与gmt_modified字段&#xff0c;用作记录新增记录时间与更新…

【机器人】PyBullet四足机器狗仿真

随着科技的迅猛发展&#xff0c;机器人技术正日益成为现实生活中的重要组成部分。而在机器人研究领域&#xff0c;仿真技术的应用扮演着不可或缺的角色。它不仅可以节约大量资源和成本&#xff0c;更为工程师和研究者提供了一个安全、高效的实验平台。在这个博客中&#xff0c;…

hanlp中文分词器(ing...)

目前的工作中需要对文本进行分词分析词性,找出热词,经过一系列的调研感觉hanlp这个库还不错,想先试用看看 介绍 HanLP&#xff08;Han Language Processing&#xff09;是一个由一系列模型与算法组成的NLP工具包&#xff0c;目标是普及自然语言处理在生产环境中的应用。HanLP…

工地安全监测识别摄像机

工地安全监测识别摄像机是一种在建筑工地和施工现场广泛使用的智能监控设备&#xff0c;主要用于监测施工过程中可能出现的安全隐患和违规行为&#xff0c;以确保工地人员和设备的安全。通过高清摄像头、智能算法和远程监控系统的结合&#xff0c;该摄像机可以实时监测工地各个…

电商社交新零售:创新引领新趋势,变革新零售思维格局-亿发

新零售O2O模式是如何颠覆传统零售商业模式&#xff1f; 传统电商出现瓶颈&#xff1a; 传统电商在发展过程中逐渐出现了瓶颈&#xff0c;主要表现在市场竞争激烈、用户获取成本上升、用户黏性下降等问题。传统电商往往只能通过价格竞争或促销活动来吸引用户&#xff0c;而这种…

重构数据访问层-优化数据访问的开发

重新整理了一下过去开发的框架&#xff0c;在准备开发新项目时候&#xff0c;重新整理了一下思路&#xff0c;感觉数据访问层还是很鸡肋。过去几年中&#xff0c;急于完成项目开发和交付&#xff0c;框架都是迭代过来的&#xff0c;虽然满足了开发需求&#xff0c;但是&#xf…

软考118-上午题-【软件工程】-能力成熟度模型

一、考试题型 选择题&#xff08;13题&#xff09; 二、能力成熟度模型CMM 能力成熟度模型CMM的研究目的是&#xff1a;提供一种评价软件承接方能力的方法&#xff0c;同时它可帮助软件组织改进其软件过程。 CMM 将软件过程改进分为以下5个成熟度级别&#xff1a; 1、初始级…

二叉树的遍历——bfs广度优先搜索

1、BinNode类的创建 &#xff08;1&#xff09;代码总览 ##&#xff08;2&#xff09;测试示例 2、二叉树的遍历 &#xff08;1&#xff09;图示 &#xff08;2&#xff09;代码总览 &#xff08;3&#xff09;测试示例

ai智能电销机器人的核心技术,工作原理和作用

科技快速发展的同时&#xff0c;带来了人工智能产品的普及。而ai智能电销机器人则成为推进电销行业的产物&#xff0c;那么ai智能电销机器人是如何帮助企业高效触客&#xff0c;有效地工作&#xff0c;效果又如何呢&#xff1f;我们一起来看看吧&#xff01; 一、ai智能电销机器…