Archive for 05月, 2008

  • 有需要的可以去跑一下。

    如何使用这个例子

    1.把AsChild.as中str赋值的部分编译两次,得到2个SWF文件,分别命名为AsChild.swf和AsChilden.swf。

    2.把上面两个SWF文件拷贝到Parent.mxml所在工程的bin目录下。

    3.通过更改Parent.mxml中注释(同时修改domain的赋值),来查看变化

    AsChild.as

    package {
    import flash.display.Sprite;
    
    public class AsChild extends Sprite
    {
    public function AsChild()
    {
    }
    
    public function show():String{
    return str;
    }
    
    private var str:String = '您好';
    //private var str:String = 'Hello';
    }
    }
    

    Parent.mxml

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init()">
    <mx:Script>
    <![CDATA[
    import mx.core.UIComponent;
    import mx.controls.Alert;
    
    private var loaderZH:Loader;
    private var loaderEN:Loader;
    private var swfLoaded:int;
    
    public function init():void{
    var url:String = 'AsChild.swf';
    var request:URLRequest = new URLRequest(url);
    var domain:ApplicationDomain = ApplicationDomain.currentDomain;
    //var domain:ApplicationDomain = new ApplicationDomain();
    //var domain:ApplicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain);
    var policyFile:Boolean = false;
    var context:LoaderContext = new LoaderContext(policyFile,domain);
    loaderZH = new Loader();
    loaderZH.contentLoaderInfo.addEventListener(Event.COMPLETE,AsCompleteHandle);
    loaderZH.load(request,context);
    
    url = 'AsChilden.swf';
    request = new URLRequest(url);
    domain = ApplicationDomain.currentDomain;
    //domain = new ApplicationDomain();
    //domain = new ApplicationDomain(ApplicationDomain.currentDomain);
    context = new LoaderContext(policyFile,domain);
    loaderEN = new Loader();
    loaderEN.contentLoaderInfo.addEventListener(Event.COMPLETE,AsCompleteHandle);
    loaderEN.load(request,context);
    }
    
    private function AsCompleteHandle(e:Event):void{
    swfLoaded++;
    if(swfLoaded == 2) {
    AsCompleteHandleTwo();
    }
    
    }
    
    private function AsCompleteHandleTwo():void{
    var zhNewClass:Class = loaderZH.contentLoaderInfo.applicationDomain.getDefinition("AsChild") as Class;
    var zhClass:Object = new zhNewClass();
    Alert.show(zhClass.show());
    
    var enNewClass:Class = loaderEN.contentLoaderInfo.applicationDomain.getDefinition("AsChild") as Class;
    var enClass:Object = new enNewClass();
    Alert.show(enClass.show());
    }
    
    ]]>
    </mx:Script>
    </mx:Application>
    
  • SharedObject可以将Flash中的数据存储到用户的本地硬盘上,当用户以后访问时,Flash可以调用这些数据。

    程序代码

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    creationComplete="init();">
    <mx:Script>
    <![CDATA[
    import mx.controls.Alert;
    private var so:SharedObject;
    public function init():void{
    so = SharedObject.getLocal("CZBIN.COM");
    }
    private function saveSO():void{
    so.data.czbin = mx_input.text;
    }
    private function alertSO():void{
    Alert.show(so.data.czbin);
    }
    
    ]]>
    </mx:Script>
    <mx:TextInput id=”mx_input”/>
    <mx:Button label=”Save” click=”{saveSO()}”/>
    <mx:Button label=”显示当前保存的数据” click=”{alertSO()}”/>
    </mx:Application>
    

    注意:更改ShareObject会有一小段时间的延迟。当在上述程序中输入一个新字符串并Save以后,需要过一段小段时间(30秒左右),才会生效。

  • 从途径上将,SWF文件有3种。1,Flash生成的。2,Flex MXML 生成的。3,Flex AS生成的。

    对于比较大型的项目,一般会采取将各个模块分为多个SWF,使用时调用的方法。

    这里先不提及域的问题。

    对于Flash或者是Flex AS生成的SWF文件,被Load以后,content中的对象,是我们预期定义的类。但Flex MXML生成的SWF文件,被Load以后,content中的对象,是systemmanager,我们在mxml的<application>标签中定义的所有内容,被保存在systemmanager.application中。

    下面的例子可以证明这个问题,并且说明了如何调用加载的各种SWF中的属性与方法。

    FlashChild.as //生成Flash SWF

    package {
    import flash.display.Sprite;
    
    public class FlashChild extends Sprite
    {
    public function FlashChild()
    {
    }
    
    public var str:String = 'This is the Flash SWF';
    }
    }
    

    AsChild.as //生成Flex AS SWF

    package {
    import flash.display.Sprite;
    
    public class AsChild extends Sprite
    {
    public function AsChild()
    {
    }
    
    public function show():String{
    return str;
    }
    
    private var str:String = 'www.czbin.com';
    }
    }
    

    Child.mxml //生成Flex MXML SWF

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
    <mx:Script>
    <![CDATA[
    import mx.controls.Alert;
    public function show():void{
    Alert.show("Thanks");
    }
    public var str:String = 'www.czbin.com'
    ]]>
    </mx:Script>
    <mx:Label text=”Welcom to” id=”mx_label”/>
    </mx:Application>
    

    Parent.mxml //调用上面3个SWF的主文件

    <?xml version="1.0" encoding="utf-8"?>
    <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" creationComplete="init();initAs();initFlash()">
    <mx:Script>
    <![CDATA[
    import mx.core.UIComponent;
    import mx.controls.Alert;
    
    private var childApp:Object;
    
    private var AsChild:Object;
    
    private var FlashChild:Object;
    
    public function init():void{
    var url:String = 'Child.swf';
    var request:URLRequest = new URLRequest(url);
    var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completeHandle);
    loader.load(request);
    }
    
    public function initAs():void{
    var url:String = 'AsChild.swf';
    var request:URLRequest = new URLRequest(url);
    var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE,AsCompleteHandle);
    loader.load(request);
    }
    
    public function initFlash():void{
    var url:String = 'FlashChild.swf';
    var request:URLRequest = new URLRequest(url);
    var loader:Loader = new Loader();
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE,FlashCompleteHandle);
    loader.load(request);
    }
    
    private function completeHandle(e:Event):void{
    var UI:UIComponent = new UIComponent();
    
    UI.addChild(e.target.content);
    
    addChild(UI);
    
    childApp = e.target.content;
    }
    
    private function AsCompleteHandle(e:Event):void{
    AsChild = e.target.content;
    }
    
    private function FlashCompleteHandle(e:Event):void{
    FlashChild = e.target.content;
    }
    
    private function showChildVar():void{
    Alert.show(childApp.application.mx_label.text+" "+childApp.application.str)
    }
    
    private function showChildFun():void{
    childApp.application.show();
    }
    
    private function showAsSWF():void{
    Alert.show(AsChild.show());
    }
    
    private function showFlashSWF():void{
    Alert.show(FlashChild.str);
    }
    ]]>
    </mx:Script>
    <mx:Button label=”Show Welcome” click=”showChildVar()”/>
    <mx:Button label=”Show Thanks” click=”showChildFun()”/>
    <mx:Button label=”Show AsSWF” click=”showAsSWF()”/>
    <mx:Button label=”Show FlashSWF” click=”showFlashSWF()”/>
    </mx:Application>
    

    把上面生成的前3个SWF拷贝到下面工程的BIN目录中。

  • Module -> LayoutContainer -> Container -> UIComponent
    1.MXML里没有<mx:LayoutContainer >,也许是因为这个拼起来太长吧….
    2.Module据有constraintColumns,constraintRows和layout属性。
    3.Module是布局容器,不是简单的容器,UIComponent仅仅是可视化组件而已。