Flex与Flex swf如何实现通讯,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
Flex通讯系列---Flex与Flex swf
这里讲述的是在FlexApplication中嵌套一个Flex swf,然后实现Flex与Flex swf相互间的通讯。我们需要引入SystemManager接口实现。
下面我们来看一下《Flex3参考手册》对SystemManager的描述,你大约就知道怎么回事,使用里面现成的属性和方法就可以实现Flex与Flex swf的通讯啦。
每个应用程序都包含一个SystemManager。如果应用程序窗口的大小发生更改(您无法在应用程序中更改其大小,只能通过与操作系统窗口或浏览器交互来进行更改),则SystemManager会发送一个事件。它是应用程序中所有可显示项目(例如mx.core.Application主实例以及所有弹出窗口、工具提示、光标等)的父项。任何以SystemManager作为父项的对象都将被视为“***”窗口,就连工具提示和光标也是如此。
是的,要实现Flex调用嵌套Flex swf,主要我们在Flex swf中为Flex打开方便之门就可以了,也就是设计一个publicfunction,难道这还不够简易?下面说一下简单的实现:
1、在FlexApplication(如命名为Main.mxml)中通过Flex swfLoader标签加载Flex swf文件:
viewplaincopytoclipboardprint? <mx:Flex swfLoaderid="Flex swfLoader"source="Game01.Flex swf"/> <mx:Flex swfLoaderid="Flex swfLoader"source="Game01.Flex swf"/>
2、在Game01.mxml中设计一个publicfunction。如:
viewplaincopytoclipboardprint? publicfunctioninvokeByOutsideFlex():void{ trace("Success..."); } publicfunctioninvokeByOutsideFlex():void{ trace("Success..."); }
3、在Main.mxml中调用:
viewplaincopytoclipboardprint?
Object(Object(Flex swfLoader.content).application).invokeByOutsideFlex();
//其实第二个Object具体是SystemManager对象,所以也可以写作
Object(SystemManager(Flex swfLoader.content).application).invokeByOutsideFlex();
Object(Object(Flex swfLoader.content).application).invokeByOutsideFlex();
//其实第二个Object具体是SystemManager对象,所以也可以写作
Object(SystemManager(Flex swfLoader.content).application).invokeByOutsideFlex();
我们先来了解两个内容,一个事Flex swfLoader的content属性,另一个是Application.application。
◆Flex swfLoader-content
content属性
content:DisplayObject[]
此属性包含表示在Flex swfLoader控件中加载的内容的对象。
Application-application
很明显,通过这样简单的两句话就可以获取到FlexApplication层次下的public方法。
好了,至此已经可以实现了Flex向Flex swf通讯了。那么Flex swf怎么可以反过来跟FLEX说话呢?原理是一样的,Flex开放一些function,然后Flex swf就可以直接调用那些function了。
4、如在Main.mxml中加入:
viewplaincopytoclipboardprint? publicfunctioninvokeByInsideFlex swf():void{ trace("Igetit..."); } publicfunctioninvokeByInsideFlex swf():void{ trace("Igetit..."); }
5、回去Game01.mxml可以直接通过如下代码调用:
viewplaincopytoclipboardprint? Object(SystemManager(this.parent.parent.root).application).invokeByInsideFlex swf(); //SystemManager可以改成Object,多态特性 Object(SystemManager(this.parent.parent.root).application).invokeByInsideFlex swf(); //SystemManager可以改成Object,多态特性
接下来我们需要看一下两个属性:
◆UIComponent:
这个层次我是通过Debug对象层层查找出来的,层次不同当然需要改一下了,甚至可以直接跳到几层,直接到最外层,这个自己再去查查,呵呵。
源代码下载:准备上传
parent属性
parent:DisplayObjectContainer[]
此组件的父容器或组件。只有UIComponent对象应该具有父属性。非UIComponent对象应该使用其它属性引用其所属对象。一般而言,非UIComponent对象使用owner属性引用其所属对象。
◆DisplayObject:
root属性
root:DisplayObject[]
对于加载的Flex swf文件中的显示对象,root属性是此Flex swf文件所表示的显示列表树结构部分中的***显示对象。对于代表已加载图像文件的位图对象,root属性就是位图对象本身。对于***个加载的Flex swf文件的主类的实例,root属性就是显示对象本身。Stage对象的root属性是Stage对象本身。对于任何未添加到显示列表的显示对象,root属性设置为null,除非它已添加到符合以下条件的显示对象容器:不在显示列表中,但属于已加载Flex swf文件中***显示对象的子级。
application属性
application:Object[]
应用程序的引用。
通常,Application对象可能存在层次结构,因为Application可以使用Flex swfLoader控件动态加载其它Application。可通过UIComponent的parentApplication属性访问UIComponent所在的子Application,并可以在层次结构中向上浏览到Application。
看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注亿速云行业资讯频道,感谢您对亿速云的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。