这是一个非常棒的问题,我很尴尬地发布它,但这里有。
在我的图像加载器类中,我加载了一个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?
答案 0 :(得分:0)
Loader类正在从头开始创建一个全新的Bitmap,这是一个全新的DisplayObject(没有父对象)。这会传递给客户端类的_customImage
,破坏前面的DisplayObject。
_customImage
只是对已经成为容器父级的DisplayObject的引用,它不是DisplayObject本身,所以当它被替换时,它不会#&# 39; t替换舞台上该DisplayObject的实例 - 它只是打破了与它的连接。
对DisplayList上的前一个Bitmap的引用保留在内存中,与父容器相关联。我们可以使用getChildAt()
将其恢复。
在删除引用之前,您需要removeChild(_customImage)
。