實(shí)例講解Android自定義控件
小編在此之前給大家介紹過(guò)關(guān)于Android自定義控件的用法等,需要的可以參考下:

可以看到QQ上的ToolBar其實(shí)就是一個(gè)自定義的view,可以看到不同的界面就是簡(jiǎn)單地修改了文字而已,在第二張與第三張尤其的明顯,我們就仿QQ的這個(gè)Toolbar設(shè)置一個(gè)自定義控件
在開(kāi)始之前,首先了解一下官方是如何實(shí)現(xiàn)一個(gè)控件的,比如說(shuō)一個(gè)Linearlayout

它不是有l(wèi)ayout_width和layout_height這兩個(gè)屬性嗎?其實(shí),這兩個(gè)屬性就是官方定義的

官方的操作其實(shí)就是繼承了一個(gè)ViewGroup,Linearlayout相當(dāng)于一個(gè)自定義View,其中的方法我們也不用深究,我們打開(kāi)Path的那個(gè)路徑,可以找到一個(gè)atts.xml文件,打開(kāi)我們可以在里面看到定義了Linearlayout關(guān)于layout的屬性,有l(wèi)ayout_width和layout_height這幾個(gè)屬性,看到這里我們也就明白了我們?cè)诓季治募幸靡褂玫膶傩?/p>
正文開(kāi)始,我們講解一個(gè)自定義控件的步驟:
1.設(shè)計(jì)需要使用的屬性
先將模式切換為project模式

新建一個(gè)moudle


修改相關(guān)包名,庫(kù)名


這里選擇第一個(gè),也就是不創(chuàng)建activity界面,之后點(diǎn)擊finish就完成了
依次展開(kāi)Topbar->res->values,在values創(chuàng)建一個(gè)atts.xml文件

xml文件代碼如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="Topbar">
<attr name="title" format="string"/>
<attr name="titleTextSize" format="dimension"/>
<attr name="titleTextColor" format="color"/>
<attr name="leftTextColor" format="color"/>
<attr name="leftBackgroud" format="reference|color"/>
<attr name="leftText" format="string"/>
<attr name="rightTextColor" format="color"/>
<attr name="rightBackgroud" format="reference|color"/>
<attr name="rightText" format="string"/>
</declare-styleable>
</resources>
深入理解可以看看這一篇 http://blog.csdn.net/zjh_1110120/article/details/50976027
2.實(shí)現(xiàn)一個(gè)我們需要的控件
在topbar的java文件夾,新建一個(gè)Topbar類(lèi),使其繼承RelativeLayout

之后,重寫(xiě)其中帶有兩個(gè)參數(shù)的構(gòu)造方法,Attributeset這個(gè)類(lèi)是用來(lái)存放之前定義在xml文件中的各種屬性

之后,創(chuàng)建一個(gè)TypedArray類(lèi)的對(duì)象ta,調(diào)用context的obtainStyleAttribute方法,獲取剛才我們創(chuàng)建的atts.xml中的各類(lèi)屬性,第二個(gè)參數(shù)Topbar就是上文atts.xml中定義<declare-styleable name="Topbar">

之后,便是可以使用TypedArray類(lèi)中的getxx方法來(lái)取得xml中定義的相關(guān)屬性,Topbar與atts.xml中定義的屬性使用下劃線連接
可以看到有些第二個(gè)參數(shù)為0,意思就是如果在布局文件沒(méi)有給控件的屬性沒(méi)有設(shè)置屬性值,就默認(rèn)為0

還要記得最后需要回收
之后獲得之前的屬性值,以此設(shè)置相關(guān)屬性

這里呢,當(dāng)我們?cè)诓季治募惺褂昧诉@個(gè)自定義控件的屬性時(shí)候,這個(gè)類(lèi)就會(huì)獲得我們所輸入的屬性值,之后調(diào)用上述方法進(jìn)行設(shè)置
到這一步之后,我們還需要將左右button與標(biāo)題textview放在一個(gè)View中,使用LayoutPram的addview方法添加到VIew中
首先聲明三個(gè)LayoutPram

進(jìn)行寬高設(shè)置之后,使用addView添加到View當(dāng)中

到這一步,布局就是完成了,但是還要實(shí)現(xiàn)左右button的點(diǎn)擊事件,直接設(shè)置一個(gè)點(diǎn)擊的監(jiān)聽(tīng)器就是完成了

但是,這不是我們想要的模板,模板的話,是應(yīng)該直接在activity中設(shè)置監(jiān)聽(tīng)器不是更為快捷,而不應(yīng)該是在控件這里寫(xiě)相關(guān)的事件處理,所以,我們得使用接口回調(diào)機(jī)制
仿照button設(shè)置監(jiān)聽(tīng)器的方法,我們可以定義一個(gè)接口類(lèi)topbarClickListener,在其中聲明兩個(gè)方法,對(duì)應(yīng)左按鈕的點(diǎn)擊與右按鈕的點(diǎn)擊事件,之后,聲明一個(gè)接口類(lèi)對(duì)象listener,創(chuàng)建一個(gè)setOnTopbarClickListener方法,在其中將參數(shù)傳給之前聲明的listener

之后,修改左右button的點(diǎn)擊事件,使其調(diào)用接口里的方法,這樣就是完成了

三、引用我們的控件
引用就是像使用button那樣引用,進(jìn)行屬性的相關(guān)賦值,就如同我們使用button,textview等控件的屬性一樣

這里可以看到,有個(gè)cus,類(lèi)似我們使用的android,像系統(tǒng)定義的button等控件,我們?cè)O(shè)置它的屬性都是需要寫(xiě)上android,之前有一句xmlns:android=http://schemas.android.com/apk/res/android
這就是說(shuō)明使用的android本身的控件屬性,android這個(gè)相當(dāng)于一個(gè)名字,我們可以隨便寫(xiě),之后將后面的改為res-auto,之后使用我們的自定義屬性就是以我們之前寫(xiě)的名字為前綴,就如我圖中那樣
其中cus可以任意指定,但不能與系統(tǒng)的命名空間相同,在android studio中如上 用res-auto,在eclipse中res后需要完整的包名
右邊的預(yù)覽圖大家也可以看到實(shí)際的效果
大家在學(xué)習(xí)后如果有什么心得體會(huì)可以在下方直接給我們留言。
- android自定義控件ImageView實(shí)現(xiàn)圓形圖片
- Android自定義控件ImageView實(shí)現(xiàn)點(diǎn)擊之后出現(xiàn)陰影效果
- Android自定義控件ViewFipper實(shí)現(xiàn)豎直跑馬燈效果
- Android自定義控件打造絢麗平行空間引導(dǎo)頁(yè)
- Android自定義控件EditText實(shí)現(xiàn)清除和抖動(dòng)功能
- Android自定義控件EditText使用詳解
- Android自定義控件實(shí)現(xiàn)下拉刷新效果
- 基于Android自定義控件實(shí)現(xiàn)雷達(dá)效果
- Android編程實(shí)現(xiàn)自定義控件的方法示例
- Android自定義控件之日期選擇控件使用詳解
- Android自定義控件實(shí)現(xiàn)九宮格解鎖功能
相關(guān)文章
Android 使用<layer-list>實(shí)現(xiàn)微信聊天輸入框功能
<layer-list> 標(biāo)簽可以設(shè)置LayerDrawable,一種有層次的Drawable疊加效果,<layer-list> 可以包含多個(gè) <item>標(biāo)簽。這篇文章主要介紹了Android 使用<layer-list>實(shí)現(xiàn)微信聊天輸入框,需要的朋友可以參考下2017-05-05
深入理解Android熱修復(fù)技術(shù)原理之so庫(kù)熱修復(fù)技術(shù)
通常情況下,大多數(shù)人希望android下熱補(bǔ)丁方案能夠做到補(bǔ)丁的全方位修復(fù),包括類(lèi)修復(fù)/資源修復(fù)/so庫(kù)的修復(fù)。 這里主要介紹熱補(bǔ)丁之so庫(kù)修復(fù)思路2021-06-06
Android自定義控件實(shí)現(xiàn)icon+文字的多種效果
這篇文章主要為大家詳細(xì)介紹了Android自定義控件實(shí)現(xiàn)icon+文字的多種效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
unity3d發(fā)布apk在android虛擬機(jī)中運(yùn)行的詳細(xì)步驟(unity3d導(dǎo)出android apk)
這篇文章主要介紹了unity3d發(fā)布apk在android虛擬機(jī)中運(yùn)行的詳細(xì)步驟,需要的朋友可以參考下2014-05-05
Android自定義控件ImageView實(shí)現(xiàn)點(diǎn)擊之后出現(xiàn)陰影效果
這篇文章主要為大家詳細(xì)介紹了Android自定義控件ImageView實(shí)現(xiàn)點(diǎn)擊之后有陰影效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
Android布局加載之LayoutInflater示例詳解
這篇文章主要介紹了Android布局加載之LayoutInflater的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考借鑒價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-03-03
Android WebView的使用方法及與JS 相互調(diào)用
這篇文章主要介紹了Android WebView的使用方法及與JS 相互調(diào)用的相關(guān)資料,WebView 是 Android 中一個(gè)非常實(shí)用的組​件, WebView 可以使得網(wǎng)頁(yè)輕松的內(nèi)嵌到app里,還可以直接跟js相互調(diào)用,需要的朋友可以參考下2017-07-07
利用Jetpack?Compose實(shí)現(xiàn)繪制五角星效果
這篇文章主要為大家介紹了Jetpack?Compose如何使用自定義操作符實(shí)現(xiàn)繪制五角星效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-04-04
Flutter實(shí)戰(zhàn)教程之酷炫的開(kāi)關(guān)動(dòng)畫(huà)效果
這篇文章主要給大家介紹了關(guān)于Flutter實(shí)戰(zhàn)教程之酷炫的開(kāi)關(guān)動(dòng)畫(huà)效果的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Android中使用GridView實(shí)現(xiàn)仿微信圖片上傳功能(附源代碼)
由于工作要求最近在使用GridView完成圖片的批量上傳功能,我的例子當(dāng)中包含仿微信圖片上傳、拍照、本地選擇、相片裁剪等功能,如果有需要的朋友可以看一下2017-08-08

