1、背景介绍
在应用开发中会用到各种各样的资源文件,字符串、图片、音视频媒体、颜色值、主题等。字符串有时候会涉及到国际化的东西,而颜色图片可能涉及到主题切换的事情。
做过Android开发的都知道,在Android中有三种资源,一种是参与编译最终通过R文件访问的,放置在res下面,用于存放应用程序的资源,包括图标、GUI布局等。这些资源在打包时会被直接通过aapt(资源文件打包工具)处理,映射到Android工程的R文件中,生成R.资源文件对应的ID,通常都可以通过资源ID访问;另一种是raw,在res/raw下面,用于存放原始的、未经处理的资源文件,例如音频文件、视频文件和纯文本文件。这些文件在编译时不会被处理成其他格式,而是以原样保留。最后一种是assets,用于存放需要打包到应用程序的静态文件,以便部署到设备中,assets
文件夹下的文件不会被编译成二进制文件,而是按原样复制到设备上。
HarmonyOS Next也提供了类似的资源目录,里面存放需要用到颜色、字体、间距、图标等资源,在不同的设备或配置中,这些资源的值可能不同。下面先介绍HarmonyOS Next的资源目录。
2、资源目录介绍
HarmonyOS Next目录分为两种:
- 资源目录:包含base目录、限定词目录、rawfile目录、resfile目录
- 资源组目录:包含element、media、profile
工程中资源结构如下图所示:
下面介绍下各个目录的作用:
- base目录:base目录是默认存在的目录,二级子目录element用于存放字符串、颜色、布尔值等基础元素,media、profile存放媒体、动画、布局等资源文件。目录中的资源文件会被编译成二进制文件,并赋予资源文件ID。通过指定资源类型(type)和资源名称(name)访问。类似于Android的res目录。
限定词目录:en_US和zh_CN是默认存在的两个限定词目录,其余限定词目录需要开发者根据开发需要自行创建。二级子目录element、media、profile用于存放字符串、颜色、布尔值等基础元素,以及媒体、动画、布局等资源文件。目录中的资源文件会被编译成二进制文件,并赋予资源文件ID。通过指定资源类型(type)和资源名称(name)来访问。限定词有以下几种:
- 移动国家码和移动网络码
- 语言
- 文字
- 国家或地区
- 横竖屏
- 设备类型
- 颜色模式
- 屏幕密度
- rawfile目录:支持创建多层子目录,子目录名称可以自定义,文件夹内可以自由放置各类资源文件。目录中的资源文件会被直接打包进应用,不经过编译,也不会被赋予资源文件ID。通过指定文件路径和文件名访问。
- resfile目录:支持创建多层子目录,子目录名称可以自定义,文件夹内可以自由放置各类资源文件。目录中的资源文件会被直接打包进应用,不经过编译,也不会被赋予资源文件ID。应用安装后,resfile资源会被解压到应用沙箱路径,通过Context属性resourceDir获取到resfile资源目录后,可通过文件路径访问。
3、资源访问
一般在har包内,可以通过"$r"
或"$rawfile"
访问资源:
- 对于“color”、“float”、“string”、“plural”、“media”、“profile”等类型的资源,通过"$r('app.type.name')"形式访问。其中,app为resources目录中定义的资源;type为资源类型或资源的存放位置;name为资源名,开发者定义资源时确定。
- 对于rawfile目录资源,通过"$rawfile('filename')"形式访问。其中,filename为rawfile目录下文件的相对路径,文件名需要包含后缀,路径开头不可以"/"开头。
- 通过本应用上下文获取ResourceManager后,调用不同资源管理接口访问不同资源。例如:getContext().resourceManager.getStringByNameSync('test') 可获取字符串资源;getContext().resourceManager.getRawFd('rawfilepath') 可获取Rawfile所在hap包的descriptor信息,访问rawfile文件时需{fd, offset, length}一起使用。
这里有两个注意点:
- 对于string.json中使用多个占位符的情况,通过
$r('app.string.label','aaa','bbb',444)
形式访问。 - 通过资源id方式获取资源比直接通过资源获取性能更好。
对于跨HAP/HSP包应用资源的访问,通过createModuleContext(context, moduleName)接口创建同应用中不同module的上下文,获取resourceManager对象后,调用不同资源管理接口访问不同资源。通过"$r"
或"$rawfile"
访问资源
4、API介绍
资源的访问系统提供了@ohos.resourceManager
接口。
首先通过resourceManager.getResourceManager获取首先通过resourceManager,接着可以通过getStringSync、getMediaContent等接口,提供的接口如下图:
5、参考资料
6、总结
HarmonyOS Next提供了类似Android的资源目录,包括base、限定词和rawfile目录。base目录包含编译后的二进制文件,而限定词目录根据不同语言或设备类型存放相应资源。rawfile目录直接打包原始文件,不经过编译。资源可以通过$r
或$rawfile
访问,或者使用ResourceManager接口获取。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。