zoukankan      html  css  js  c++  java
  • as3加载外部资源

    在as3的开发中,经常会加载外部共用资源,比如某一个公用的图片或者其它小特效。这时候为了避免重复请求,一般会将这些资源放在一个fla文件中,为每一个资源添加链接。这里以一张图片为例(flower.fla):

    这样就生成了一个名为flower.swf文件,将其放在b.com域下,访问路径为:http://b.com/swf/flower.swf

    新建一个名为main.fla文件,如果是在fla内加载flower.swf文件,可以这样定义(本地加载文件,不需要设置LoaderContext的securityDomain属性,否则会报错):

    ldr = new Loader();
    var url:String = 'http://b.com/swf/flower.swf';
    var req:URLRequest = new URLRequest(url);
    var ldrContext:LoaderContext = new LoaderContext(false, new ApplicationDomain(ApplicationDomain.currentDomain));

    ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
    ldr.load(req, ldrContext);
     
    如果需要获取MyFlower这个类
    var MyFlower:Class = ldr.contentLoaderInfo.applicationDomain.getDefinition('MyFlower') as Class;

    trace(MyFlower + '--' + ApplicationDomain.currentDomain.hasDefinition('MyFlower'));

    var bmpData:BitmapData = new MyFlower(359, 629);
    var bmp:Bitmap = new Bitmap();
    bmp.bitmapData = bmpData;
    bmp.x = 0;
    bmp.y = 0;

    addChildAt(bmp, 0);

    因为使用的是子域名加载(new ApplicationDomain(ApplicationDomain.currentDomain)),所以使用当前域ApplicationDomain.currentDomain,是不能获得到MyFlower类的定义。而loader.contentLoaderInfo.applicationDomain无论是以:当前域(ApplicationDomain.currentDoamin)、子域(new ApplicationDomain(ApplicationDoamin.currentDomain))、新域(new ApplicationDomain()),都可以访问到加载的swf。

    如果main.swf与flower.swf属于同一域则不需要设置ldrContext的securityDomain属性,而假设main.swf放在a.com下,而flower.swf放在b.com域下,则需要设置该属性(ldrContext.securityDomain = SecurityDomain.currentDomain;)。否则在访问加载的swf时,会报安全沙箱冲突,而main.swf在第一次加载flower.swf时,会先加载b.com根目录下的crossdomain.xml(http://b.com/crossdomain.xml)文件。

    image

    完整的Main.as(舞台上先放置了一个从库里拖拽出来的button,而且取消了“自动声明舞台实例”)

    package 
    {
    import flash.display.Sprite;
    import fl.controls.Button;
    import flash.events.*;
    import flash.display.Loader;
    import flash.net.URLRequest;
    import flash.system.ApplicationDomain;
    import flash.system.LoaderContext;
    import flash.display.BitmapData;
    import flash.display.Bitmap;
    import flash.system.SecurityDomain;
    import flash.external.ExternalInterface;

    public class Main extends Sprite
    {
    public var loadBtn:Button;
    private var ldr:Loader;

    public function Main()
    {
    initView();
    }

    private function initView():void
    {
    loadBtn.label = '加载swf';

    loadBtn.addEventListener(MouseEvent.CLICK, onClickHandler);
    }

    private function onClickHandler(evt:MouseEvent):void
    {
    if (ldr == null)
    {
    ldr = new Loader();

    }

    var url:String = 'http://b.com/swf/flower.swf';
    var req:URLRequest = new URLRequest(url);
    var ldrContext:LoaderContext = new LoaderContext(false, new ApplicationDomain(ApplicationDomain.currentDomain));
    ldrContext.securityDomain = SecurityDomain.currentDomain;

    ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
    ldr.load(req, ldrContext);
    }

    private function onCompleteHandler(evt:Event):void
    {
    var MyFlower:Class = ldr.contentLoaderInfo.applicationDomain.getDefinition('MyFlower') as Class;

    trace(MyFlower + '--' + ApplicationDomain.currentDomain.hasDefinition('MyFlower'));

    var bmpData:BitmapData = new MyFlower(359, 629);
    var bmp:Bitmap = new Bitmap();
    bmp.bitmapData = bmpData;
    bmp.x = 0;
    bmp.y = 0;

    addChildAt(bmp, 0);
    }

    }
    }
    image
     
    点击“加载swf”按钮后,最终的效果图:
    image

    有兴趣可以扩展阅读更多(很经典的文章):

    教程:深入理解Flash的沙箱 – Application Domains

    教程:深入理解Flash的沙箱 – Security Domains

  • 相关阅读:
    springboot之热部署
    在动态sql的使用where时,if标签判断中,如果实体类中的某一个属性是String类型,那么就可以这样来判断连接语句:
    对集合进行判空的操作
    配置logback日志管理的时候
    SpringBoot序列化时间类型的问题
    Cannot determine embedded database driver class for database type NONE
    idea的基础设置
    使用navicat创建数据库
    LESS
    数据库链接池--简单的理解
  • 原文地址:https://www.cnblogs.com/meteoric_cry/p/2765695.html
Copyright © 2011-2022 走看看