0

我有一个火花元素,我想改变这个元素的颜色,然后把这个元素绘制成.png。

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

例子:

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

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

这打印

color set
screenshot taken

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

这是异步的吗?颜色直到下一帧才真正更新吗?

4

3 回答 3

1

您还可以利用这个小技巧:

rectColor.color=0x000000;
setTimeout(takeScreenShot, 0);
于 2013-10-10T10:44:06.693 回答
1

正如其他人所提到的,是的,弹性组件是“异步的”(谷歌“弹性组件生命周期”了解更多信息)。

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

所以而不是:

takeScreenShot();

只需使用:

callLater(takeScreenShot);

如果你也想传递参数,你可以。代替:

takeSnapshot(myArg1, myArg2);

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

callLater(takeScreenShot, [myArg1, myArg2]);
于 2013-10-10T11:37:30.280 回答
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它应该可以工作。无论需要使用哪个事件,这都是您的问题

于 2013-10-09T23:54:02.070 回答