The NoteBook of EricKong

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks
               簡單組件一般都是現(xiàn)存 Flex 組件的子類,它們通過設(shè)置 skpins 或 styles 屬性來修改父組件的外觀,或者添加一些新的功能。比如,為 Button 控件增加一個新的事件類型,或者更改
          DataGrid 控件缺省的 styles 和 skins。
          在高級組件中,通常會執(zhí)行以下動作: 
          1.  更改已有組件的可視化外觀或者可視化特性。
          2. 創(chuàng)建復(fù)合組件,將兩個或者多個組件包裝在其中。 
          3. 通過繼承UIComponent 類來創(chuàng)建組件。
              我們通常用繼承現(xiàn)存類的方式來創(chuàng)建組件。比如,要創(chuàng)建基于 Button 的控件,我們就創(chuàng)建mx.controls.Button 類的一個子類。要開發(fā)自己的組件,則需要創(chuàng)建mx.core.UIComponent 類的子類。
          關(guān)于重載 UIComponent 類的 protected 方法
              Flex 所有的可視化組件都是UIComponent 類的子類。 因此,可視化組件繼承了 UIComponent類所定義的 methods,properties,events,styles 和 effects。
               要創(chuàng)建高級的可視化組件,必須實(shí)現(xiàn)一個構(gòu)造器(constructor)。另外要有選擇性地重載下表中 UIComponent 類的一個或者多個 protected 方法: 
              commitProperties()  提交組件所有的屬性變化。要么使屬性同時更改,要么確保屬性按照特定順序設(shè)置。 
              createChildren()       創(chuàng)建組件的子組件。
              比如,ComboBox 控件包含了一個 TextInput 控件和一個 Button 控件作為它的子組件。
              LayoutChrome()   定義 Container 類的子類容器的 border 區(qū)域。 
              measure()               設(shè)置組件的缺省 size 和缺省的最小 size。 
              updateDisplayList()   根據(jù)以前所設(shè)置的屬性和樣式來確定組件的子組件在屏幕上的大小(size)及位置(position) ,并且畫出組件所使用的所有皮膚( skins)及圖形化元素。組件的父容器負(fù)責(zé)確定組件本身大小(size)。
           
               組件的使用者不會直接調(diào)用所有這些方法。 
          關(guān)于失效(機(jī)制)的方法?
               在組件的生命周期中,應(yīng)用可能會改變組件的大小和位置,更改組件的屬性來控制組件的顯示,或者更改組件的樣式(styles)和皮膚(skin)屬性。比如,可以更改組件中所顯示的
          文本(Text )的字體(Font)大小。 作為變更字體大小工作的一部分,組件的大小也可能隨之發(fā)生變化,這就需要 Flex 去更新應(yīng)用的布局。布局操作需要Flex 調(diào)用自定義組件的commitProperties(), measure(), layoutChrome(), 以及 updateDisplayList()方法。
              應(yīng)用通過程序來更改字體大小的執(zhí)行速度大大快于 Flex 更新應(yīng)用的速度。因此,你應(yīng)該在確定最終要更改的字體之后再更新布局。 另外一個場景就是,當(dāng)你設(shè)置了組件的多個屬性后,比如 Button 控件的 label 和 icon 屬性,你肯定會想讓所有屬性被設(shè)置后一次性執(zhí)行 commitProperties(), measure(), 和 updateDisplayList()方法,而不是設(shè)置過 label 屬性后執(zhí)行一遍這些方法,然后在設(shè)置 icon屬性后又執(zhí)行一次這些方法。
              另外,可能有幾個組件同時改變了它們的字體大小。這時應(yīng)該讓 Flex 去協(xié)調(diào)布局操作,以消除任何冗余過程,而不是在每個組件更新它的字體大小之后都執(zhí)行一次布局操作。
               Flex 使用一種“失效機(jī)制(invalidation mechanism)”來同步組件的更改。Flex 用一系列方法的調(diào)用來標(biāo)記組件的某些東西已經(jīng)發(fā)生變化,并需要 Flex 去調(diào)用組件的commitProperties(), measure(), layoutChrome(),或者 updateDisplayList()方法。通過這種辦法,F(xiàn)lex 實(shí)現(xiàn)了“失效機(jī)制” 。 
              下表描述了有關(guān)“失效(invalidation)”方法: 
               invalidateProperties()   通知組件,以使下次屏幕更新時,它的commitProperties()方法能被調(diào)用。 
               invalidateSize()            通知組件,以使下次屏幕更新時,它的 measure()方法能被調(diào)用。 
               invalidateDisplayList()   通知組件,以使下次屏幕更新時它的 layoutChrome()方法和updateDisplayList()方法能被調(diào)用。
              當(dāng)組件調(diào)用一個“失效”方法,它就通知 Flex,該組件已經(jīng)被更新。當(dāng)多個組件調(diào)用失效方法,F(xiàn)lex 會協(xié)調(diào)這些更新,以使這些更新操作下一次屏幕更新時一起執(zhí)行。
              通常,組件使用者不必直接調(diào)用這些“失效”方法。這些”失效”方法被組件的 setter 方法或者組件的其他方法在需要的時候調(diào)用. 
           
          關(guān)于組件實(shí)例化的生命周期 
              組件實(shí)例化生命周期描述了用組件類創(chuàng)建組件對象時所發(fā)生的一系列步驟.作為生命周期的一部分,Flex 自動調(diào)用組件的方法,發(fā)出事件,并使組件可見。 
              下面例子用 ActionScript 創(chuàng)建一個 Button 控件,并將其加入到容器之中: 
              //創(chuàng)建一個 Box 容器。 
              var boxContainer:Box = new Box(); 
              //設(shè)置 Box 容器 
              … 
              //創(chuàng)建 Button 控件。 
              var b:Button = new Button() 
              //設(shè)置 button 控件。 
              b.label = "Submit"; 
              ... 
              // 將 Button 添加到 Box 容器中。 
              boxContainer.addChild(b); 下面的步驟顯示了用代碼創(chuàng)建一個 Button 控件,并將這個控件添加到 Box 容器中時所發(fā)生的一切: 
              1.  調(diào)用了組件的構(gòu)造函數(shù),如下面代碼所示: 
              // Create a Button control.  
              var b:Button = new Button() 
              2.  通過設(shè)置組件的屬性對組件進(jìn)行了設(shè)置,如下面代碼所示: 
              // Configure the button control. 
              b.label = "Submit"; 
              組件的 setter 方法將會調(diào)用 invalidateProperties(), invalidateSize(), 或者invalidateDisplayList() 方法. 
              3.  調(diào)用 addChild()方法將該組件添加到父組件中,如下代碼所示: 
              // Add the Button control to the Box container. 
              boxContainer.addChild(b); 
              Flex 執(zhí)行以下動作: 
              4.   將 component 的 parent 屬性設(shè)置為對父容器的引用. 
              5.  計(jì)算組件的樣式(style) 設(shè)置.  
              6.  在組件上分發(fā)preinitialize 事件.  
              7.  調(diào)用組件的createChildren() 方法.  
              8.  調(diào)用invalidateProperties(), invalidateSize()和 invalidateDisplayList()方法以觸發(fā)后續(xù)到來的,下一個“渲染事件”(render?event)期間對 commitProperties(), measure(),或 updateDisplayList()方法的調(diào)用。 
              這個規(guī)則唯一一個例外就是當(dāng)用戶設(shè)置組件的 height 和 width 屬性時, Flex 不會調(diào)用measure() 方法.  
              9.  在組件上分發(fā)initialize 事件。此時,組件所有的子組件都被初始化,但是組件沒有改更size 和處理布局。可以利用這個事件在組件布局之前執(zhí)行一些附加的處理。  
              10. 在父容器上分發(fā) childAdd 事件.  
              11. 在父容器上分發(fā)initialize 事件.  12. 在下一個“渲染事件”(render?event)中, Flex 執(zhí)行以下動作:  
              a.  調(diào)用組件的 commitProperties()方法.  
              b.  調(diào)用組件的 measure()方法.  
              c.  調(diào)用組件的 layoutChrome()方法.  
              d.  調(diào)用組件的 updateDisplayList()方法.  
              e.  在組件上分發(fā) updateComplete 事件.  
              13. 如果commitProperties(), measure()或者 updateDisplayList()方法調(diào)用了 invalidateProperties(), invalidateSize(),或 invalidateDisplayList()方法,則 Flexh 會分發(fā)另外一個 render 事件. 
              14. 在最后的render 事件發(fā)生后, Flex 執(zhí)行以下動作:  
              a.  通過設(shè)置組件的 visible 屬性使組件變?yōu)榭梢? 
              b.  在組件上分發(fā) creationComplete 事件.組件的大小(size)和布局被確定.這個事件只在組件創(chuàng)建時分發(fā)一次.  
              c.  在組件上分發(fā) updateComplete 事件.無論什么時候,只要組件的布局(layout),位置,大小或其它可視的屬性發(fā)生變化就會分發(fā)這事件,然后組件被更新,以使組件能夠被正確地顯示. 
              當(dāng)使用 addChild()方法將組件添加到容器中時,大部分工作都是為了設(shè)置這個組件.這是因?yàn)橹钡桨呀M件添加到容器中時,Flex 才能確定它的大小(size),設(shè)置它所繼承樣式(style)屬性,或者在屏幕上畫出它. 也可以用 MXML,在應(yīng)用中完成上面的組件添加動作,如下面的例子所示:
          <mx:Application xmlns:mx="    <mx:Box>
                  <mx:Button label="Submit"/>
              </mx:Box>
          </mx:Application> 
              在 MXML 中創(chuàng)建組件時,F(xiàn)lex 執(zhí)行的步驟順序同用 ActionScript 的步驟順序相同. 使用 removeChild() 方法可將組件從容器中移出, 如果對這個組件再沒有其他的引用,那就相當(dāng)于使用 Adobe Flash  Player 或 Adobe AIR 的垃圾回收機(jī)制將組件從內(nèi)存中刪除. 關(guān)于創(chuàng)建組件的步驟 
              為了實(shí)現(xiàn)一個組件,就要重載組件的方法,定義新的屬性,分發(fā)新的事件,或者執(zhí)行其他任何應(yīng)用所需的自定義的邏輯.要想實(shí)現(xiàn)自己的組件, 請遵循以下這些常規(guī)步驟: 
              1.  如果有必要,為組件創(chuàng)建所有的皮膚(skins) . 
              2.  創(chuàng)建 ActionScript 類文件. 
              a.  從一個基類擴(kuò)展,比如 UIComponent 或者其他的組件類. 
              b.  指定使用者能夠通過 MXML 標(biāo)記進(jìn)行設(shè)置的屬性. 
              c.  嵌入(Embed)所有的圖片和皮膚文件. 
              d.  實(shí)現(xiàn)構(gòu)造器. 
              e.  實(shí)現(xiàn) UIComponent.createChildren()方法.  
              f.  實(shí)現(xiàn) UIComponent.commitProperties() 方法.  
              g.  實(shí)現(xiàn) UIComponent.measure() 方法.  
              h.  實(shí)現(xiàn) UIComponent.layoutChrome() 方法.  
              i.   實(shí)現(xiàn) UIComponent.updateDisplayList() 方法.  
              j.  增加屬性(properties),方法(methods),樣式(styles),事件 (events)以及元數(shù)據(jù). 
              3.  以 ActionScript 文件或者 SWC 文件的形式部署組件. 
               定義新組件時不一定要重載所有的方法.只需要重載實(shí)現(xiàn)組件功能所需的方法.如果創(chuàng)建現(xiàn)存組件的子類,比如 Button 控件或者 VBox 容器,那么必須實(shí)現(xiàn)組件中所添加的新功能所需
          的方法. 
              例如:實(shí)現(xiàn)一個自定義的 Button 控件,該控件使用新的機(jī)制來定義缺省大小(size) .在這種情況下,只需要重載 measure()方法.對于這個例子,參見實(shí)現(xiàn) easure() 方法.
          或者,要實(shí)現(xiàn) VBox 容器的一個新子類.新子類利用 VBox 類已有的所有有關(guān)設(shè)定大小(sizing)的邏輯,但是變更了 VBox 類的布局邏輯以實(shí)現(xiàn)從底部到頂部的方式來布局容器中的
          子控件,而不是自頂向下的布局.在這種情況下,只需要重載updateDisplayList()方法.關(guān)于這個例子,見實(shí)現(xiàn) updateDisplayList()方法.
           
          關(guān)于接口 

              Flex 用接口將組件的基本功能分為離散的單元, 這使得它們可以被 “一塊一塊” 地實(shí)現(xiàn). 例如,使組件可聚焦(有輸入焦點(diǎn)) ,它必須實(shí)現(xiàn) IFocusable 接口;要使它能夠參與布局過程,它必須實(shí)現(xiàn) ILayoutClient 接口. 為了簡化接口的使用, UIComponent 類實(shí)現(xiàn)了下表中定義的所有接口,但是不包括IFocusManagerComponent 接口和 IToolTipManagerClient 接口.但 UIComponent 很多子類實(shí)現(xiàn)了 IFocusManagerComponent 和 IToolTipManagerClient 接口. 
              因此,創(chuàng)建 UIComponent 或其子類的子類,就不必實(shí)現(xiàn)這些接口.但是,如果要創(chuàng)建的組件不是 UIComponent 的子類,并且還想在 Flex 中使用這個組件,那么就必須實(shí)現(xiàn)一個或者多個接口。 
              注意:對于 Flex, Adobe 建議所有的組件都應(yīng)從 UIComponent 及其子類繼承. 
              下表列出了 Flex components 所實(shí)現(xiàn)的主要接口:  
              接口                                                           用途 
              IChildList                                                    表明容器中子控件的數(shù)量. 
              IDeferredInstantiationUIComponent              表明組件或組件能實(shí)施延遲實(shí)例化. 
              IFlexDisplayObject                                       指定皮膚元素的接口. 
              IFocusManagerComponent                           表明組件或者對象是可聚焦的,這意味著組件可以從 FocusManager 獲取焦點(diǎn). 
              UIComponent                                             組件沒有實(shí)現(xiàn) Ifocusable 接口,因?yàn)橛行┙M件不打算接受焦點(diǎn). 
              IInvalidating                                               表明組件或者對象能夠使用”失效機(jī)制”去執(zhí)行延遲的,而不是立即的屬性提交( commitment), 度量(measurement), 以及畫出(drawing) 或布局( layout). 
              ILayoutManagerClient                                  表明組件或者對象能夠參與 LayoutManager 的提交(commit) ,度量(measure)和更新次序(update sequence)  
              IPropertyChangeNotifier                               表明組件支持特定形式的事件傳播. 
              IRepeaterClient                                           表明組件或者對象能夠被用于 Repeater 類. 
              IStyleClient                                                 表明組件能夠從其他的對象繼承樣式,并且支持setStyle() 和 getStyle() 方法. 
              IToolTipManagerClient                                  表明組件有一個 toolTip 屬性,并且因此可以被ToolTipManager 所監(jiān)控. 
              IUIComponent                                            定義組件能夠成為布局管理器或列表的子組件所必須實(shí)現(xiàn)的基本 APIs.
              IValidatorListener                                       表明組件能夠監(jiān)聽校驗(yàn)(validation)事件,并且因此能夠顯示校驗(yàn)狀態(tài),比如一個紅色邊框和顯示
          校驗(yàn)錯誤的提示信息(tooltips)
          主站蜘蛛池模板: 曲水县| 晋城| 饶河县| 上林县| 通海县| 兴义市| 竹溪县| 深泽县| 团风县| 革吉县| 七台河市| 梁平县| 克东县| 荣昌县| 河池市| 温泉县| 通渭县| 孟村| 游戏| 抚顺市| 鄂托克前旗| 平舆县| 开平市| 桐城市| 巴东县| 额尔古纳市| 昌邑市| 大洼县| 通海县| 桐城市| 石屏县| 漳浦县| 皋兰县| 吉安县| 贵定县| 丰镇市| 长岛县| 中西区| 藁城市| 长丰县| 濮阳县|