文章,http://www.onflex.org/ted/2007/02/flex-instantiation-life-cycle-and-event.php,说,Flex一切都是事件,flex是事件驱动的。(Flex is an event driven programming model, everything (and I mean everything) happens due to an event. )。
这个问题的起源是我写了一个读取VBox高度的代码:
// init the whole app. private function init():void { leftTree.dataProvider=leftList; leftTree.selectedIndex=0; //srightVBox.backgroundImage="http://www.lovezaoan.cn/attachment/200905/24/25_1243179290Yp2p.jpg"; test.text = leftCanvas.width+ " "+hdBox.height; }
上面的粗体是读leftCavas和hdBox的大小,但是得到的是0.
根据上面的文章,得到的0的原因是没有理解flex中的组件加载顺序。根据上面文章提供的例子。
http://www.onflex.org/flexapps/applications/EventFlow/srcview/index.html
结果:
http://www.onflex.org/flexapps/applications/EventFlow/
<span style="font-family: courier new,courier;" mce_style="font-family: courier new,courier;"> <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" id="EventFlow" width="100%" height="100%" codebase="http://fpdownload.macromedia.com/get/flashplayer/current/swflash.cab"> <param name="movie" value="EventFlow.swf" /> <param name="quality" value="high" /> <param name="bgcolor" value="#67cbff" /> <param name="allowScriptAccess" value="sameDomain" /> <embed src="EventFlow.swf" mce_src="EventFlow.swf" quality="high" bgcolor="#67cbff" width="100%" height="100%" name="EventFlow" align="middle" play="true" loop="false" quality="high" allowScriptAccess="sameDomain" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer"> </embed></span> <span style="font-family: courier new,courier;" mce_style="font-family: courier new,courier;"><br /></span> <span style="font-family: courier new,courier;" mce_style="font-family: courier new,courier;"><br /></span> 167ms >> EventFlow0.preinitialize 183ms >> EventFlow0.outTextArea.initialize 187ms >> EventFlow0.HelloButton.initialize 188ms >> EventFlow0.GoodByeButton.initialize 189ms >> EventFlow0.ClearButton.initialize 189ms >> EventFlow0.initialize 243ms >> EventFlow0.outTextArea.creationComplete 243ms >> EventFlow0.HelloButton.creationComplete 243ms >> EventFlow0.GoodByeButton.creationComplete 244ms >> EventFlow0.ClearButton.creationComplete 244ms >> EventFlow0.creationComplete 246ms >> EventFlow0.applicationComplete
从这个结果看出,组件的初始化过程是:
applicaiton先preinitialize,然后是各个组件依次initialize,然后是application的initialize,然后是各个组件依次creationComplete,然后是application的creationComplete,最后是applicatonComplete。
所以,我最初的代码里面把application的initialize理解成了html中body的onload了,所以在这个时候做一些对其他组件的初始化操作,包括获取leftCanvas和hdBox的大小的时候就不对了。以leftCanvas为例,这个时候它没有初始化完毕,所以其大小为0是正常的。
所以,代码要修改为:
creationComplete="init()"
即,不用applicaiton的initialize事件,而是creationComplete事件,因为这个时候,application下的组件都已经创建完毕了。这个时候它们有height和width的值了。
关于flex的事件还可以参考:http://livedocs.adobe.com/flex/2/docs/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Parts&file=00000492.html
刚看到: About startup order(http://livedocs.adobe.com/flex/3/html/help.html?content=layoutperformance_03.html),有意义,改天研究。