【问题标题】:Inhereted properties of an image in the loader加载器中图像的继承属性
【发布时间】:2011-03-30 18:05:39
【问题描述】:

嘿,我对 AS3 有点陌生,但我一直在尝试尽可能多地学习和阅读 LiveDocumentation,但我无法解决这个问题:

有一个加载器,我根据单击的按钮填充不同的图像。现在为了保持整洁,我使用的是完全相同的装载机。问题是,无论我对图像做什么,加载的下一个图像总是得到前一个图像的属性。我使用了卸载,加载器在宽度和高度上返回 0,而下一个图像仍然是前一个图像的 w/h。其他尝试是将其与父容器分离并将其从显示列表中取出,并使用 Event.UNLOAD 来确保在加载新图像之前之前的图像已输出。

脚本有点长,但基本就是这些,

BrowserLoad.unload();
BrowserReq = new URLRequest("ImageB.jpg"); 
BrowserLoad.load(BrowserReq); 

BrowserLoad.contentLoaderInfo.addEventListener(Event.COMPLETE, Resize);

function Resize (event:Event):void {
/*
And here a big bunch of resizing and scaling of the image loaded that i need to do, is this what's provokin' the later unwanted resizeings!?
*/
}

我想这是一个普遍的问题:我如何确保之前加载到加载器中的图像不会影响下一个加载器? (它的宽度和高度为0还不够......)

【问题讨论】:

  • 我建议你粘贴 Resize 函数的代码。

标签: flash actionscript-3 actionscript


【解决方案1】:

我一直觉得在 AS3 中存在 Loader 对象(原样)是一个不幸的设计决定,加载程序也是一个显示对象这一事实导致了很多混乱。这是发生的事情的简要说明。

Loader 对象不是您加载的资产,在本例中是位图图像,而是一个容器,将您加载的资产作为子 DisplayObject。因此,当您对加载器应用转换时,例如:高度或宽度,您不会修改已加载资产的转换,而是修改其父容器,即 Loader 实例。因此,如果您更改加载的资产,即:卸载并加载新资产,这些转换仍然存在。

在我自己的代码中,我从不将 Loader 对象用作 DisplayObject,并严格使用它们来加载外部内容。加载资产后,您可以直接通过加载器的“内容”属性获取对它的引用,如下所示:

myLoader.content

然后随心所欲使用,直接添加到显示列表中。

如果您想使用 Loader 进行显示,您可以像这样重置所有转换:

myLoader.transform.matrix = new Matrix();

希望对您有所帮助,

【讨论】:

  • +1。为了一个很好的解释。尽管我不同意将加载器作为显示对象是一个坏主意。有时它非常有用(例如,如果您不想显示预加载或过多关心图像未加载,您只需 adChild 加载器,设置 xy 如果需要,继续;如果 load() 返回一个 DPO 会更好,因此您可以在一行中执行此操作)。当您不允许访问内容时(例如,没有跨域),加载程序也很有帮助。这本可以用不同的方式解决,但我认为这很简单。
【解决方案2】:

如果您需要将其设为静态类,请在 BrowserLoad 类中执行此操作

public static function loadImage(url:String):void
    {
        var loader:Loader = new Loader();
        var info:LoaderInfo = loader.contentLoaderInfo;

        //add your event listeners here, just adding one for now...
        info.addEventListener(Event.COMPLETE , completeHandler );

        var request:URLRequest = new URLRequest( url  );
        loader.load( request , new LoaderContext(true) );

    }

正如 Tyler Egeto 所建议的,将您的转换应用于内容:

 public function completeHandler(event:Event):void
 {
     var content:DisplayObject = event.currentTarget.content;
  }

我认为这个解决方案实际上会保持整洁,加载器实例严格用于加载您的内容,仅此而已,如果您需要在您的 completeHandler 之外操作您的内容,您仍然有一些可用的解决方案,例如 store您的图像在数组或位图或 DisplayObjects 的向量中。这样可以避免 Loader 的属性与加载的内容的属性之间的潜在混淆。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 2012-05-08
    • 2011-06-13
    • 2022-07-27
    • 1970-01-01
    相关资源
    最近更新 更多