0

これは初心者の質問です。投稿するのは恥ずかしいですが、ここに行きます。

私のイメージ ローダー クラスでは、ビットマップをロードし、その BitmapData を BitmapData.draw() を介して別のビットマップに複製しています。次に、クラスは複製されたビットマップへの参照を格納し、最初にロードされたビットマップは、作成メソッドに対してローカルにスコープが設定された変数であるため、おそらくガベージ コレクトされます。

次に、クライアント クラスはイメージ ローダー クラスから Bitmap を取得し、container.addChild() を使用してそれをステージに追加します。

ユーザーは、新しいイメージを (ディスクから) ロードしてステージ上に表示することで、最初からやり直すことができます。古いビットマップを置き換えることが想定されています。

ビットマップは、addChild() を実行すると、それがあった DisplayList のどこからでも切り離され、新しいコンテナに移動されるという点で、他のすべての DisplayObject と同じであると考えました。同じコンテナの同じオブジェクトに 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 に追加することで、それが分割されたかのようになります。

それは変ですか、それとも私だけですか?Bitmap は常に_customImageクライアント クラスに格納されます。そして_customImage、コンテナ クリップに追加される唯一のものです。もう一度追加されたら、移動するだけではありませんか? また、イメージ ローダー クラスから Bitmap を割り当てても、ステージに既に追加されている _customImage が自動的に更新されないのはなぜですか?

4

1 に答える 1