Drawable在我們平時(shí)的開(kāi)發(fā)中旱爆,基本都會(huì)用到撩银。但它到底是什么呢?引用代碼的里面注釋:
能夠在canvas上繪制的一個(gè)東西茫藏。而且相比于View民鼓,并不需要measure薇芝,layout,僅僅只要去考慮如何draw丰嘉。
1 自定義Drawable時(shí)候夯到,相比View來(lái)說(shuō),它屬于輕量級(jí)的饮亏,使用也簡(jiǎn)單耍贾,以后當(dāng)我們自定義一個(gè)效果的時(shí)候,可以改變一下思想路幸,在考慮自定義View的時(shí)候荐开,也考慮下自定義Drawable能不能實(shí)現(xiàn)需要的效果。
2 它是一個(gè)抽象類简肴,它僅僅是處理可以畫(huà)的東西晃听,不像View,她沒(méi)有接收事件跟用戶交互的機(jī)制砰识。
3 圖片作為 View 的背景能扒,減少 apk 的體積(減少 apk 體積最明顯最有效的步驟就是去掉圖片)
4 圖片耗內(nèi)存,使用 Drawable 節(jié)省內(nèi)存辫狼,Android 本身對(duì) Drawable 做了很好的優(yōu)化(內(nèi)存優(yōu)化需要考慮)
一般情況下初斑,除了直接使用放在Drawable下的圖片,其實(shí)的Drawable的用法都和xml有關(guān)膨处,我們可以使用shape见秤,layer-list等標(biāo)簽繪制一些背景砂竖,還可以通過(guò)selector標(biāo)簽實(shí)現(xiàn)View的狀態(tài)效果,當(dāng)然我們自己也還是可以自定義Drawable狀態(tài)的鹃答。
我們的每個(gè)標(biāo)簽都對(duì)應(yīng)于一個(gè)真正的實(shí)體類乎澄,關(guān)系如下:
下面我們來(lái)自定義Drawable來(lái)實(shí)現(xiàn)圓角圖片,圓形圖片挣跋。而且更加簡(jiǎn)單三圆,高效,使用范圍更廣(可以作為任何View的背景)避咆。
核心代碼就是:
canvas.drawRoundRect(mRectF, 100, 100, mPaint);
mRectF是在setBounds方法里面賦值的舟肉,mPaint是在構(gòu)造方法里面通過(guò)BitmapShader構(gòu)造賦值的。
當(dāng)自定義圓形Drawable的寫(xiě)法:
核心代碼就是canvas.drawCircle(mWidth /2, mWidth /2, mWidth /2, mPaint);
mWidth取的是圖片寬高最小的那個(gè)查库,mPaint就是構(gòu)造方法使用BitmapShader賦值的路媚,BitmapShader又是通過(guò)當(dāng)我們使用drawable時(shí)候傳bitmap過(guò)去創(chuàng)建的。
總結(jié):本篇主要是想學(xué)習(xí)自定義Drawable樊销,學(xué)會(huì)自定義drawable整慎,有時(shí)在自定義View時(shí)候有這么個(gè)意識(shí),我們代碼會(huì)寫(xiě)的更加優(yōu)雅围苫。