`

as3 Loader.load()时出现错误“Error #2025: 提供的 DisplayObject 必须是调用者的子级”的解决方案

 
阅读更多

 

最近因为项目需要,所以开始了as3的开发之旅。今天遇到一个问题,就是在用flash.display.Loader的load()方法的时候,如果反复调用load(),就会出现“Error #2025: 提供的 DisplayObject 必须是调用者的子级”的错误,核心代码如下:

 

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->        public function loadPhoto(picURL):void {
            _loader.load(
new URLRequest(picURL));
            _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad);
            _loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);
        }
        
        protected 
function onLoad(event:Event):void {
            content.addChild(_loader.content);
            _eventDispatcher.dispatchEvent(
new Event(PhotoLoader.EVENTS_LOAD));
        }

 

搜索了相关的问题,说是每次用到Loader对象的时候,都去new一下,就可以避免这个错误,试了试,果然可以正常使用了,代码改成这样:

 

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->        public function loadPhoto(picURL):void {
            _loader 
= new Loader(); //这里多加了一条new Loader()的语句
            _loader.load(
new URLRequest(picURL));
            _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad);
            _loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);
        }
        
        protected 
function onLoad(event:Event):void {
            content.addChild(_loader.content);
            _eventDispatcher.dispatchEvent(
new Event(PhotoLoader.EVENTS_LOAD));
        }

 

不过每次都去new的话,内存开销肯定受不了,所以不敢采用这个方案,于是请教了涵涵同学,丫说可以把Loader对象直接作为Sprite对象的子节点,也就是改成这样

 

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->        public function loadPhoto(picURL):void {
            _loader.load(
new URLRequest(picURL));
            _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad);
            _loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);
        }
        
        protected 
function onLoad(event:Event):void {
            
if(content.numChildren==0){ //这里加上了只有第一次装载时才add到容器中的判断
                content.addChild(_loader);
//这里直接添加_loader对象,因为Loader也是从DisplayObject类继承过来的,所以能直接用
            }
            
            _eventDispatcher.dispatchEvent(
new Event(PhotoLoader.EVENTS_LOAD));
        }

 

果然这样直接就可以用,而且不需要每次都去new了。

为什么会出现这种情况呢?

我又把代码改回去调试了一下:

 

            trace(_loader.content.parent);
            content.addChild(_loader.content);
            trace(_loader.content.parent);

输出:

    [object Loader]

    [object Sprite]

 

 

由此可见,_loader.content的父节点被改变了(废话,因为被addChild到另外的DisplayObject里了),所以可能Loader的load()方法在处理content的时候,用到了content.parent这个对象,结果因为parent被改变了,所以出错了,有研究过as3类库源码的同学可以出来帮忙说明一下下^_^。

所以之前的代码改为这样既可:

 

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->        public function loadPhoto(picURL):void {
            _loader.load(
new URLRequest(picURL));
            _loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoad);
            _loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onError);
        }
        
        protected 
function onLoad(event:Event):void {
            
if(content.numChildren==0){
                content.addChild(_loader);
            }
            
            _eventDispatcher.dispatchEvent(
new Event(PhotoLoader.EVENTS_LOAD));
        }
分享到:
评论

相关推荐

    [心得] AS3)灰化显示对象(DisplayObject)的方法 / 图片灰化

    NULL 博文链接:https://as3.iteye.com/blog/1168070

    fixjs-0.3.0

    --新增功能:新增类fixjs.display.DisplayObject --新增功能:新增类fixjs.display.InteractiveObject release 0.1.0 --新增功能:新增全局函数trace --新增功能:新增类fixjs.Class --新增功能:新增类fixjs....

    as3场景中MC复制一个或多个

    说明:这个是用来实现已在场景中的Mc复制多个出来,如AS2中可以duplicateMovieClip,AS3中用是用New和addChild的, 有人会说As3可以用  方法1——反射方法: var ClassRef:Class = getDefinitionByName...

    PROGRAMMING ACTIONSCRIPT 3.0

    Chapter 3: ActionScript language and syntax.67 Language overview..68 Objects and classes.69 Packages and namespaces... 70 Packages...70 Namespaces..75 Variables83 Data types87 Type checking..88 ...

    fixjs_src_0.2.0

    fixjs.Object:提供对象初始化,释放控制,克隆接口 fixjs.DisposeUtil:释放资源工具类 fixjs.CloneUtil:克隆资源工具类 fixjs.Map:哈希数据结构 【事件处理】 fixjs.events.Event:事件类 fixjs.events....

    flex 一问一答

    5.问:as3中如何设置拖动,as2这样的mc.onPress=function(){startDrag(mc,false,10,100,110,100);} 答:mc.addEventListener(MouseEvent.MOUSE_DOWN,onMouseDown); function onMouseDown(e:MouseEvent):void{ var t:...

    Pv3D-镜头.Dq

    不止基本体从DisplayObject3D中继承属性和方法,CameraObject3D也是它的子类.纵观之,Camera3D继承自CameraObject3D,CameraObject3D继承自DisplayObject3D. 这意味着什么? 每个摄像机都从DisplayObject3D继承x,y,z属性...

    as3 滚动条 AsScroolBar 水平垂直

    给可视对象添加滚动条 new AsScroolBar()加入显示列表 AsScroolBar(_controlUI:DisplayObject,_scrollWidth:int,_scrollHeight:int,_stepNum:int=20)

    基于C++ 设计的捕鱼游戏

    显示对象DisplayObject.h的封装 精灵对象sprite.h的封装 场景类action.h的封装 计时器对象ticker.h的封装 窗口对象DemoApp.h的说明 消息映射和流程触发结构 createBefore.h 子弹对象bullet.h的封装 鱼类fish.h的封装...

    AS 3.0缓动拖动

    import flash.display.DisplayObject; import flash.display.DisplayObjectContainer; import flash.display.MovieClip; import flash.events.MouseEvent; import flash.events.Event; public class ...

    Flash网络游戏开发入门经验共享.pdf

    1. 显示技术:学习 AS3 提供的 2D 显示引擎,了解 DisplayObject 和 DisplayObjectContainer 的区别,掌握 Shape, Sprite, MovieClip, Bitmap 等基本可显示对象的使用。 2. 鼠标输入交互:学习鼠标输入的处理,了解...

    特效-水波纹 很动感,特此恭大家欣赏

    private var _source:DisplayObject; private var _defData:BitmapData; private var _expandFilter:ConvolutionFilter; private var _filter:DisplacementMapFilter; private var _drawRect:Rectangle; ...

    easeljs1.0.0源码

    this._managed[b.id]&&b._reset()),this._managed[b.id]=2)},b.Container__getBounds=b._getBounds,b._getBounds=function(a,b){var c=this.DisplayObject_getBounds();return c||(this._updateTimeline(),this....

    xrope:原生 as3 显示对象的简单布局库

    Xrope:用于原生 as3 显示对象的简单布局库。 特征 对于原生 as3 显示对象。 没有 Flex 或任何其他依赖项。 AtomLayout 使用getBounds()对齐 DisplayObject。 不用担心FLA 中的注册点。 (将useBounds设置为true ,...

    flash电子翻书 swc包

    这个网上基本很难找的到,...array里面放的是 DisplayObject对象或它子类的数组 book.next(); 下一页 book.prev(); 上一页 由于这个里面的代码不是我写的.感觉里面有些东西不全面, 其他的功能自己去研究. 效果挺不错.

    blitting as3

    当让大量的DisplayObject对象动起来时,如MovieClip或Sprite对象,Adobe Flash Player可能在表现上会大大折扣。Flash Player必须遍历显示对象树并为每个基于向量的DisplayObject计算渲染输出,这样会消耗CPU周期成为...

    AsPixBook:一个 3D 翻页书实现

    像素书 3D 翻页书实现。 这个库没有依赖项。 请参阅文件夹。 工作表顶点代码来自 (它本身基于另一个未知项目,可能是)。 3D 三角形绘图代码基于 ,并针对此特定用例进行...book.addPage(/* DisplayObject Here */)

    magnet:Corona SDK Graphics 2.0的位置帮助器

    要定位,只需调用函数并传递displayObject magnet: topLeft ( displayObject ) 保证金 如果您需要从左侧开始留有10px的边距,请按照以下步骤操作: magnet: topLeft ( displayObject, 10 ) 或与之前相同,但距...

    PIXI.TextInput:pixi.js插件,提供了一种向pixijs阶段添加文本输入的便捷方法

    pixi.js的此插件提供了一种将文本输入添加到pixijs阶段的便捷方法。 输入本身是一个HTML &lt;input&gt;元素,根据PIXI-DisplayObject给出的转换,该元素位于舞台的上方。 该框在PIXI平台上绘制。 此外,您可以选择当...

Global site tag (gtag.js) - Google Analytics