最近跟后台研究的hessian协议,通信技术和接口已经基本差不多了,开始转战与前台的合作。
前台做的flash元件要能比较方便的在flex里使用,我的思路大致是这样的。比较“死”的东西做成图片,具有一些方法,相对比较活跃的组件做成.swf,然后在flex里用as3来控制,这样比较方便也比较容易变化和修改。
首先flash里制作元件,属性啊方法啊这些名字要沟通好。
在flex里有两种使用方法:
第一种方法是用as3直接使用,通过loader加载.swf,然后显示到程序中。这里有个小技巧,flash做的东西直接addchild到flex的容器里是会出现强制类型转换的,不过有一个例外,就是UIComponent,道理可以参看flex类图的继承关系。
第二种方法是用SWFLoader加载,如果组件比较少我倾向于这种,因为比较懒,也比较容易布局。。。
demo我只做了个控制属性,方法同样是没问题的哈,上代码:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationPolicy="all" creationComplete="init()">
<mx:Script>
<![CDATA[
import mx.core.UIComponent;
private var swfurl:String="我的现金.swf";
//创建Loader类的实例
private var context:LoaderContext=new LoaderContext();
private var loader:Loader=new Loader();
private var myUI:UIComponent = new UIComponent();
private var something:Object;
private function init():void
{
this.addChild(myUI);
context.applicationDomain=ApplicationDomain.currentDomain;
//加载外部的swf库 loader.load()的第2个参数 用来确定是否能使用加载的SWF中的库
loader.load(new URLRequest(swfurl), context);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
}
private function onComplete(e:Event):void
{
trace(loader);
something = loader.content;
something.myCash.text = 3000;
myUI.x = 300;
myUI.y = 300;
myUI.addChild(loader);
}
private function cc():void
{
var ss:Object = mm.content;
ss.myCash.text =50000;
}
private function addMoney():void
{
var ss:Object = mm.content;
ss.myCash.text = int(ss.myCash.text) + 10000;
}
]]>
</mx:Script>
<mx:SWFLoader id="mm" source="我的现金.swf" creationComplete="cc()">
</mx:SWFLoader>
<mx:Button x="273" y="10" label="+10000" click="addMoney()"/>
</mx:Application>
更进一步,可以由flash提供一个类库,里面可以有多个元件,来重复使用资源:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
creationComplete="init()"
layout="absolute">
<mx:Script>
<![CDATA[
import mx.core.UIComponent;
import flash.display.Loader;
import flash.display.Sprite;
import flash.net.URLRequest;
import flash.events.Event;
//
import flash.system.ApplicationDomain;
import flash.utils.getDefinitionByName;
import flash.display.MovieClip;
import flash.system.LoaderContext;
/**
* ...
* @author 齐齐兽
* QQ:649723623
*
* 实现库的重复利用
*/
//库资源的地址
private var myUI:UIComponent = new UIComponent();
private var swfurl:String="element.swf";
//创建Loader类的实例
private var context:LoaderContext=new LoaderContext();
private var loader:Loader=new Loader();
public function init():void
{
//指定为当期域
this.addChild(myUI);
context.applicationDomain=ApplicationDomain.currentDomain;
//加载外部的swf库 loader.load()的第2个参数 用来确定是否能使用加载的SWF中的库
loader.load(new URLRequest(swfurl), context);
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
}
private function onComplete(e:Event):void
{
//得到类定义 MCExample aaaa
var className:Class=ApplicationDomain.currentDomain.getDefinition("aaaa") as Class;
//从库中导出资源
var mc:MovieClip=new className();
//放到场景中间
mc.x=275;
mc.y=200;
//添加到显示列表
myUI.addChild(mc);
}
]]>
</mx:Script>
</mx:Application>
附件是第一个Demo的flash元件,放在src目录下即可