当前位置: BOLT界面引擎 > 知识库文章 > 引擎对象管理和定位

引擎对象管理和定位

作者:李亚星 2013-01-04

引擎对象管理和定位

 

引擎里面的对象,包括下面几种:

1.         模板对象

a)         ObjectTemplate

b)         ObjectTreeTemplate

c)         HostWndTemplate

d)         AnimationTemplate

2.         自定义控件xmlcontrol

3.         实例对象

a)         元对象实例obj

b)         对象树实例objtree

c)         窗口实例hostwnd

d)         动画实例animation

 

下面分别介绍各种对象的id有效范围,管理方式,如何定位等

 

模板对象

id全局唯一,也就是同一个id的模板,全局应该只有一份(如果同一个或者不同xar里面定义了相同的模板,那么这个顺序依赖于xar的加载顺序,会出现覆盖的情况,所以不要出现重复定义)

 

想要获取指定id的模板,那么使用TemplateManager来获取:

local templateMananger = XLGetObject("Xunlei.UIEngine.TemplateManager")

local objectTemplate = templateMananger:GetTemplate("FlashTemplate","ObjectTemplate")

 

其中第二个参数指定了模板类型,可以根据要获取的模板类型和id,来获取指定的模板

 

自定义控件

class全局唯一,也就是相同classxmlcontrol,全局应该只有一份(如果同一个或者不同xar里面定义了相同classcontrol,那么这个顺序依赖于xar的加载顺序,可能会出现覆盖的情况,并且有些情况下需要指定xar来才能实例化被覆盖的control,所以不要出现重复定义!)

 

自定义control一般没有必要直接获取,也不提供给外部直接获取的接口,这个在该类型的control实例化的时候,会自动全局查询

 

实例对象

情况比较复杂,这里分别说明

 

1.         元对象实例obj

一个对象(或者一组对象,比如模板/xmlcontrol实例化)在创建出来,还没有添加到对象树上之前,属于游离状态,这个时候没有托管到任何对象树或者管理器,并且在lua对象回收时候,对象会被自动回收

 

一个对象一旦被添加(绑定)到对象树上,那么这个对象就属于这个对象树了,并且不能再改变到别的对象树上面去,或者重复添加到别的对象下面

 

关于objid的命名空间

一个对象树是一个命名空间,也就是对象树上面的对象的id不能有重复,除了本身是control的子对象;一个control也是一个命名空间,也就是同一个对象树的不同control下面,可以有相同id的子对象(设想一下同一个按钮control被实例化多次并且加到同一个对象树上的情况),但是同一个control下面的对象id不能有重复,除了本身是control的子对象,如上递归定义。

 

关于obj:限定id

在一个对象树上,想获取指定idobj,如果该obj属于某个control,那么想从这个control外部直接获取到该obj,那么必须用controlid:objid的形式来获取(设想一下有多个相同类型control实例的情况,怎么知道你想要哪个control下面的obj),如果路径上嵌套了多级control,那么就需要把这些controlid都加进来,用:分隔开

 

关于obj的命名规范

可以是任意英字母或者字符的符合,但是不能出现冒号:,因为这个是作为id限定符被保留了,如果创建一个带冒号的id的对象,那么会创建为匿名对象

也可以是UTF-8编码的任何字符,比如中文字符等,不过一般很少用

 

从对象树查询obj

l  GetUIObject(objid),可以获取指定idobj,如果这个obj被多级control包含,那么需要用controlid:controlid:…:objid来限定

l  GetRootObject,可以获取对象树的根对象,一个对象树有且只有一个根对象

 

obj之间的相互查询

l  如果想获取自己的直接子对象(自己的下一级对象,不包括子对象的子对象),可以用GetChildCountGetChildByIndex来遍历获取

l  如果想获取父对象,那么使用GetFather或者GetParent来获取

l  如果想获取所在的control,那么使用GetOwnerControl来获取

l  如果想获取所在的对象树,使用GetOwner来获取

l  如果obj本身是control,那么还可以使用如下两个方法:

n  GetControlObject:获取本control里面的子对象(包括直接子对象和非直接子对象),但是不能获取嵌套control的子对象

n  GetControlObjectEx:除了可以获取control里面的子对象外,还可以使用controlid:objid来获取嵌套control的子对象

l  使用强大的GetObject+定向指令,来获取所在对象树上的任意一个子对象

详细见在线文档的Layout:GetObject的使用说明

l  IsChild(objA),判断objA是不是自己的一个子对象,包括直接子对象或者间接子对象,已经嵌套control的子对象

l  需要注意的是,如果一个control在实例化时候,是匿名对象(也即没有指定id),那么该control的所有子对象,在外部将不能直接用id来索引,必须拿到该control对象后,使用GetControlObject等方法再来获取

 

 

2.         对象树实例

id全局唯一,一个对象树必须指定一个全局唯一的id,并且不能为空;想获取指定id的对象树,通过全局的TreeManager

local treeManager = XLGetObject(“Xunlei.UIEngine.TreeManager”)

l  GetUIObjectTree(id) 获取指定id的对象树实例

l  BeginEnumUIObjectTreeGetNextUIObjectTree  遍历当前所有的对象树实例

 

对象树在绑定到hostwnd上后,可以通过hostwndGetBindUIObjectTree来获取

对于绑定到对象树上的任意obj,可以使用GetOwner来获取所在对象树

 

3.         hostwnd实例

id全局唯一,一个hostwnd实例必须指定一个全局唯一的id,并且不能为空;想获取指定idhostwnd,通过去全局的HostwndManager

local hostWndManager = XLGetObject("Xunlei.UIEngine.HostWndManager")

l  GetHostWnd(id) 获取指定idhostwnd实例

l  BeginEnumHostWndGetNextHostWnd 遍历当前所有的hostwnd实例

 

hostwnd和对象树绑定后,可以通过对象树的GetBindHostWnd来获取所绑定的hostwnd

 

4.         动画实例animation

动画实例是属于轻型的对象,被创建之后,添加到对象树上,没有接口可以查询该动画;该动画运行完毕后会被移除并自动回收。

 

animation在模板实例化或者创建时候可以指定id,或者不指定,并没有什么影响,只是在开发版(日志版)出错调试时候提示的更友好;同一个对象树可以添加相同id的动画对象,或者多个匿名动画对象

 

 

迅雷公司 版权所有 Copyright 2003-2010 Thunder Inc.All Rights Reserved. 意见反馈:xl7doc@xunlei.com