动作脚本:如何完全更新图像的源属性时如何知道

时间:2010-05-31 21:05:50

标签: flex flash actionscript-3 actionscript air

var I:Image=new Image();
I.source='C:\\Abc.png';
var H:int=I.height;

H总是零!

我认为这是因为图像尚未完成从磁盘读取png文件。

我可以监控哪些事件可以知道宽度和高度何时具有正确的值?

“完成”事件似乎仅适用于下载图像。 'Render'事件发生在每个框架上。 (未记录的?)'sourceChanged',一旦源更改就会发生,并且会出现同样的问题!

当图像的宽度和高度属性具有有效值时,我会观察哪些事件会让我知道?或者是否有一些I.source ='xxx.png'的同步版本,我不知道?

P.S。是的,我知道我不应该在航空计划中使用“C:\”。这只是为了说明的目的,所以你不建议我使用“完整”,当源指示的文件是本地文件时,它似乎从未触发过。

4 个答案:

答案 0 :(得分:0)

首先,sourceChanged是用于绑定的事件。每个Bindable酒店都有类似的财产。

完成应该在加载本地文件时触发 - 无论如何根据文档。我希望它能够在本地文件上快速启动,但是,我希望在加载文件和将内容添加到父文件,定位和调整大小之间存在延迟。这种延迟是高度和宽度无法立即获得的原因。

我可以看到一些不同的方法。首先,您需要查看Flex组件LifeCycle并覆盖updateDisplayList(),以便在项目(我怀疑是contentHolder)的大小时通知您。

第二种可能是覆盖contentHeight或contentWidth,以便它们为高度和宽度调度所述Bindable事件。

第三,是覆盖doScaleContent方法;这似乎是contentHolder的高度和宽度设置的位置。

接受你的选择。我不确定你的用例是什么;所以不能详细说明。

答案 1 :(得分:0)

var I:Image=new Image();
I.addEventListener(Event.COMPLETE, imageIsLoaded);
I.source='C:\\Abc.png';

function imageIsLoaded(event:Event):void
{
    // ...
}

答案 2 :(得分:0)

获胜者是......“调整大小”。一旦图像大小发生变化(从0,0开始),就会触发resize事件。只要调整大小,就会有宽度和高度准确。

答案 3 :(得分:0)

尝试使用以下代码

    protected function init():void
    {
        var loader:Loader = new Loader();
        loader.contentLoaderInfo.addEventListener(Event.COMPLETE, displayImage);            
        loader.load(new URLRequest('http://timeister.com/image.png'));
        return;         
    }

    protected function displayImage(event:Event):void
    {
        var loader:Loader = (event.target as LoaderInfo).loader;
        myImage.data   = loader.content;
        myImage.width  = loader.width;
        myImage.height = loader.height;
        this.height    = myImage.height;
        this.width     = myImage.width;
        this.visible = true;
        return;         
    }