0

解決すべき問題が 2 つあります。

まず、(URL に基づいて) 画像をムービークリップに追加するこの関数があり、ムービー クリップ内のアスペクト比を維持しようとします。しかし、集中化する必要があり、ローダーの x と y を適切な値に変更する方法が見つかりません。

function addImg(movieclip,url):void {
    var urlRequest:URLRequest = new URLRequest(url);
    var loader:Loader = new Loader();
    var loaderContext:LoaderContext = new LoaderContext();
    loaderContext.checkPolicyFile = true;

    loader.load( urlRequest, loaderContext );

    var W:Number = movieclip.width;
    var H:Number = movieclip.height;
    var A:Number = W/H;

    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, function(e:Event){
        var tempImage:Bitmap = new Bitmap(e.target.content.bitmapData);

        var image:Object = {};
        image.width = 267;
        image.height = 223;

        var a:Number = image.width / image.height;

        if( A >= a ){
            loader.width =H*a;
            loader.height =H;
        }else{
            loader.width = W;
            loader.height =W / a;
        }

        movieclip.alpha =1;     
        loader.alpha = 1;

        movieclip.addChild( loader );
    }); 
}

次に、ハードコードされた幅と高さを使用しています。画像の元のサイズを特定するにはどうすればよいですか? 新しいビットマップ (e.target.content.bitmapData) を覗いてみましたが、幅と高さが間違っています (ステージの w と h を表示します)。

アイデアはありますか?

4

2 に答える 2

1

あなたの質問を完全に理解しているかどうかはわかりませんが、答えは次の例のように簡単です。

package 
{
    import flash.display.Bitmap;
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.net.URLRequest;

    public class Main extends Sprite 
    {

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            var loader:Loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
            loader.load(new URLRequest("images/koala.jpg"));

        }// end function

        private function onComplete(e:Event):void {

            var bitmap:Bitmap = ((e.target as LoaderInfo).content as Bitmap);

            var sprite:Sprite = new Sprite();

            sprite.addChild(bitmap);

            bitmap.x = -(bitmap.width / 2);
            bitmap.y = -(bitmap.height / 2);

            addChild(sprite);

            sprite.x = stage.stageWidth / 2;
            sprite.y = stage.stageHeight / 2;

        }// end function

    }// end class

}// end package

オブジェクトを使用して画像を読み込み、プロパティにイベント リスナーをLoader追加します。Event.COMPLETELoader.contentLoaderInfo

var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
loader.load(new URLRequest("images/koala.jpg"));

次に、イベントハンドラーが呼び出されると、LoaderInfoオブジェクトからビットマップを取得します

var bitmap:Bitmap = ((e.target as LoaderInfo).content as Bitmap);

次に、ビットマップを追加する表示オブジェクト コンテナを作成します。次に、ビットマップを表示オブジェクト コンテナー内の中央に配置するにxは、ビットマップのプロパティを幅の半分からマイナスした値に設定し、ビットマップのyプロパティから高さの半分を引いた値に設定します。

var sprite:Sprite = new Sprite();

sprite.addChild(bitmap);

bitmap.x = -(bitmap.width / 2);
bitmap.y = -(bitmap.height / 2);
于 2012-11-16T01:19:44.643 に答える
1

プロパティからこのデータを取得する必要がありcontentLoaderInfoます。

あなたの場合:

var originalHeight:int( e.currentTarget as LoaderInfo ).height;
var originalWidth:Number = ( e.currentTarget as LoaderInfo ).width;

LoaderInfo#heightのドキュメントで説明されているように:

この値は、コンテンツが表示される実際の高さとは異なる場合があります。これは、読み込まれたコンテンツまたはその親表示オブジェクトがスケーリングされる可能性があるためです。


余談ですが、その件で関数を宣言するべきではありません。メモリ管理とコード編成には不十分です。画像をロードするたびに、その関数を参照するだけでなく、メモリ内に再作成する必要があります。そのため、CPU はその関数をロードする前に再作成する必要があり、必要になるたびに、GarbageCollection が次に実行されるまで各インスタンスがメモリ内に格納されます。

グローバル空間で宣言すると (他の関数内に関数を入れ子にしないでください)、関数はスコープ内にあるとき (通常はクラスがロードされるとき) にすぐにメモリにロードされます。そのため、ロード時に多少のオーバーヘッドがありますが、ロードされるとすぐに使用できるようになります。また、その関数のインスタンスは 1 つだけです。

画像を 1 つしか処理していない場合、これは大したことではないように思えるかもしれませんが、数百個のサムが含まれるギャラリーのサム ウォールなどを実行すると、メモリ リークが発生する可能性があります。

于 2012-11-16T00:46:02.913 に答える