我有一个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
但是,“屏幕截图”图像显示为矩形为红色。颜色没有改变。
这是异步的吗?在下一帧之前,颜色是否真的没有更新?
答案 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_CONSTRUCTED
与ENTER_FRAME
交换,它应该有效。无论需要使用哪个事件,这都是您的问题