2010-07-19 32 views
0

我遇到類似於FLEX: dialog not display immediately的問題。代碼如下:立即在Flex 3中添加子項

private function saveBitmap(event:ContextMenuEvent):void 
{ 
    loadingScreen.visible = true; 
    loadingScreen.appLoadingText.text = "Preparing bitmap..."; 
    addChild(loadingScreen); 

    validateNow(); 

    var bmpd:BitmapData = new BitmapData(canv.width, canv.height); 
    bmpd.draw(canv); 

    var fr:FileReference = new FileReference(); 
    fr.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA, removeLoadingScreen); 
    fr.addEventListener(Event.CANCEL, removeLoadingScreen); 
    var png:PNGEncoder = new PNGEncoder(); 
    var iba:ByteArray = png.encode(bmpd); 
    fr.save(iba, "export.png"); 
} 

基本上bmpd.draw和/或png.encode是狗慢,所以我想有一個很好的「請稍等,我們準備PNG」對話框出現。由於FileReference的原因,我無法使用callLater()。

只是爲了好的措施,加載屏幕同時出現從調用fr.save()的保存對話框。

任何想法?

乾杯!

回答

0

您正在此功能中添加子項。您是否正在爲loading Screen進行其他工作,比如確定尺寸?還是定位呢?最常見的是在updateDisplayList()中完成。你使用什麼容器?

你確定你的兩個孩子的Z順序是正確的嗎?您可以使用swapChildren方法替換子項

+0

加載圖片在XML中的寬度和高度都會自動調整爲100%,我會希望在我致電validateNow()時完成此操作。 我之前嘗試在這個對象(它是Canvas的子類)中保持loadingCanvas並只是彈出可見性,但它仍然沒有出現。 我假設z順序是正確的,因爲加載屏幕最終會出現,但直到PNGEncoder完成。 – Andrew 2010-07-20 12:14:25

+0

您的意思是XML或MXML?如果您在MXML中創建組件,則不應使用addChild()方法;因爲Flex編譯器可以將MXML轉換爲ActionSCript,其中包括將所有子項添加到適當的容器中。 validateNow()應強制updateDisplayList()運行。但是,您是否正在添加加載屏幕來自動調整大小和定位子項的容器?我認爲你需要分享更多的代碼。 – JeffryHouser 2010-07-20 12:20:16

+0

我的意思是MXML,對不起。我不太清楚你需要多少代碼,所以有這一切: http://pubmap.svn.sourceforge.net/viewvc/pubmap/trunk/pubmap/ 我應該添加代碼以上是在視口/ common.as和加載屏幕是視口/ LoadingScreen.mxml 感謝您的幫助到目前爲止。 – Andrew 2010-07-21 09:52:29