0

我有两个问题要解决。

首先,我有这个函数将图像(基于 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

您需要从contentLoaderInfo属性中提取此数据。

在你的情况下:

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

正如LoaderInfo#height的文档中所讨论的:

此值可能与显示内容的实际高度不同,因为加载的内容或其父显示对象可能会被缩放


顺便说一句,你不应该在这件事上声明函数。它不利于内存管理和代码组织。每次加载图像时,都必须在内存中重新创建该函数,而不仅仅是引用。因此,CPU 必须在加载它之前重新创建该函数,每次您需要它并且每个实例都存储在内存中,直到下次运行 GarbageCollection。

如果您在全局空间中声明它(也不要在其他函数中嵌套函数),则该函数在其范围内时会立即加载到内存中(通常是在加载类时)。所以加载会有一些开销,但是一旦加载,它就在那里并且可以使用了。该函数也只有一个实例。

如果您只制作 1 张图片,这似乎没什么大不了的,但在为包含数百个拇指的画廊做拇指墙之类的事情时,它可能会导致感知到的内存泄漏。

于 2012-11-16T00:46:02.913 回答
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.COMPLETE事件侦听器Loader.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 回答