主swf控制多个加载进来的swf的播放(多个swf之间的通信练习)
2010-04-18 23:30
295 查看
见过很多flash网站的设计都是这样的:有一个主swf文件,内容不多.主要就是一些触发加载的按钮.比如现在主场景上有两个按钮btn1,btn2默认状态下主场景先加载btn1按钮对应的a.swf文件,当用户点击btn2.按钮时,主场景先发消息给a.swf,让a.swf执行一段渐渐消失转场动画,当a.swf执行完毕时发送消息给主场景,当主场景收到a.swf发来的完成消息时开始卸载原先的a.swf并加载btn2按钮对应的b.swf.整个通讯过程用到的主要技术是localConnection类,但不要错过一个细节就是通信完毕之后关闭掉原先的localConnection,不然原先的还会继续占用.
贴一些代码(基于帮助文档):
贴一些代码(基于帮助文档):
package { import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.net.LocalConnection; import flash.net.URLRequest; import flash.text.TextField; import flash.text.TextFieldType; import flash.events.StatusEvent; import flash.text.TextFieldAutoSize; /** * 主场景 */ public class LocalConnectionSenderExample extends Sprite { private var conn:LocalConnection; private var reConn:LocalConnection; // UI elements private var messageLabel:TextField; private var message:TextField; private var sendBtn:Sprite; private var _sendBtn:Sprite; private var curName:String; private var loader:Loader = new Loader(); public function LocalConnectionSenderExample() { buildUI(); sendBtn.addEventListener(MouseEvent.CLICK, sendMessage); _sendBtn.addEventListener(MouseEvent.CLICK, sendMessage); loader.load(new URLRequest("LocalConnectionReceiverExample1.swf")) addChild(loader); } public function removeSwf():void { //高人推荐用这个方法 loader.unloadAndStop(); removeChild(loader); reConn.close(); message.appendText("removed"); if(curName== "black") loader.load(new URLRequest("LocalConnectionReceiverExample1.swf")); else loader.load(new URLRequest("LocalConnectionReceiverExample2.swf")); addChild(loader); } private function sendMessage(event:MouseEvent):void { curName = event.target.name; conn = new LocalConnection(); conn.addEventListener(StatusEvent.STATUS, onStatus); conn.send("myConnection", "lcHandler", message.text); reConn = new LocalConnection(); reConn.client = this; try { reConn.connect("reConnection"); } catch (error:ArgumentError) { trace("Can't connect...the connection name is already being used by another SWF from father"); } } private function onStatus(event:StatusEvent):void { switch (event.level) { case "status": trace("LocalConnection.send() succeeded"); break; case "error": trace("LocalConnection.send() failed"); break; } } private function buildUI():void { const hPadding:uint = 5; // messageLabel messageLabel = new TextField(); messageLabel.x = 10; messageLabel.y = 10; messageLabel.text = "Text to send:"; messageLabel.autoSize = TextFieldAutoSize.LEFT; addChild(messageLabel); // message message = new TextField(); message.x = messageLabel.x + messageLabel.width + hPadding; message.y = 10; message.width = 120; message.height = 20; message.background = true; message.border = true; message.type = TextFieldType.INPUT; addChild(message); // sendBtn sendBtn = new Sprite(); sendBtn.name = "black" sendBtn.x = message.x + message.width + hPadding; sendBtn.y = 10; var sendLbl:TextField = new TextField(); sendLbl.x = 1 + hPadding; sendLbl.y = 1; sendLbl.selectable = false; sendLbl.autoSize = TextFieldAutoSize.LEFT; sendLbl.text = "black"; sendBtn.mouseChildren = false; sendBtn.addChild(sendLbl); sendBtn.graphics.lineStyle(1); sendBtn.graphics.beginFill(0xcccccc); sendBtn.graphics.drawRoundRect(0, 0, (sendLbl.width + 2 + hPadding + hPadding), (sendLbl.height + 2), 5, 5); sendBtn.graphics.endFill(); addChild(sendBtn); // 切换按钮 _sendBtn = new Sprite(); _sendBtn.name = "blue" _sendBtn.x = message.x + message.width + hPadding+sendBtn.width; _sendBtn.y = 10; var _sendLbl:TextField = new TextField(); _sendLbl.x = 1 + hPadding; _sendLbl.y = 1; _sendLbl.selectable = false; _sendLbl.autoSize = TextFieldAutoSize.LEFT; _sendLbl.text = "blue"; _sendBtn.addChild(_sendLbl); _sendBtn.mouseChildren = false; _sendBtn.graphics.lineStyle(1); _sendBtn.graphics.beginFill(0xcccccc); _sendBtn.graphics.drawRoundRect(0, 0, (_sendLbl.width + 2 + hPadding + hPadding), (_sendLbl.height + 2), 5, 5); _sendBtn.graphics.endFill(); addChild(_sendBtn); } } }
package { import flash.display.MovieClip; import flash.events.Event; import flash.net.LocalConnection; import flash.text.TextField; /** * 被加载场景 */ public class LocalConnectionReceiverExample extends MovieClip { private var conn:LocalConnection;//接受主场景请求的lc private var reConn:LocalConnection;//发送消息给主场景的lc private var output:TextField;//文本框 public function LocalConnectionReceiverExample() { //构建界面 buildUI(); //控制影片播放 this.addFrameScript(49, function () { stop(); } ); conn = new LocalConnection(); reConn = new LocalConnection(); conn.client = this; try { conn.connect("myConnection"); } catch (error:ArgumentError) { trace("Can't connect...the connection name is already being used by another SWF from son"); } } public function lcHandler(msg:String):void { this.addEventListener(Event.ENTER_FRAME, onEnterF); output.appendText(msg + "/n"); //这句很重要,没写的话会报错 conn.close(); } private function onEnterF(event:Event):void { if (this.currentFrame != 1) { this.prevFrame(); }else { this.removeEventListener(Event.ENTER_FRAME, onEnterF); trace("done") reConn.send("reConnection","removeSwf") output.appendText("sended/n"); } } private function buildUI():void { output = new TextField(); output.background = true; output.border = true; output.wordWrap = true; addChild(output); output.x = 200; output.y = 100; } } }
相关文章推荐
- iOS开发中的错误整理,线程之间通信练习,加载图片的练习中出现的错误 -- Http请求错误
- [ActionScript 3.0] 如何控制加载swf动画的播放与暂停
- Flex里加载SWF,并控制其播放
- 使用YYAnimatedImageView加载GIF图,并且可以控制只播放一次
- flex加载module并相互之间通信
- 书本Applet程序练习------同一页Applet之间的通信
- Android:手机做服务器控制多个手机客户端同时播放音乐(含源码)
- 动态加载fragment和实现fragment 之间的通信
- 使用LocalConnction在SWF之间通信
- 使用linux共享内存机制完成Qt与应用程序之间的通信,Qt加载制作自己的共享内存静态库!!!
- 利用委托的方法实现2个窗体之间的通信的一个小练习
- 同时创建多个线程,它们都访问一个对象中的同步方法,怎么确保第一个线程最先拿到对象锁,否则,怎么保证多个线程之间的有序通信
- flash as3加载两个swf,等前一个播放完之后,再播放后一个。
- Flex SWFLoader加载SWF和元件,控制SWF
- air加载本地swf并与之通信
- 多个 ng-app 中 Controllers & Services 之间的通信
- 面向对象及组件开发(九)控制多个选项卡自动播放
- 如何控制被加载进来的SWF文件的坐标和长宽比例大小?
- 两个SWF之间的通信
- loader加载的swf,loading期间声音先播放的问题