复制外部加载的swf

复制外部加载的swf是一个相对高级的操作,步骤比较多,过程相对复杂,要阐述清楚原理细节需要很大篇幅的文字,因此,这里我就偷懒不详细写说明了,纯用代码来说明问题,希望对看得懂的朋友起到抛砖引玉的作用。
方法1——ByteArray深度复制

  1. var byteLoader:URLLoader = new URLLoader();
  2. byteLoader.dataFormat = URLLoaderDataFormat.BINARY;
  3. byteLoader.addEventListener(Event.COMPLETE, loadCompleteHandler);
  4. var loader:Loader = new Loader();
  5. loader.y = 200;
  6. addChild(loader);
  7. loader.contentLoaderInfo.addEventListener(Event.INIT, loadInitHandler);
  8. function loadInitHandler(evt:Event):void
  9. {
  10. var cloneLoder:Loader = new Loader();
  11. addChild(cloneLoder);
  12. cloneLoder.loadBytes(byteLoader.data);
  13. }
  14. byteLoader.load(new URLRequest("t.swf"));
  15. function loadCompleteHandler(evt:Event):void
  16. {
  17. loader.loadBytes(byteLoader.data);
  18. }

  简单原理:用URLLoader将外部的swf以二进制数据格式加载到ByteArray中,然后用Loader类的loadBytes去加载URLLoader中的ByteArray。
方法2——ApplicationDomain 运行时动态类复制

  1. var loader:Loader = new Loader();
  2. loader.y = 200;
  3. addChild(loader);
  4. loader.contentLoaderInfo.addEventListener(Event.INIT, loadInitHandler);
  5. var context:LoaderContext = new LoaderContext();
  6. context.applicationDomain=ApplicationDomain.currentDomain;
  7. loader.load(new URLRequest("t.swf"), context);
  8. function loadInitHandler(evt:Event):void
  9. {
  10. var ClassRef:Class = loader.contentLoaderInfo.applicationDomain.getDefinition("TestClass") as Class;
  11. var clone_mc: MovieClip = new ClassRef();
  12. addChild(clone_mc);
  13. }

注意:
以上两种复制方法,由于都需要加载swf文件,因此需要文件级别的本地安全性;
使用第二种方法(ApplicationDomain)时,生成“t.swf”时必须为舞台添加文档类属性。添加的文档类可以是具体的外部as类,也可以仅仅是一个名字。上例中我添加的文档名为”TestClass”, getDefinition("TestClass")中填的参数内容应该跟要复制的swf的文档类名相同。
ApplicationDomain还有更多高级用法,有兴趣的高级AS程序员可以去研究一下。

时间: 2024-10-04 08:46:18

复制外部加载的swf的相关文章

控制加载的swf动画暂停和播放

外部加载进来的swf动画(无论是as2.0的还是as3.0的)可以控制暂停和播放,声音也能暂停和播放,但是注意的一点,导入的声音必须是“数据流”.请看以下代码: Main.as: package { import flash.display.Sprite; import flash.events.MouseEvent; import flash.text.TextField; /** *@author hypo.chen *@E-mail [email protected] *@data 201

[ActionScript 3.0] AS3.0 Loader加载子swf时是否需要指定新的应用程序域ApplicationDomain

实际应用中, Loader加载子swf时是否需要指定新的应用程序域ApplicationDomain,需要择情况而定. 1.当加载的子swf中有流存在时,比如视频或者声音,则最好需要指定新的应用程序域ApplicationDomain,如果没有指定,调用_ldr.unloadAndStop();时无法将子swf中的流从内存中卸载掉,了解原因,请深入了解应用程序域ApplicationDomain,代码如下: var ldr:Loader = new Loader(); var context:L

AS3加载操作swf

随着程序越来越大,我们需要把它拆分成多个swf,在需要的时候动态加载.拆分时应该尽量把不同的类编译进唯一的swf,避免因swf文件增多而使整个程序的文件尺寸增大.按此原则可以拆分出以下两种swf,借助 ApplicationDomain 共享其代码和资源. * 模块(Module)       按照程序逻辑,可以拆分出多个“功能模块”,如“注册”.“管理”等等:按照游戏或社区类程序的关卡或场景,可以拆分出不同的“场景模块”.这些模块不是主程序运行必须的,只在需要的时候加载.     * 运行时共

flex 与 加载的swf传参,获取文档类

public function setPicData(parmProductNameId:int):void{ trace("swf里面的方法setFlipBookData被调用,接收的参数图片数组::" + parmProductNameId); productNameId = parmProductNameId; return; }// end function 1.swf 的文档类里面,写好flex 调用的接口方法: 2. flex加载swf 文件. 获取到swf的文档类,直接调

网站后端_Python+Flask.0004.FLASK配置管理之三种方式加载外部配置?

简单介绍: 说明: 复杂的项目需要配置各种环境,若设置少可直接硬编码,设置多的话可通过加载配置/加载文件/加载变量的方式来设置 app.config.update(     DEBUG=True, ) 扩展: app.config是flask.config.Config类的实例,继承子PY内置数据结构dict,所以可以使用如上update方法,支持传入多个键值对,其实app.config内置很多配置变量(http://flask.pocoo.org/docs/0.11/config/#Built

html加载swf,代码模拟点击事件

一.背景 1.最近在做一个android端播放flash的应用,android设备没有屏幕,显示需通过HDMI连接.需要用到javascript与java之间的交互,android端接收flash传过来的fscommand 2.希望通过WebView加载html实现 二.遇到问题 1.通过html加载之后的动画,无论按哪个按键,swf文件都接收不到按键消息,既不能实现它本身的一些操作性功能 2.传过来的命令接收不到(有时间再分析这个,已经解决) 三.尝试方法 1.发现如果直接通过电脑端使用浏览器

u3d外部资源 打包与加载的问题

被坑了一下午,调bug,u3d外部加载资源一会可以,一会不行,始终找不到问题,最后快下班的时候,重新试了一下,原来是资源打包之前的文件名,和之后的加载资源名必须一样 [MenuItem("Custom Editor/Build AssetBundle From Selection Twice")] static void ExportResourceNoTrack() { // Bring up save panel string path = EditorUtility.SaveFi

u3d加载外部视屏

u3d的外部加载视屏,采用www方式,可以使用gui播放,也可以绑定到gameobject上作为动态材质使用,不过目前只支持.ogg格式,需要转... using UnityEngine;using System.Collections; public class movie : MonoBehaviour{    private MovieTexture movTexture;     private string movPath;     void Start()    {        m

[ActionScript 3.0] 如何控制加载swf动画的播放与暂停

此方法适用于用as 1.0或者as2.0以及as3.0编译的swf,因为as1.0和as2.0编译的swf是AVM1Movie类型,因此需要通过类ForcibleLoader.as将其转换为version 9以上的swf,注意,如果加载的swf是3.0代码编译的,且此swf用文档类编译,则文档类必须继承MovieClip,接下来看代码: 首先写一个加载swf的类SwfPlayer.as: 1 package com.views 2 { 3 import com.controls.utils.Fo