XAR的资源包为对应的XAR提供各种资源,每个XAR都有一个主资源包,资源包支持继承,一个XAR可以有多个资源包,这些资源包可以动态切换成主资源包;XAR可以动态添加资源包,以外挂资源包的形式,方便扩展。
一、 XAR的主资源包
一般来说,一个XAR都有一个对应的主资源包,而且最多同时存在一个主资源包;也可以没有任何资源包,如果XAR本身不需要依赖额外的资源
主XAR包的配置在xar的package.cfg文件里面,定义如下:
<mainres package="boltres"/>
那么boltres便是当前的XAR的主资源包,这样XAR在加载完毕之后,会自动加载该资源包,并且优先使用该资源包里面定义的资源
主资源包和需要动态切换的资源包,都应该在XAR对应的res目录下面
二、 多资源包和动态切换
一个XAR可以同时存在多个资源包,并且可以动态切换
如果存在多个XAR资源包的话,这些资源包需要并列的存放在对应的res目录下面,如下:
如上图所示,该XAR定义了三个资源包,名字分别是boltres,boltres1,boltres2,其中boltres是主资源包(在XAR的package.cfg里面指定的),而boltres1和boltres2是备用资源包,这三个资源包可以有继承关系,也可以没有任何关系,XAR在使用过程中,可以动态切换到某个资源包
(需要注意的是,资源包文件夹的名字就是该资源包的名字)
动态切换资源包,是调用XAR的SelectResPackage方法来实现的,比如想切换到boltres2资源包,那么只需要调用SelectResPackage(“boltres2”)即可,资源包切换成功后,界面会自动更新
三、 外挂资源包
XAR有两种模式,一种是UNION模式,也就是整个XAR都打包成一个目录,包括了layout和res目录;还有一种是PART模式,也就是layout和res下面的资源包分别打包
如果程序在运行过程中,需要动态切换一个资源包,而这个资源包之前并不存在,那么可以:
1. 对于PART模式,那么直接把这个资源包添加到对应的res目录下面就可以,正如上面我们所述的那样,只要保证名字不重合即可;如果该模式下的资源目录不可写(考虑UAC权限等因素),那么参考下面一条
2. 对于UNION模式,由于XAR在加载后中不可动态修改;在加载之前动态修改并且再打包的成本也太大,所以需要使用外挂资源包策略
外挂资源包,也就是动态的向XAR添加一个资源包,该资源包的路径可以是随意的,比如存在一个下载目录或者临时目录等,只要调用XAR的AddResPackage即可:
接口如下
bool AddResPackage(string packageName, string packageFile)
l packageName就是资源包的名字,这个可以使用xar的SelectResPackage来加载
l packageFile是外部资源包的完整路径,支持zip和文件夹两种形式
需要注意的是,如果指定名字的资源包已经在xar内置资源包里面存在,那么SelectResPackage会优先使用内置资源包
外挂资源包一旦添加成功后,就可以像内置资源包一样使用了,直接调用SelectResPackage(packageName)就可以切换到该资源包;外挂资源包也可以继承内置资源包,且内置资源包也可以继承外挂资源包
四、 资源包继承
资源包支持继承,一个资源包可以指定另一个资源包为自己的父资源包,配置方法如下:
在资源包的resource.cfg文件里面,根节点增加fathername属性,如下所示:
比如boltres资源包的配置里面,定义了
<xlue name="default" author="xxx" copyright="xxx" fathername=”boltres1”></xlue>
那么便指定了boltres1为boltres的父资源包,当一个资源在boltres里面查找不到的时候,会继续往boltres1资源包里面查询,如此逐级向上,直到没有父资源包为止。
父资源包必须是该XAR的几个内置资源包之一,或者动态添加的外挂资源包,不可以引用其它XAR里面定义的资源包
使用父资源包,有如下注意事项:
l 资源包不可以自我引用,也就是自己又是自己的父资源包,也不可引用和自己同名的资源包做为父资源包
l 资源包不可以循环引用,这个需要使用者自己保证
l 资源包不可跨XAR引用,也就是不能引用其它XAR里面定义的资源包
l 资源包必须是单继承的,也就是最多只能继承一个资源包,但是可以多层继承
l 加载一个资源包,那么该资源包的直接、间接父资源包也会被同时加载,这点需要考虑到,避免带来不必要的开销
五、 多资源包/外挂资源包/资源包继承的使用场合
一般来说,大部分的简单XAR都只有一个主XAR,便可满足需求,那么什么时候使用复杂的资源包策略呢?
l 多资源包
多资源包主要用来支持资源层面的换肤:换肤需求里面有一个策略,就是传统的更改界面素材,包括图片,纹理,颜色等,这种情况下就需要配置多个并列的资源包,并且在换肤时候进行切换
另外还可以用以资源的按需加载,比如一个庞大的XAR,里面依赖的资源非常多,但是界面某一个时刻只显示一小部分内容,那么就可以把该XAR的资源包精确的分割成多个,并在适当的时机进行切换,减少内存占用,加快XAR的加载速度等
l 资源包继承
如果多个资源包里面有相同的内容,并不跟随资源包切换而改变,那么可以把这部分抽出来,放到一个单独的资源包Base里面,其它资源包继承Base资源包即可,减少资源包的体积,避免代码重复等问题
也可以在形式上分割资源包,每层资源包定义一部分内容,比如有一部分会经常改变,而一部分很少改动,那么可以在形式上分割,每部分给予不同的权限控制等
l 外挂资源包
这个是在换肤中,用以动态加载一个资源包,该资源包可能是用户自己构造的,也可能是从网络上下载的,那么就可以用外挂资源包的形式来加载