鸿蒙操作系统应用开发实践
上QQ阅读APP看书,第一时间看更新

1.7 资源文件

1.7.1 Resource目录介绍

HarmonyOS中的应用程序会使用各种资源,例如图片、字符串等,开发者会把它们放入源码的相应文件夹下面,HarmonyOS也支持并鼓励开发者把与UI相关的布局和元素,用XML资源实现。

HarmonyOS中的资源文件分为两大类,一类为base目录与限定词目录,这一类中的资源为可直接访问资源,可以用ResourceTable直接访问,都保存在resource文件下,在编译的情况下会自动生产ResourceTable.java文件,其中保存着每个资源的编号索引文件供开发者使用。另一类为rawfile目录,rawfile目录下的文件不能被ResourceTable直接访问,只能通过指定文件路径和文件名来引用。

1.7.2 Resource文件编写

resources文件夹中的结构如图1.43所示。

图1.43 resources文件结构

其中,base文件夹和限定词文件夹按照两级目录形式来组织,目录命名必须符合规范,以便根据设备状态去匹配相应目录下的资源文件,一级子目录为base目录和限定词目录。

base目录是默认存在的目录。当应用的resources目录中没有与设备状态匹配的限定词目录时,会自动引用该目录中的资源文件。

限定词目录需要开发者自行创建。目录名称由一个或多个表征应用场景或设备特征的限定词组合而成,而二级子目录为资源目录,用于存放字符串、颜色、布尔值等基础元素,以及媒体、动画、布局等资源文件,下面详细介绍一下。

首先介绍一下限定词目录的创建规则。限定词目录可以由一个或多个表征应用场景或设备特征的限定词组合而成,包括语言、文字、国家或地区、横竖屏、设备类型和屏幕密度等6个维度,限定词之间通过下画线(_)或者中画线(-)连接。开发者在创建限定词目录时,需要掌握限定词目录的命名要求及与限定词目录与设备状态的匹配规则。之所以需要用到限定词,就是为了让资源限定在特定的情况下使用,如果限定词目录中包含语言、文字、横竖屏、设备类型限定词,则对应限定词的取值必须与当前的设备状态完全一致,这样该目录才能够参与设备的资源匹配。例如,限定词目录zh_CN-car-ldpi不能参与en_US设备的资源匹配。

下面详细说明下限定词的创建规则。限定词目录的命名规则为语言_文字_国家或地区-横竖屏-设备类型-屏幕密度。开发者可以根据应用的使用场景和设备特征,选择其中的一类或几类限定词组成目录名称。语言、文字、国家或地区之间采用下画线(_)连接,除此之外的其他限定词之间均采用中画线(-)连接。例如zh_Hant_CN、zh_CN-car-ldpi。

然后详细说明一下限定词的类型。上述讲到限定词目录的命名规则为语言_文字_国家或地区-横竖屏-设备类型-屏幕密度。其中第1个限定词语言表示设备使用的语言类型,由2个小写字母组成。例如zh表示中文,en表示英语。具体详细取值范围,可以参见ISO 639-1(ISO制定的语言编码标准)。

第2个限定词文字表示设备使用的文字类型,由1个大写字母(首字母)和3个小写字母组成。例如Hans表示简体中文,Hant表示繁体中文。具体详细取值范围,参见ISO 15924(ISO制定的文字编码标准)。

第3个限定词表示用户所在的国家或地区,由2~3个大写字母或者3个数字组成。例如CN表示中国,GB表示英国。具体详细取值范围,参见ISO 3166-1(ISO制定的国家和地区编码标准)。

第4个限定词表示横竖屏,其中,vertical代表竖屏,horizontal代表横屏,再后面是设备类型和屏幕密度,具体规则可以查阅官方文档。

在为设备匹配对应的资源文件时,限定词目录匹配的优先级从高到低依次为区域(语言_文字_国家或地区)>横竖屏>设备类型>屏幕密度。

资源组目录创建规则如下,base目录和限定词目录下可以创建资源组目录,包括element、media、animation、layout、graphic、profile 6种文件夹目录,可以分别存放不同的资源,如图1.44所示。

图1.44 资源组目录结构

(1)element: element表示元素资源,其下的每个资源文件都用相应的JSON文件来表征。

boolean表示布尔型,boolean.json的示例代码如下:

    //boolean.json
    {
        "boolean":[
            {
                 "name":"boolean_1",
                 "value":true
            },
            {
                 "name":"boolean_ref",
                 "value":"$ boolean:boolean_1"
            }
        ]
    }

color表示颜色,color.json的示例代码如下:

    //color.json
    {
        "color":[
          {
              "name":"red",
              "value":"#ff0000"
          },
          {
              "name":"red_ref",
              "value":"$ color:red"
          }
       ]
    }

float表示浮点型,float.json的示例代码如下:

    //float.json
    {
        "float":[
            {
                 "name":"float_1",
                 "value":"30.6"
            },
            {
                 "name":"float_ref",
                 "value":"$ float:float_1"
            },
            {
                 "name":"float_px",
                 "value":"100px"
            }
        ]
    }

intarray表示整型数组,intarray.json的示例代码如下:

    //intarray.json
    {
        "intarray":[
            {
                 "name":"intarray_1",
                 "value":[
                      100,
                      200,
                     "$ integer:integer_1"
                 ]
            }
        ]
    }

integer表示整型,integer.json的示例代码如下:

    //integer.json
    {
        "integer":[
            {
                 "name":"integer_1",
                 "value":100
            },
            {
                 "name":"integer_ref",
                 "value":"$ integer:integer_1"
            }
        ]
    }

pattern表示样式,pattern.json的示例代码如下:

plural表示复数形式,plural.json的示例代码如下:

strarray表示字符串数组,strarray.json的示例代码如下:

string表示字符串,string.json的示例代码如下:

(2)media: media表示媒体资源,包括图片、声频、视频等非文本格式的文件。媒体资源文件名可自定义,例如icon.png,如图1.45所示。

图1.45 媒体资源文件

(3)animation: animation表示动画资源,其中资源采用XML文件格式表示。文件名可自定义,例如zoom_in.xml。

(4)layout: layout表示布局资源,其中资源采用XML文件格式表示。详细布局内容参考第3章Java UI布局。

(5)graphic: graphic表示可绘制资源,其中资源采用XML文件格式表示,如图1.46所示。

图1.46 XML文件

如要定义一个白色,圆角为5dip的椭圆,可以创建一个white_radius的XML文件,代码如下:

    <?xml version = "1.0"encoding = "utf-8"?>
    <shape xmlns:ohos = "http://schemas.huawei.com/res/ohos"
           ohos:shape = "oval">
    <solid
           ohos:color = "#88ffffff"/>
    <corners ohos:radius = "5dip"/>
    </shape >

(6)profile: profile表示其他类型文件,以原始文件形式保存,文件名可以随意定义。

1.7.3 Resource文件使用

1.Java代码访问资源组文件

base目录与限定词目录中的资源文件可以通过指定资源类型(type)和资源名称(name)来引用。Java文件引用资源文件的格式为ResourceTable.type_name。特别地,如果引用的是系统资源,则采用ohos.global.systemres.ResourceTable.type_name。

如在Java文件中,引用string.json文件中类型为String、名称为app_name的资源,则代码如下:

    ohos.global.resource.ResourceManager resManager = getAbilityContext().getResourceManager();
    String result = resManager.getElement(ResourceTable.String_app_name).getString();

在Java文件中,引用color.json文件中类型为Color、名称为red的资源,则代码如下:

    ohos.global.resource.ResourceManager resManager = getAbilityContext().getResourceManager();
    int color = resManager.getElement(ResourceTable.Color_red).getColor();

2.Java代码访问原生资源文件

访问原生资源文件可以通过指定文件路径和文件名称来引用。

例如在Java文件中,引用一个路径为resources/rawfile/、名称为example.js的资源文件,则代码如下:

    ohos.global.resource.ResourceManager resManager = getAbilityContext().getResourceManager();
    ohos.global.resource.RawFileEntry rawFileEntry = resManager.getRawFileEntry("resources/
    rawfile/example.js");

3.XML文件中引用资源文件

如果需要在XML文件中引用资源文件,需要用$ type: name来引用。如果引用的是系统资源,则采用$ ohos: type: name。

例如,在XML文件中,引用string.json文件中类型为String、名称为app_name的资源,则代码如下:

    <?xml version = "1.0"encoding = "utf-8"?>
    <DirectionalLayout xmlns:ohos = "http://schemas.huawei.com/res/ohos"
       ohos:width = "match_parent"
       ohos:height = "match_parent"
       ohos:orientation = "vertical">
    <Text ohos:text = "$ string:app_name"/>
    </DirectionalLayout >