为什么重复调用someContainer.addChild(myBitmap)会复制我的Bitmap?

时间:2015-10-08 10:24:02

标签: actionscript-3 bitmap bitmapdata displaylist

这是一个非常棒的问题,我很尴尬地发布它,但这里有。

在我的图像加载器类中,我加载了一个Bitmap,然后通过BitmapData.draw()将其BitmapData克隆到另一个Bitmap中。然后,该类存储对克隆位图的引用,并且最初加载的位图可能被垃圾收集,因为它是一个本地化为创建方法的变量。

然后,客户端类从图像加载器类中获取Bitmap,并使用container.addChild()将其添加到舞台。

然后,用户可以重新执行此操作,加载新图像(从磁盘)并在舞台上显示。支持替换旧的Bitmap。

我认为Bitmaps就像所有其他DisplayObject一样,如果你addChild()它将它从它所在的任何DisplayList上的任何地方分离,并将其移动到新容器。如果在同一个容器上对同一个对象使用addChild(),我认为它实际上什么都不做。

事实上,现在我提到它,我不确定为什么需要添加它 - 我强烈地相信代码的工作方式,我只是在替换比特图,所以它应该自动更新已经在舞台上的那个...所以不知怎的,我必须制作新的对象,但我不确定它是如何发生的。

这是代码。

    // "Client" class. User clicks button, loads an image.
    private var _customImage:Bitmap;

    private function onImageButtonClicked():void {
        _cameraRoll.showImagePicker(addImageButton, onImagePickerComplete); // last arg is callback
    }

    private function onImagePickerComplete():void {
        var customImage:Bitmap = _cameraRoll.currentImage;
        _customImage = customImage;
        showCustomImage();
    }

    private function showCustomImage():void {
        imageContainer.addChild(_customImage);

        // Proof that multiple bitmaps get added!!!
        for (var i = 0; i < imageContainer.numChildren; ++i) {
            trace(imageContainer.getChildAt(i));
        }
    }



    // Image Loader class
    private var _currentImage:Bitmap;

    private function onImageLoaded(event:Event):void {
        var tempBitmap:Bitmap = event.currentTarget.content as Bitmap;
        var tempBMD:BitmapData;
        var rotationMatrix:Matrix = new Matrix();

        tempBMD.draw(tempBitmap, rotationMatrix);
        _currentImage = new Bitmap(tempBMD);

        onImagePickerComplete();
    }

    // Do the callback on the client class
    private function onImagePickerComplete():void {
        if (_imagePickerCompleteCallback is Function) {
            _imagePickerCompleteCallback.call(this, true);
        }
    }

额外的痕迹证明我们正在处理单独的实例,并且_customImage在任何时候都没有父亲!它几乎就像通过将它添加到DisplayList一样,将它分开。

这有点奇怪,还是仅仅是我?位图始终存储在客户端类的_customImage中。并且_customImage是唯一添加到容器剪辑的内容。所以,如果它再次被添加,它不会移动吗?为什么从图像加载器类中分配Bitmap不会自动更新已经在舞台上添加的_customImage?

1 个答案:

答案 0 :(得分:0)

Loader类正在从头开始创建一个全新的Bitmap,这是一个全新的DisplayObject(没有父对象)。这会传递给客户端类的_customImage,破坏前面的DisplayObject。

_customImage只是对已经成为容器父级的DisplayObject的引用,不是DisplayObject本身,所以当它被替换时,它不会#&# 39; t替换舞台上该DisplayObject的实例 - 它只是打破了与它的连接。

对DisplayList上的前一个Bitmap的引用保留在内存中,与父容器相关联。我们可以使用getChildAt()将其恢复。

在删除引用之前,您需要removeChild(_customImage)

相关问题
最新问题