0

这是一个菜鸟问题,我很尴尬地发布它,但是就这样吧。

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

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

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

我认为位图就像所有其他 DisplayObjects 一样,如果您 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是唯一添加到容器剪辑中的内容。所以如果它再次被添加,它不会只是移动吗?为什么从图像加载器类分配位图不会自动更新已经添加到舞台上的_customImage?

4

1 回答 1

0

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

_customImage只是对已作为容器的父级的 DisplayObject 的引用,不是 DisplayObject 本身,因此当它被替换时,它不会替换舞台上该 DisplayObject 的实例 - 它只是断开与它的连接。

对 DisplayList 上的先前位图的引用保留在内存中,与父容器相关联。我们可以用getChildAt().

您需要removeChild(_customImage)在破坏参考之前。

于 2015-10-08T11:19:48.043 回答