火花元素是否异步更改?

时间:2013-10-09 20:59:44

标签: actionscript-3 flash race-condition flex-spark

我有一个spark元素,我想更改此元素的颜色,然后将此元素绘制为.png。

但是,当我一个接一个地做这些事情时,会在颜色改变之前拍摄照片。

示例:

//color is previously red
rectColor.color=0x000000;
trace("color set");
takeScreenShot();

private function takeScreenShot():void{
    trace("screenshot taken");
    //stuff
}

打印

color set
screenshot taken

但是,“屏幕截图”图像显示为矩形为红色。颜色没有改变。

这是异步的吗?在下一帧之前,颜色是否真的没有更新?

3 个答案:

答案 0 :(得分:1)

你也可以利用这个小技巧:

rectColor.color=0x000000;
setTimeout(takeScreenShot, 0);

答案 1 :(得分:1)

正如其他人所说,是的,flex组件是'异步的'(谷歌“flex组件生命周期”以获取更多信息)。

等待下一帧的最简单方法是使用callLater方法 - 每个组件都有它。这将在下一帧调用您的代码。

所以而不是:

takeScreenShot();

只需使用:

callLater(takeScreenShot);

如果你想传递参数,你也可以。而不是:

takeSnapshot(myArg1, myArg2);

将数组中的所有参数作为第二个参数传递:

callLater(takeScreenShot, [myArg1, myArg2]);

答案 2 :(得分:0)

在构建下一帧之前不会进行更新。您正在截取一帧的屏幕截图,并且您所做的更改在下一帧之前不会生效。

rectColor.color=0x000000;
trace("color set");
this.addEventListener( Event.FRAME_CONSTRUCTED, frameConstructedHandler );

private function frameConstructedHandler( e:Event ):void {
    this.removeEventListener( Event.FRAME_CONSTRUCTED, frameConstructedHandler );
    takeScreenShot();
}

private function takeScreenShot():void{
    trace("screenshot taken");
    //stuff
}

这将延迟截图,直到下一帧完成构建。这可能会或可能不会太快(我不记得GUI事件的顺序,我没有时间查找它)。如果这不起作用。将FRAME_CONSTRUCTEDENTER_FRAME交换,它应该有效。无论需要使用哪个事件,这都是您的问题