Xlue里面的对象包括下面三种
一、布局对象,按照类别来分,可以分成下面几类,包括
a) 根对象LayoutObject
b) 蒙层对象MaskObject
c) 可视对象ImageObject、TextureObject、FillObject、EditObject、TextObject、LineObject、PolygonObject等
d) 控制对象 ControlObject、ResizeObject、CaptionObject、NcObject、BlurObject等
e) 实体对象 WebBrowseObject、FlashObject、RealObject等
f) 自定义控件,包括用户自定义的各种control
二、动画对象,包括下面几种
a) 改变位置动画对象 PosChangeAnimation
b) 改变Alpha动画对象 AlphaChangeAnimation
c) 改变蒙层动画对象 MaskChangeAnimation
d) 序列帧动画对象 SeqFrameAnimation
e) 翻转动画对象 TurnObjectAnimation
f) 旋转动画对象 AngleChangeAnimation
g) 自定义动画对象
三、窗口对象,也就是hostwnd,包括下面几种
a) 普通窗体对象 FrameHostWnd
b) 模态对话框对象 ModalHostWnd
c) 菜单对象 MenuHostWnd
d) Tip对象 TipsHostWnd(暂未支持)
四、对象树,UIObjectTree
下面来着重描述这些对象分别应该怎么创建,每种创建方法各有什么优缺点。
这里需要说明的是,对于布局对象和动画对象来说,都依赖于一个ResProvider接口,该接口是对象查找资源(比如图片、颜色、纹理、字体等)和连接资源相关事件所依赖的(其实并不是每个object都依赖这个接口,对于那些不需要使用资源的对象来说,就可以没有这个接口,比如控制类对象、实体对象,都不需要ResProvider)。 ResProvider接口可以通过每个对象创建时候来指定,也可以在对象创建完成之后,显示调用SetResProvider来设定
每个Object的ResProvider既可以是某个XAR,也可以是XARManager,如果设定的是单个XAR,那么该object在查找资源时候,会在该XAR和它所include的XAR里面查找;如果是XARManager,那么会按照XAR的加载顺序,依次在当前已经加载的每个XAR里面查找
第一种创建方式,分别调用各类对象的对象工厂来创建
对于布局对象,使用ObjectFactory来创建,使用范例如下:
local objFactory = XLGetObject("Xunlei.UIEngine.ObjectFactory")
local obj = objFactory:CreateUIObject("id", "ImageObject", “packagename”)
其中CreateUIObject的
i. 第一个参数是对象id,
ii. 第二个参数是对象的类别名称,可以是上面所描述的布局对象里面的任意一个类别,也可以是用户自定义的control类名
iii. 第三个参数是想要创建的object所依附的xar的名称,比如迅雷7的主程序的xar的名称就是Thunder,如果该参数为空,那么将使用XARManager来作为object的ResProvider
在CreateUIObject的三个参数里面,第三个参数是可选参数,如果没有指定XAR的名称,或者指定名称的XAR不存在,那么引擎内部将XARManager来作为新创建对象的ResProvider,这在大部分情况下都不会有问题,但是在某些情况下面,可能会出现意想不到的问题,主要是存在重复id的情况,比如
有两个XAR a和b,并且a和b里面都定义了位图资源x,XAR的加载顺序是a,b。那么当XAR b的用户想创建一个ImageObject,并且引用了位图资源x,在使用XARManager作为ResProvider的情况下,使用的将是XAR a里面的资源,这时候需要显示指定该对象的ResProvider是XAR b。
对于动画对象,使用AnimationFactory来创建,使用范例如下
local aniFactory = XLGetObject("Xunlei.UIEngine.AnimationFactory")
local posAni = aniFactory:CreateAnimation("PosChangeAnimation", “id”, “package”)
// 注意这里的参数次数,class和id是反的!
其中CreateAnimation的
i. 第一个参数是动画对象的类别名称,可以是上面所描述的动画对象里面的任意一个类别,也可以是用户自定义的动画对象类名
ii. 第二个参数是动画对象的id,这个id是可选参数
iii. 第三个参数是想要创建的动画对象所依附的xar的名称,比如迅雷7的主程序的xar的名称就是Thunder,如果该参数为空,那么将使用XARManager来作为对象的ResProvider
使用的注意事项和上面的布局对象的创建的注意事项相同
假如在创建时候没有指定package参数,或者对象创建以后,想改变ResProvider,那么可以调用对象的SetResProvider来实现
// 设置ResProvider为XARManager
local xarManager = XLGetObject("Xunlei.UIEngine.XARManager")
obj:SetResProvider(xarManager)
// 设置ResProvider为某个XAR
local xarManager = XLGetObject("Xunlei.UIEngine.XARManager")
obj:SetResProvider(xarManager:GetResProvider("packageid"))
对于hostwnd对象,目前还有没有类似的创建方法,只可以通过模板来创建
对于UIObjectTree对象,使用TreeManager来创建
Local treeManager = XLGetObject(“Xunlei.UIEngine.TreeManager”)
Local tree = treeManager:CreateUIObjectTree(“id”)
由于UIObjectTree并不需要ResProvider接口,所以并没有提供package参数,UiObjectTree对象也没有提供SetResProvider方法,一般来说,UIObjectTree对象都是通过模板来创建的,极少有通过TreeManager来直接创建
第二种创建方式,调用各类对象的XAR对象工厂来创建
XARFactory主要是用来创建基于某个XAR的对象,包括布局对象和动画对象,通过XAR创建出来的对象,ResProvider接口将直接设置为该XARFactory所属的XAR的,如果该XARFactory没有属于任何一个XAR,那么将使用XARManager来作为ResProvder
local xarFactory = xarManager:GetXARFactory(“packageid”)
获取指定XAR的xarFactory,如果没有指定参数或者指定的XAR并不存在,那么创建出来的xarFactory将归XARManager所有,通过这个xarFactory创建出来的动画对象和布局对象,将使用XARManager作为其ResProvider
创建布局对象
local obj = xarFactory:CreateUIObject("id","ImageObject")
其中CreateUIObject的
i. 第一个参数是对象id,
ii. 第二个参数是对象的类别名称,可以是上面所描述的布局对象里面的任意一个类别,也可以是用户自定义的control类名
创建动画对象
Local ani = xarFactory:CreateAnimation(“PosChangeAnimation”, “id”)
// 注意这里的参数次数,id和class是反的!
其中CreateAnimation的
i. 第一个参数是动画的class
ii. 第二个参数是动画的id,为可选参数
使用XARFactory创建出来的对象,同样可以再次调用对象的SetResProvider来改变ResProvider接口
目前hostwnd不支持XARFactory的创建方式,一方面由于hostwnd并不会依赖ResProvider接口,另一方面是由于hostwnd使用起来相对比较少,都有一个模板对应,所以使用的是下面的模板创建方式
第三种创建方式,使用各类对象的模板来创建
关于模板的好处、使用方法和注意事项,这里就不多说了,想了解的可以参照之前我写过的一份关于模板使用的详细说明,这里简述一下使用模板来创建对象
使用模板来创建对象的流程基本上都是统一的,首先是通过模板管理器获取到相应类别的模板,然后调用该模板的CreateInstance来实例化该模板,也就是创建一个新对象出来,使用实例如下
i. 获取模板管理器
local tm = XLGetObject("Xunlei.UIEngine.TemplateManager")
ii. 获取指定类型的模板
获取布局对象模板
local objTemplate = tm:GetTemplate("id"," ObjectTemplate")
获取动画模板
local aniTemplate = tm:GetTemplate("id","AnimationTemplate")
获取窗口模板
local hostwndTemplate = tm: GetTemplate("id"," HostWndTemplate")
获取对象树模板
local objTreeTemplate = tm: GetTemplate("id"," ObjectTreeTemplate ")
iii. 创建实例
布局对象模板
local obj = objTemplate:CreateInstance(“id”, “package”)
动画对象模板
local obj = aniTemplate:CreateInstance(“package”, “id”) // 注意这里的参数次数,是反的!
窗口对象模板
local obj = hostwndTemplate:CreateInstance(“id”, “package”)
对象树模板
local obj = objTreeTemplate:CreateInstance(“id”, “package”)
使用模板创建出来的对象,如果CreateInstance时候没有指定package,或者指定的package不存在的话,那么对象的ResProvider接口将使用XARManager;否则使用package指定的XAR作为ResProvider
综上所述,对象的创建方式,总起来说一共有三种
1. 对于布局对象和动画对象来说,可以任选三种里面的一种,这里面还有其他方面的因素需要衡量,比如是否使用了模板
2. 对于对象树(UIObjectTree)和窗口HostWnd对象来说,这两种对象并不依赖ResProvider接口,并且这两种对象动态配置都比较繁琐,所以基本上都是使用模板的方式来创建的