这是一个菜鸟问题,我很尴尬地发布它,但是就这样吧。
在我的图像加载器类中,我正在加载一个位图,然后通过 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?