周末在家想著這周寫點(diǎn)什么好呢玛追,轉(zhuǎn)眼拿起手機(jī)找點(diǎn)靈感披诗,這個(gè)時(shí)候打開兩款軟件
似乎現(xiàn)在國內(nèi)主流的app框架中對于top欄的樣式是千篇一律,左邊占一塊區(qū)域宰缤,中間顯示當(dāng)前頁面的標(biāo)題颂翼,右邊再占一塊區(qū)域用于跳轉(zhuǎn)晃洒。可能在有的項(xiàng)目中這種top欄實(shí)現(xiàn)的方式選擇寫一個(gè)通用的layout寫死疚鲤,然后在需要用到的布局中include一下锥累,當(dāng)然這種實(shí)現(xiàn)方式?jīng)]有問題,但是卻顯得不是那么的高大上集歇。今天咱們就結(jié)合自定義view來手?jǐn)]一個(gè)通用的top欄桶略。
1.1 自定義屬性
?給一個(gè)自定義view設(shè)置自定義屬性很簡單,只要在res資源文件目錄的values目錄下創(chuàng)建一個(gè)attrs.xml屬性即可诲宇。截圖如下:
考慮到top欄包括:左標(biāo)題名稱际歼,左標(biāo)題文字顏色,左標(biāo)題背景姑蓝,中間標(biāo)題名稱鹅心,中間標(biāo)題文字大小,中間標(biāo)題顏色纺荧,右標(biāo)題文字名稱旭愧,右標(biāo)題文字顏色,右標(biāo)題背景宙暇,所以創(chuàng)建的attrs文件中應(yīng)該包括如下屬性:
這樣我們就成功的在attrs.xml中<declare-styleable>節(jié)點(diǎn)下定義了一個(gè)叫TopBar自定義屬性输枯。這里我在最后一行加了標(biāo)記,這里說明一下占贫,左右背景既可以是顏色桃熄,也可以引用的背景圖片,所以用“|”來分隔不同的屬性型奥。
2.1 自定義view
在確定好TopBar所包含的各個(gè)屬性后瞳收,我們就要開始寫我們這個(gè)控件了,因?yàn)槲覀兊臉?biāo)題欄包含很多控件厢汹,所以它應(yīng)該繼承自ViewGroup,這里為了實(shí)現(xiàn)簡單螟深,我們讓它繼承RelativeLayout。代碼如下:
這樣就取得了我們在attrs.xml在布局文件中設(shè)置的屬性烫葬,注意我標(biāo)記的兩條數(shù)據(jù)
這里需要注意的事addView時(shí)給子控件增加的布局約束
3.1 為TopBar中控件增加點(diǎn)擊事件
為了讓調(diào)用者可以實(shí)現(xiàn)不同的點(diǎn)擊事件界弧,所以事件的點(diǎn)擊事件不能在TopBar控件中寫死,這時(shí)候我們就要考慮使用接口回調(diào)了厘灼。
??? 3.1.1 創(chuàng)建內(nèi)部接口
??????? 在TopBar中定義左右點(diǎn)擊事件接口夹纫,分別響應(yīng)不同的事件:
????? 3.1.2 響應(yīng)點(diǎn)擊事件
4.1 布局引用
萬事俱備咽瓷,只欠東風(fēng)设凹,下面就到實(shí)戰(zhàn)環(huán)節(jié)了!
這里我標(biāo)記了一條布局引用茅姜,注意這里用到自定義控件時(shí)需要加入引用空間聲明闪朱,這里如果不用res-auto也可以換成程序的包名月匣。
下面在MainActivity中取得這個(gè)控件,并且響應(yīng)點(diǎn)擊事件如下:
到這里這個(gè)TopBar的自定義viewGrop就結(jié)束了~謝謝大家支持奋姿!放下軟件最后運(yùn)行截圖:
需要源碼的歡迎加我微信