父SWF与子SWF之间的传值

来源:互联网 发布:触摸屏校正软件 编辑:程序博客网 时间:2024/05/18 03:49
先来说一下主SWF传值给子SWF:

        我们用一个例子来讲解这一块的东西

        首先,我们要了一子SWF(以下简称儿子)和一个主SWF(以下简称父亲),儿子里面,就一个文本框t,   用来显示父亲下达的命令。

        儿子的代码:
  1. package 
  2. {
  3.         import flash.display.MovieClip;
  4.         import flash.events.Event;
  5.         import flash.text.TextField;
  6.         public class SunMain extends MovieClip
  7.         {
  8.                 private var t:TextField;//显示从父SWF传过来的数据
  9.                 public function SunMain():void
  10.                 {
  11.                         if (stage)
  12.                         {
  13.                                 init();
  14.                         }
  15.                         else
  16.                         {
  17.                                 addEventListener(Event.ADDED_TO_STAGE,init);
  18.                         }
  19.                 }

  20.                 private function init(e:Event=null):void
  21.                 {
  22.                         removeEventListener(Event.ADDED_TO_STAGE,init);

  23.                         t = new TextField();
  24.                         t.border = true;
  25.                         t.height = 150;
  26.                         t.width = 250;
  27.                         addChild(t);
  28.                 }

  29.         }

  30. }
复制代码
这上面的代码,应该不会有什么困难的吧!


好了,儿子的暂时就告一段落吧,我们来写父亲的,先简单说一下,父亲里面的也就两样东西,一个输入文本框和一个MC,MC用来提示传送数据了(说得简单点,就是点出后,就加载子SWF)。

看代码:
  1. package 
  2. {
  3.         import flash.display.MovieClip;
  4.         import flash.events.Event;
  5.         import flash.events.MouseEvent;
  6.         import flash.text.TextField;
  7.         import flash.text.TextFieldType;
  8.         import flash.display.Loader;
  9.         import flash.net.URLRequest;
  10.         public class Main extends MovieClip
  11.         {
  12.                 private var txt:TextField;//定一个文本框,显示标题
  13.                 private var inputtxt:TextField;//用一个输入文本框,将里面的内容发给子SWF
  14.                 private var mc:MovieClip;//点出mc后,将inputtxt里的内容发出去
  15.                 private var loader:Loader;

  16.                 public function Main():void
  17.                 {
  18.                         if (stage)
  19.                         {
  20.                                 init();
  21.                         }
  22.                         else
  23.                         {
  24.                                 addEventListener(Event.ADDED_TO_STAGE,init);
  25.                         }
  26.                 }
  27.                 private function init(e:Event=null):void
  28.                 {
  29.                         removeEventListener(Event.ADDED_TO_STAGE,init);

  30.                         txt = new TextField  ;
  31.                         txt.text = "请输入内容:";
  32.                         txt.height = 20;
  33.                         txt.selectable = false;
  34.                         this.addChild(txt);

  35.                         inputtxt = new TextField  ;
  36.                         inputtxt.type = TextFieldType.INPUT;
  37.                         inputtxt.border = true;
  38.                         inputtxt.x = 140;
  39.                         inputtxt.width = 300;
  40.                         this.addChild(inputtxt);

  41.                         mc = new MovieClip  ;
  42.                         mc.graphics.beginFill(0xff0000);
  43.                         mc.graphics.drawRect(0,0,50,20);
  44.                         mc.graphics.endFill();
  45.                         mc.y = 110;
  46.                         mc.x = 200;
  47.                         this.addChild(mc);


  48.                         mc.addEventListener(MouseEvent.CLICK,clicker);
  49. //发送数据的时候,就是把子SWF加载进来;
  50.                         
  51.                 }
  52.                 


  53.                 private function clicker(e:MouseEvent):void
  54.                 {
  55.                         //加载子SWF前,先把舞台清空
  56.                         while (this.numChildren > 0)
  57.                         {
  58.                                 this.removeChildAt(0);
  59.                         }

  60.                         loader= new Loader();
  61.                         loader.load(new URLRequest("SunSwf.swf"));
  62.                         loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completes);
  63.                 }

  64.                 private function completes(e:Event):void
  65.                 {
  66.                         var mc:MovieClip = e.currentTarget.content as MovieClip        
  67.                         addChild(loader);
  68.                 }
  69.         }
  70. }
复制代码
这些东西,都没有什么难度的,都是很基础的东西,如果有什么不明白的,可以在群里问,也可以跟贴问!

接下来,我们要做的就是,把数据传出去,我们要在儿子里面写一个方法,并且是一个公有的,这个方法的主要目的就是,父亲加载完成儿子后,父亲会让儿子去执行这个方法。
  1. //定义接收父SWF内容的方法
  2. public function getParentMethod(object:Object):void
  3. {
  4.         t.text="父亲下达的命令是:"+object.Method;
  5. }
复制代码
由于,儿子的完整代码就是:
  1. package 
  2. {
  3.         import flash.display.MovieClip;
  4.         import flash.events.Event;
  5.         import flash.text.TextField;
  6.         public class SunMain extends MovieClip
  7.         {
  8.                 private var _parent:Object;
  9.                 private var t:TextField;//显示从父SWF传过来的数据
  10.                 public function SunMain():void
  11.                 {
  12.                         if (stage)
  13.                         {
  14.                                 init();
  15.                         }
  16.                         else
  17.                         {
  18.                                 addEventListener(Event.ADDED_TO_STAGE,init);
  19.                         }
  20.                 }

  21.                 private function init(e:Event=null):void
  22.                 {
  23.                         removeEventListener(Event.ADDED_TO_STAGE,init);

  24.                         t = new TextField();
  25.                         t.border = true;
  26.                         t.height = 150;
  27.                         t.width = 250;
  28.                         addChild(t);
  29.                 }

  30.                 //定义接收父SWF内容的方法
  31.                 public function getParentMethod(object:Object):void
  32.                 {
  33.                         t.text="父亲下达的命令是:"+object.Method;
  34.                 }
  35.         }

  36. }
复制代码
既然儿子的方法已经定义了,那么,就应该让父亲来下命令了,怎么下呢?很简单,就一句话,在父亲completes函数里面,加一句,mc.getParentMethod(this)即可,对了,在父亲里面,还得定义一个GET方法,用来传输输入的文本,这样的话,完整的父亲代码就是这样的:
  1. package 
  2. {
  3.         import flash.display.MovieClip;
  4.         import flash.events.Event;
  5.         import flash.events.MouseEvent;
  6.         import flash.text.TextField;
  7.         import flash.text.TextFieldType;
  8.         import flash.display.Loader;
  9.         import flash.net.URLRequest;
  10.         public class Main extends MovieClip
  11.         {
  12.                 private var txt:TextField;//定一个文本框,显示标题
  13.                 private var inputtxt:TextField;//用一个输入文本框,将里面的内容发给子SWF
  14.                 private var mc:MovieClip;//点出mc后,将inputtxt里的内容发出去

  15.                 private var loader:Loader;
  16.                 public function Main():void
  17.                 {
  18.                         if (stage)
  19.                         {
  20.                                 init();
  21.                         }
  22.                         else
  23.                         {
  24.                                 addEventListener(Event.ADDED_TO_STAGE,init);
  25.                         }
  26.                 }
  27.                 private function init(e:Event=null):void
  28.                 {
  29.                         removeEventListener(Event.ADDED_TO_STAGE,init);

  30.                         txt = new TextField  ;
  31.                         txt.text = "请输入内容:";
  32.                         txt.height = 20;
  33.                         txt.selectable = false;
  34.                         this.addChild(txt);

  35.                         inputtxt = new TextField  ;
  36.                         inputtxt.type = TextFieldType.INPUT;
  37.                         inputtxt.border = true;
  38.                         inputtxt.x = 140;
  39.                         inputtxt.width = 300;
  40.                         this.addChild(inputtxt);

  41.                         mc = new MovieClip  ;
  42.                         mc.graphics.beginFill(0xff0000);
  43.                         mc.graphics.drawRect(0,0,50,20);
  44.                         mc.graphics.endFill();
  45.                         mc.y = 110;
  46.                         mc.x = 200;
  47.                         this.addChild(mc);


  48.                         mc.addEventListener(MouseEvent.CLICK,clicker);//发送数据的时候,就是把子SWF加载进来;
  49.                         
  50.                 }
  51.                 


  52.                 private function clicker(e:MouseEvent):void
  53.                 {
  54.                         //加载子SWF前,先把舞台清空
  55.                         while (this.numChildren > 0)
  56.                         {
  57.                                 this.removeChildAt(0);
  58.                         }

  59.                         loader= new Loader();
  60.                         loader.load(new URLRequest("SunSwf.swf"));
  61.                         loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completes);
  62.                 }

  63.                 private function completes(e:Event):void
  64.                 {
  65.                         var mc:MovieClip = e.currentTarget.content as MovieClip//.content as MovieClip;
  66.                         addChild(loader);
  67.                         mc.getParentMethod(this);
  68.                 }

  69.                 //定义一个方法,让子SWF读取里面的数据
  70.                 public function get Method():String
  71.                 {
  72.                         return inputtxt.text;
  73.                 }
  74.         }
  75. }
复制代码

大家可以去测试一下  这下儿子就能接受到父亲的命令了,下一节,我们再来说说儿子给父亲传值。


这一节,我们来说说儿子向父亲传值

上一节,我们讲了父亲给儿子下命令,人嘛,都是要互相交流的,父亲跟儿子下了命令,儿子至少也要回应一下,那么我们怎么来实现呢?

我这里讲的方法很简单,就用了一个事件,儿子收到父亲的命令后,儿子要回应,在回应的时候,就派发一个事件,让父亲侦听。

这里提一点,因为父亲加载了儿子,两个对象的stage是相同的,所以,儿子就可以用stage派发一个事件,让父亲去接受!

首先,我们得有一个输入文本框和一个提示框(“一个道理里面写’返回给父SWF的值:’”),代码:

  1. desSuntt=new TextField;
  2.                         desSuntt.x=10;
  3.                         desSuntt.y=270;
  4.                         desSuntt.width=150;
  5.                         desSuntt.text="返回给父SWF的值:";
  6.                         addChild(desSuntt);
  7.                         
  8.                         suninputtxt = new TextField  ;
  9.                         suninputtxt.type = TextFieldType.INPUT;
  10.                         suninputtxt.border = true;
  11.                         suninputtxt.x = 130;
  12.                         suninputtxt.y=270;
  13.                         suninputtxt.width = 300;
  14.                         addChild(suninputtxt);
复制代码
当然,还要一个按钮:
  1. mc=new MovieClip;
  2.                         mc.graphics.beginFill(0xffcccc);
  3.                         mc.graphics.drawRect(0,0,50,20);
  4.                         mc.graphics.endFill();
  5.                         mc.x=300;
  6.                         mc.y=400;
  7.                         addChild(mc);
  8.                         
  9.                         mc.addEventListener(MouseEvent.CLICK,rebackMain);
复制代码
给按钮加一个侦听,让其返回到父SWF里面,接下来,我们要在点击按钮的时候,派发一个事件:
  1. private function rebackMain(e:MouseEvent):void
  2.                 {
  3.                         stage.dispatchEvent(new Event("BACKPARENT",true));
  4.                 }
复制代码
主类就可以去侦听这个“BACKPARENT”的事件。

最后,我们还得写一个GET方面,让父亲访问,接收到儿子的消息:
  1. ublic function get SunMessage():String
  2.                 {
  3.                         return suninputtxt.text;
  4.                 }
复制代码
好了,完整的儿子就是这样的:
  1. package 
  2. {
  3.         import flash.display.MovieClip;
  4.         import flash.events.Event;
  5.         import flash.events.MouseEvent;
  6.         import flash.text.TextField;
  7.         import flash.text.TextFieldType;
  8.         public class SunMain extends MovieClip
  9.         {
  10.                 public static const BACKPARENT:String="BACKPARENT";
  11.                 
  12.                 private var _parent:Object;
  13.                 private var t:TextField;//显示从父SWF传过来的数据
  14.                 private var suninputtxt:TextField;
  15.                 private var desSuntt:TextField;
  16.                 private var mc:MovieClip;
  17.                 
  18.                 public function SunMain():void
  19.                 {
  20.                         if (stage)
  21.                         {
  22.                                 init();
  23.                         }
  24.                         else
  25.                         {
  26.                                 addEventListener(Event.ADDED_TO_STAGE,init);
  27.                         }
  28.                 }

  29.                 private function init(e:Event=null):void
  30.                 {
  31.                         removeEventListener(Event.ADDED_TO_STAGE,init);

  32.                         t = new TextField();
  33.                         t.border = true;
  34.                         t.height = 150;
  35.                         t.width = 250;
  36.                         addChild(t);
  37.                         
  38.                         desSuntt=new TextField;
  39.                         desSuntt.x=10;
  40.                         desSuntt.y=270;
  41.                         desSuntt.width=150;
  42.                         desSuntt.text="返回给父SWF的值:";
  43.                         addChild(desSuntt);
  44.                         
  45.                         suninputtxt = new TextField  ;
  46.                         suninputtxt.type = TextFieldType.INPUT;
  47.                         suninputtxt.border = true;
  48.                         suninputtxt.x = 130;
  49.                         suninputtxt.y=270;
  50.                         suninputtxt.width = 300;
  51.                         addChild(suninputtxt);
  52.                         
  53.                         mc=new MovieClip;
  54.                         mc.graphics.beginFill(0xffcccc);
  55.                         mc.graphics.drawRect(0,0,50,20);
  56.                         mc.graphics.endFill();
  57.                         mc.x=300;
  58.                         mc.y=400;
  59.                         addChild(mc);
  60.                         
  61.                         mc.addEventListener(MouseEvent.CLICK,rebackMain);
  62.                         
  63.                 }
  64.                 
  65.                 //返回给父亲
  66.                 private function rebackMain(e:MouseEvent):void
  67.                 {
  68.                         stage.dispatchEvent(new Event("BACKPARENT",true));
  69.                 }

  70.                 //定义接收父SWF内容的方法
  71.                 public function getParentMethod(object:Object):void
  72.                 {
  73.                         t.text="父亲下达的命令是:"+object.Method;
  74.                 }
  75.                 
  76.                 public function get SunMessage():String
  77.                 {
  78.                         return suninputtxt.text;
  79.                 }
  80.         }

  81. }
复制代码
该来完善一下父亲的代码了,父亲接收到代码后,要把消息显示出来,得有一个显示的文本框和一个提示框(不多说了):
  1. tts=new TextField;
  2.                         tts.text="子SWF传过来的数据:";
  3.                         tts.width=120;
  4.                         tts.y=230;
  5.                         tts.selectable=false;
  6.                         this.addChild(tts);
  7.                         
  8.                         tt=new TextField;
  9.                         tt.height=150;
  10.                         tt.width=250;
  11.                         tt.x=140;
  12.                         tt.y=230;
  13.                         tt.border=true;
  14.                         this.addChild(tt)
复制代码
然后就是给父亲加一个侦听:
  1. stage.addEventListener("BACKPARENT",backHandler);
复制代码
在侦听函数里面,我们得把儿子返回来的消息显示出来,在显示前,先得把儿子unload掉,然后再把自己的东西加载上来:
  1. private function backHandler(e:Event):void
  2.                 {
  3.                         addChild(txt);
  4.                         addChild(inputtxt);
  5.                         addChild(tt);
  6.                         addChild(tts)
  7.                         addChild(mc);
  8.                         loader.unload();
  9.                         tt.text=mcS.SunMessage;
  10.                 }
复制代码
这里要提一点的是,前一节,我在加载儿子的时候写了一个乱有的mc,因为当时没有考虑到后面这一节,所以,在下面显示儿子返回消息的时候,mc是不可访问的,所以,我把那个mc设成了全局变量mcS,这样下来,父亲的代码就是:
  1. package 
  2. {
  3.         import flash.display.MovieClip;
  4.         import flash.events.Event;
  5.         import flash.events.MouseEvent;
  6.         import flash.text.TextField;
  7.         import flash.text.TextFieldType;
  8.         import flash.display.Loader;
  9.         import flash.net.URLRequest;
  10.         public class Main extends MovieClip
  11.         {
  12.                 private var txt:TextField;//定一个文本框,显示标题
  13.                 private var inputtxt:TextField;//用一个输入文本框,将里面的内容发给子SWF
  14.                 private var mc:MovieClip;//点出mc后,将inputtxt里的内容发出去

  15.                 private var loader:Loader;
  16.                 private var tt:TextField;//主SWF接收到子SWF传过来的数据
  17.                 private var tts:TextField;//提示框,主要是放“子SWF传过来的数据”;
  18.                 private var mcS:MovieClip;

  19.                 public function Main():void
  20.                 {
  21.                         if (stage)
  22.                         {
  23.                                 init();
  24.                         }
  25.                         else
  26.                         {
  27.                                 addEventListener(Event.ADDED_TO_STAGE,init);
  28.                         }
  29.                 }
  30.                 private function init(e:Event=null):void
  31.                 {
  32.                         removeEventListener(Event.ADDED_TO_STAGE,init);

  33.                         txt = new TextField  ;
  34.                         txt.text = "请输入内容:";
  35.                         txt.height = 20;
  36.                         txt.selectable = false;
  37.                         this.addChild(txt);

  38.                         inputtxt = new TextField  ;
  39.                         inputtxt.type = TextFieldType.INPUT;
  40.                         inputtxt.border = true;
  41.                         inputtxt.x = 140;
  42.                         inputtxt.width = 300;
  43.                         this.addChild(inputtxt);

  44.                         tts=new TextField;
  45.                         tts.text="子SWF传过来的数据:";
  46.                         tts.width=120;
  47.                         tts.y=230;
  48.                         tts.selectable=false;
  49.                         this.addChild(tts);
  50.                         
  51.                         tt=new TextField;
  52.                         tt.height=150;
  53.                         tt.width=250;
  54.                         tt.x=140;
  55.                         tt.y=230;
  56.                         tt.border=true;
  57.                         this.addChild(tt);

  58.                         mc = new MovieClip  ;
  59.                         mc.graphics.beginFill(0xff0000);
  60.                         mc.graphics.drawRect(0,0,50,20);
  61.                         mc.graphics.endFill();
  62.                         mc.y = 110;
  63.                         mc.x = 200;
  64.                         this.addChild(mc);


  65.                         mc.addEventListener(MouseEvent.CLICK,clicker);//发送数据的时候,就是把子SWF加载进来;
  66.                         
  67.                         stage.addEventListener("BACKPARENT",backHandler);
  68.                         
  69.                 }
  70.                 


  71.                 private function clicker(e:MouseEvent):void
  72.                 {
  73.                         //加载子SWF前,先把舞台清空
  74.                         while (this.numChildren > 0)
  75.                         {
  76.                                 this.removeChildAt(0);
  77.                         }

  78.                         loader= new Loader();
  79.                         loader.load(new URLRequest("SunSwf.swf"));
  80.                         loader.contentLoaderInfo.addEventListener(Event.COMPLETE,completes);
  81.                 }

  82.                 private function completes(e:Event):void
  83.                 {
  84.                         mcS = e.currentTarget.content as MovieClip//.content as MovieClip;
  85.                         addChild(loader);
  86.                         mcS.getParentMethod(this);
  87.                 }

  88.                 //定义一个方法,让子SWF读取里面的数据
  89.                 public function get Method():String
  90.                 {
  91.                         return inputtxt.text;
  92.                 }
  93.                 
  94.                 private function backHandler(e:Event):void
  95.                 {
  96.                         addChild(txt);
  97.                         addChild(inputtxt);
  98.                         addChild(tt);
  99.                         addChild(tts)
  100.                         addChild(mc);
  101.                         loader.unload();
  102.                         tt.text=mcS.SunMessage;
  103.                 }
  104.         }
  105. }
复制代码
好了,整个的代码就这样了,大家可以看一下,欢迎指正!如果你有其它方法,回帖告诉我,大家都会感谢你的!

我把自己写的东西也贴上来  主SWF与子SWF互相通信的问题.rar

0 0
原创粉丝点击