2013-10-09 4 views
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 

Тем не менее, "кадр" изображение отображается с прямоугольника, как красный цвет. Цвет не изменился.

Является ли это асинхронным? Цвет действительно не обновляется до следующего кадра?

ответ

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, и он должен работать. Вне зависимости от того, какое событие должно быть использовано, что ваша проблема здесь

1

Вы также можете воспользоваться этой маленькой хитрости:

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

Как уже упоминалось, да, гибкие компоненты являются «асинхронными» (Google «Жизненный цикл гибких компонентов» для получения дополнительной информации).

Самый простой способ подождать следующего кадра - использовать метод callLater - каждый компонент имеет его. Это вызовет ваш код на следующем кадре.

Таким образом, вместо:

takeScreenShot(); 

Просто используйте:

callLater(takeScreenShot); 

Если вы хотите передать параметры тоже можно. Вместо того, чтобы:

takeSnapshot(myArg1, myArg2); 

вы передаете все аргументы в массив в качестве второго параметра:

callLater(takeScreenShot, [myArg1, myArg2]);