自定義組件相信在面試過(guò)程中會(huì)經(jīng)常被問(wèn)到自定義組件相關(guān)問(wèn)題,最近總結(jié)了下自定義View的方式;
總結(jié)來(lái)說(shuō)黔漂,自定義控件的實(shí)現(xiàn)有三種方式诫尽,分別是:組合控件、自繪控件和繼承控件炬守。下面將分別對(duì)這三種方式進(jìn)行介紹牧嫉。
(一)組合控件:
像平常項(xiàng)目中攀例,我們會(huì)經(jīng)常自定義一個(gè)ToolBar, 多個(gè)頁(yè)面都會(huì)需要這個(gè)標(biāo)題欄趴梢,為了讓代碼復(fù)用性更強(qiáng),一般會(huì)自定義一個(gè)ToolBar;
帶著問(wèn)題程储,我們會(huì)想到在繼承View的構(gòu)造函數(shù)中 有個(gè)AttributeSet這個(gè)屬性鳍置,沒(méi)錯(cuò)? 這就是 突破口辽剧。
我們可以在attrs.xml中聲明自己控件的屬性,在布局xml文檔中聲明自己的命名空間税产,這時(shí)就可以對(duì)設(shè)置自己想要的值了怕轿,然后在AttributeSet這個(gè)屬性中獲取對(duì)應(yīng)的值。好了不多說(shuō)砖第,我們來(lái)看下代碼撤卢,一切盡在不言中:
第一步:
在/res/values下編寫一個(gè)attrs.xml的文件,其中內(nèi)容結(jié)構(gòu)如下:
第二步:
自定義ToolBar梧兼,在構(gòu)造方法中通過(guò)AttributeSet這個(gè)屬性中獲取對(duì)應(yīng)的值放吩。
final TypedArray a =context.obtainStyledAttributes(attrs,R.styleable.MyToolbar,0,0);遍歷這個(gè)返回的TypedArray然后進(jìn)行獲取定義好的屬性值;
不要忘記添加 xmlns:app="http://schemas.android.com/apk/res-auto"羽杰,然后就可以直接在自定義view中直接描述定義的屬性渡紫,入標(biāo)題,右邊按鈕的名字等考赛;
在自定義ToolBar中可以實(shí)現(xiàn)一些方法惕澎,入按鈕的事件監(jiān)聽(tīng),設(shè)置標(biāo)題文本的方法:
(一)自繪控件:
自繪控件的內(nèi)容都是自己繪制出來(lái)的颜骤,在View的onDraw方法中完成繪制唧喉。下面就實(shí)現(xiàn)一個(gè)簡(jiǎn)單的計(jì)數(shù)器,每點(diǎn)擊它一次忍抽,計(jì)數(shù)值就加1并顯示出來(lái)八孝。
1、創(chuàng)建CounterView類鸠项,繼承自View干跛,實(shí)現(xiàn)OnClickListener接口:
(三)繼承控件:
就是繼承已有的控件,創(chuàng)建新控件祟绊,保留繼承的父控件的特性楼入,并且還可以引入新特性哥捕。下面就以支持橫向滑動(dòng)刪除列表項(xiàng)的自定義ListView的實(shí)現(xiàn)來(lái)介紹。
創(chuàng)建CustomListView類嘉熊,繼承自ListView遥赚,并實(shí)現(xiàn)了OnTouchListener和OnGestureListener接口: