<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    The NoteBook of EricKong

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

        Flex 用接口將組件的基本功能分為離散的單元, 這使得它們可以被 “一塊一塊” 地實現. 例如,使組件可聚焦(有輸入焦點) ,它必須實現 IFocusable 接口;要使它能夠參與布局過程,它必須實現 ILayoutClient 接口. 為了簡化接口的使用, UIComponent 類實現了下表中定義的所有接口,但是不包括IFocusManagerComponent 接口和 IToolTipManagerClient 接口.但 UIComponent 很多子類實現了 IFocusManagerComponent 和 IToolTipManagerClient 接口. 
        因此,創建 UIComponent 或其子類的子類,就不必實現這些接口.但是,如果要創建的組件不是 UIComponent 的子類,并且還想在 Flex 中使用這個組件,那么就必須實現一個或者多個接口。 
        注意:對于 Flex, Adobe 建議所有的組件都應從 UIComponent 及其子類繼承. 
        下表列出了 Flex components 所實現的主要接口:  
        接口                                                           用途 
        IChildList                                                    表明容器中子控件的數量. 
        IDeferredInstantiationUIComponent              表明組件或組件能實施延遲實例化. 
        IFlexDisplayObject                                       指定皮膚元素的接口. 
        IFocusManagerComponent                           表明組件或者對象是可聚焦的,這意味著組件可以從 FocusManager 獲取焦點. 
        UIComponent                                             組件沒有實現 Ifocusable 接口,因為有些組件不打算接受焦點. 
        IInvalidating                                               表明組件或者對象能夠使用”失效機制”去執行延遲的,而不是立即的屬性提交( commitment), 度量(measurement), 以及畫出(drawing) 或布局( layout). 
        ILayoutManagerClient                                  表明組件或者對象能夠參與 LayoutManager 的提交(commit) ,度量(measure)和更新次序(update sequence)  
        IPropertyChangeNotifier                               表明組件支持特定形式的事件傳播. 
        IRepeaterClient                                           表明組件或者對象能夠被用于 Repeater 類. 
        IStyleClient                                                 表明組件能夠從其他的對象繼承樣式,并且支持setStyle() 和 getStyle() 方法. 
        IToolTipManagerClient                                  表明組件有一個 toolTip 屬性,并且因此可以被ToolTipManager 所監控. 
        IUIComponent                                            定義組件能夠成為布局管理器或列表的子組件所必須實現的基本 APIs.
        IValidatorListener                                       表明組件能夠監聽校驗(validation)事件,并且因此能夠顯示校驗狀態,比如一個紅色邊框和顯示
    校驗錯誤的提示信息(tooltips)
    主站蜘蛛池模板: 亚洲午夜理论片在线观看| 国产亚洲精品成人a v小说| 亚洲精品福利视频| 国产高潮久久免费观看| 好大好硬好爽免费视频| 亚洲乱码一区av春药高潮| 8x8×在线永久免费视频| 亚洲女同成av人片在线观看| 国产大片免费天天看| 伊人久久精品亚洲午夜| 永久免费AV无码网站国产| 久久精品国产亚洲网站| 色猫咪免费人成网站在线观看| 亚洲熟妇无码另类久久久| 你是我的城池营垒免费观看完整版| 国产精品亚洲产品一区二区三区| eeuss免费影院| 久久精品亚洲综合一品| 国产成人无码免费看视频软件| 中文字幕 亚洲 有码 在线| 国产又大又粗又硬又长免费 | 男人都懂www深夜免费网站| 久久精品国产亚洲AV电影| 女人与禽交视频免费看| 黄页网址大全免费观看12网站| 亚洲一区无码中文字幕| 1000部啪啪未满十八勿入免费| 亚洲人成电影网站久久| 亚洲精品和日本精品| 久久久精品2019免费观看| 亚洲日韩看片无码电影| 国产av无码专区亚洲av桃花庵| 好爽…又高潮了免费毛片| 在线观看片免费人成视频播放| 456亚洲人成影院在线观| 久久久久亚洲AV无码专区桃色| 免费做爰猛烈吃奶摸视频在线观看 | 亚洲1区1区3区4区产品乱码芒果| 国产片免费在线观看| 无码囯产精品一区二区免费| 久久亚洲精品高潮综合色a片|