2015-10-08 2 views
0

Ceci est une question noob, je suis gêné de l'afficher, mais voilà.Pourquoi les appels répétés à someContainer.addChild (myBitmap) dupliquent-ils mon bitmap?

Dans ma classe de chargeur d'image, je charge un bitmap, puis clone son bitmapData dans un autre bitmap via BitmapData.draw(). La classe stocke alors une référence au bitmap cloné et le bitmap chargé à l'origine obtient vraisemblablement du garbage collection car il s'agissait d'une variable portée localement à la méthode de création.

La classe client récupère ensuite le bitmap de la classe du chargeur d'images et utilise container.addChild() pour l'ajouter à la scène.

L'utilisateur peut alors tout recommencer, charger une nouvelle image (à partir du disque) et l'afficher sur la scène. C'est SUPPOSÉ pour remplacer l'ancien bitmap. Je pensais que les Bitmaps étaient comme tous les autres DisplayObjects en ce que si vous ajoutez AddChild(), il les détache de n'importe quel DisplayList et les déplace vers le nouveau conteneur. Dans le cas d'utiliser addChild() pour le même objet sur le même conteneur, j'ai supposé que cela ne ferait rien, vraiment.

En fait, maintenant que je le mentionne, je ne sais pas pourquoi il est nécessaire d'ajouter du tout - la façon dont je crois le code fonctionne, je suis juste remplacer le Bitmap et il devrait donc mettre à jour automatiquement celui qui est déjà sur scène ... je dois donc créer de nouveaux objets, mais je ne sais pas comment ça se passe.

Voici le code.

// "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); 
     } 
    } 

traces supplémentaires portent que nous avons affaire à des instances distinctes, et que, à aucun moment ne _customImage ont en fait un parent! C'est presque comme si, en l'ajoutant à la DisplayList, il le sépare.

Est-ce étrange, ou est-ce juste moi? Le bitmap est toujours stocké dans _customImage sur la classe client. Et _customImage est la seule chose ajoutée au clip du conteneur. Donc si ça se rajoute, ça ne bougerait pas? Et pourquoi l'assignation de Bitmap à la classe du chargeur d'images ne met-elle pas automatiquement à jour l'image _customImage déjà ajoutée sur la scène?

Répondre

0

La classe Loader crée une toute nouvelle image bitmap, qui est un tout nouveau DisplayObject (sans parent). Cela est passé à _customImage sur la classe client, en écrasant le DisplayObject précédent.

_customImage a juste une référence au DisplayObject qui a déjà été apparenté au récipient, il n'est pas le DisplayObject, donc quand il est remplacé, il ne remplace pas l'instance de ce DisplayObject sur la scène - il juste rompt la connexion avec elle.

Une référence à l'image bitmap précédente figurant sur la liste d'affichage reste en mémoire, associée au conteneur parent. Nous pouvons le récupérer avec getChildAt().

Avant de modifier la référence, vous devez indiquer removeChild(_customImage).