建立flash cs3元件(四) 編寫元件類
在上一講,我們已經決定好的元件的外觀與樣式,現在,我們要做的是規劃元件類.
使用者設定元件,靠得就是元件的方法與屬性,乙個元件應當有什麼屬性,什麼方法,這也是乙個需要仔細規劃的方面,規劃的原則當然也是以需求為先.
1.accordion元件的屬性
(1)首先,我們希望使用者可以通過乙個屬性統一設定元件的子項,這個屬性就是資料提供者,一般命名為dataprovider,這個屬性應該是乙個陣列,陣列的每個項都是乙個物件.由於我們希望使用者可以自定義圖示,所以這個物件需要有label,icon,data三個屬性,分別代表標題按鈕的標籤,圖示和對應的顯示物件.而我們還想使用元資料中的collection 標籤來方便使用者,於是,我們仿照fl.data.dataprovider類建立乙個自己的類:com.cyjb.data.childrenprovider,並建立了乙個對應的item類:com.cyjb.data.childrenprovideritem.對於這兩個類,我不做過多介紹,具體的可以自己看類**,有很詳細的注釋.
(2)其次,我們希望使用者可以檢索新增的子項個數,於是我們需要乙個length屬性.
(3)使用者當然希望知道元件的那個子項被選擇了,而且可能會想與被選擇的子項進行互動,所以我們要新增兩個屬性:selectedindex和content,分別是選擇的索引和對子項的引用.
2.accordion元件的方法
accordion元件的方法比較簡單,肯定都是用來新增或刪除子項的,所以只定義八個方法:
additem(item:object):void
additemat(item:object,index:uint):void
getitemat(index:uint):object
removeitemat(index:uint):object
removeitem(item:object):object
removeall():void
replaceitem(newitem:object,olditem:object):object
replaceitemat(newitem:object,index:uint):object
當然,方法看起來多,但是實現起來都很簡單.我們根據dataprovider屬性的改變來更改子項,所以只要把上面八個方法直接連線到childrenprovider類的相應方法中去就可以了.
3.accordion元件應該如何工作
我們用labelbutton作為標題欄按鈕,然後將所有標題欄按鈕都放在乙個sprite中,將匯入的子項放在另乙個sprite中,並利用scrollrect來設定遮罩.
因為當childrenprovider類發生更改時會廣播datachange事件,所以我們監聽這個事件,並呼叫invalidate(invalidationtype.data),使元件在下一次重新整理時一起繪製,以節約資源.
4.真正開始編寫accordion類
(1)編寫類的大致框架
首先,我們把已經規劃好的部分搭建成乙個類框架,然後再把真正的**一點點的嵌入這個框架中.
完成了的類框架
(2)元件的建構函式
在這裡,我們要初始化所有變數
public function accordion():void}
(3)configui函式
override protected function configui():void
(4)draw函式
這裡是元件的核心,需要詳細說明.
我們的元件可能發生重繪的部分是szie,styles,data,selected
當szie和hederheight,contectpadding樣式發生改變時,我們需要重新排列所有的內容.
當styles發生改變時,我們會重新繪製所有標題按鈕和重繪背景.
當data發生改變時得刪掉多餘的標題按鈕並且新建更新的標題按鈕,在這裡僅僅使用一種很簡單的演算法,雖然它比較浪費記憶體,但是我們的目的是學習元件類的編寫.
當selected發生改變時,也是重新排列標題按鈕的位置,我們會把它與szie一同考慮.
override protected function draw():void
}if (isinvalid(invalidationtype.data))
if (isinvalid(invalidationtype.size,invalidationtype.selected,invalidationtype.data))
super.draw();
}在元件類的書寫中,在任何情況下使用invalidate()而不是直接呼叫方法都是乙個好習慣,invalidate()方法可以盡可能的幫助你減少資源浪費.
在draw中,判斷invalidationtype是有順序的,盡量使工作不會重複進行.例如,在accordion中,drawheader()會設定標題按鈕的style,而updateheaderstyles()做的是同樣的工作,於是我們就先判斷invalidationtype.styles,減少浪費.
其次,是將專門幹某一項工作的一些**封裝成方法,這樣不但是**易於理解,還會方便修改.而且,如果要作為基類擴充套件的話,會大大減少子類的工作量.
還有,無論如何,更改樣式都是乙個相當浪費的事,所以盡可能的減少對style的更改.但是,如果想減少對style的更改,就需要在draw中做更多判斷,反而不利於閱讀和執行效率,這是乙個矛盾,需要仔細考慮.
(5)其它方法
對於其它的方法就不做特別的說明了,大家可以自己看類**.
基本完成的元件
到目前為止,元件幾乎已經完成了,但是,還缺少很重要的一點,也是只有元件才具有的一點特性:實時預覽.
在下一節,我會詳細的說明該如何製作乙個完美的實時預覽.
flash cs 3元件學習筆記
flash cs 元件其實跟 flash 8 的元件用法差不多,但是省去了很多監聽的一些繁瑣的東西,上次把 flash 8 的元件都看了一次 發現還有一些元件還是不錯的,但是開始學 flash cs 的元件的確說實話,記得東西還是有的,我把其中幾個公共的地方都做了一些筆記,當作是學習拉。combox...
關於Flash CS3建立Sprite型別的問題
來自 2007年五月7日 前幾天剛用上flash cs3的時候有過關於cs3建立symbol時沒有sprite型別的疑問,剛才在kirupa看到aw問到了這個問題,看了senocular的回答才明白,如果想建立sprite的話在bass class中指定為flash.display.sprite就行...
修改flash cs4元件tileList的樣式
以前多用flex的元件進行開發,今天用到了flash 中的元件,由於預設的樣式並不能讓我滿意 特別是中文字小於12px,就十分模糊看不清楚了 所以需要對flash中的元件的樣式進行修改 package tlc.additem tlc.additem tlc.additem tlc.additem t...