優(yōu)點(diǎn):使用簡單缘圈,比自定義View的成本低穿香;非圖片類型的Drawable占用空間較小茧吊,這對減小apk的大小也有很大的幫助
一贞岭、Drawable的簡介
在Android的設(shè)計(jì)中,Drawable是一個(gè)抽象類搓侄,它是所有Drawable對象的基類瞄桨,每個(gè)具體的Drawable都是它的子類。
Drawable的內(nèi)部寬高這個(gè)參數(shù)比較重要讶踪,通過getIntrinsicWidth和getIntrinsicHeight這兩個(gè)方法可以獲取到它們芯侥。
二、Drawable的分類
2.1 BitmapDrawable
表示一張圖片乳讥,可通過xml的方式來描述它
android:src——圖片的資源id
android:antialias——是否開啟圖片抗鋸齒功能柱查,開啟后會(huì)讓圖片變得平滑,同時(shí)也會(huì)在一定程度上降低圖片的清晰度
android:dither——是否開啟抖動(dòng)效果云石,當(dāng)圖片的像素配置和手機(jī)屏幕的像素配置不一致時(shí)唉工,開啟這個(gè)選項(xiàng)可以讓高質(zhì)量的圖片在低質(zhì)量的屏幕上還能保持很好的顯示效果
android:filter——是否開啟過濾功能,當(dāng)圖片尺寸被拉伸或者壓縮時(shí)汹忠,開啟過濾效果可以保持較好的顯示效果
android:gravity——但圖片小于容器的尺寸時(shí)淋硝,設(shè)置此選項(xiàng)可以對圖片進(jìn)行定位。
android:mipMap——這是一種圖像相關(guān)的處理技術(shù)宽菜,也叫紋理映射谣膳,比較抽象,默認(rèn)值為false
android:tileMap——平鋪模式铅乡,有四種模式:disabled继谚、clamp、repeat和mirror
disabled:關(guān)閉平鋪模式
repeat:簡單的水平和豎直方向上的平鋪效果
mirror:表示一種在水平和豎直方向上的鏡面投影效果
clamp:表示的效果更佳奇特阵幸,圖片四周的像素會(huì)擴(kuò)展到周圍區(qū)域
2.2 ShapeDrawable
通過顏色來構(gòu)造的圖形花履,既可以是純色的圖形,也可以是具有漸變的圖形
android:shape——表示圖形的形狀挚赊,有四個(gè)屬性值:rectangle(矩形)臭挽、oval(橢圓)、line(橫線)和ring(圓環(huán))咬腕。默認(rèn)值是矩形欢峰,其中l(wèi)ine和ring必須通過stroke標(biāo)簽來指定線的寬度和顏色等信息
corners——表示shape的四個(gè)角的角度,只適用于矩形shape涨共,這里的角度是指圓形的程度纽帖,用px來表示,有如下5個(gè)屬性:
android:radius——為四個(gè)角同時(shí)設(shè)定相同的角度举反,優(yōu)先級較低懊直,會(huì)被其他四個(gè)屬性覆蓋
android:topLeftRadius——設(shè)定左上角的角度
android:topRightRadius——設(shè)定右上角的角度
android:bottomLeftRadius——設(shè)定左下角的角度
android:bottomRightRadius——設(shè)定右下角的角度
gradient——與solid標(biāo)簽互斥,其中solid表示純色填充火鼻,而gradient則表示漸變效果室囊,gradient又如下幾個(gè)屬性:
android:angle——漸變的角度雕崩,默認(rèn)為0,其值必須為45的倍數(shù)融撞,0表示從左到右盼铁,90表示從上到下,其他的效果自行體驗(yàn)
android:centerX——漸變的中心點(diǎn)的橫坐標(biāo)
android:centerY——簡便的中心點(diǎn)的縱坐標(biāo)
android:startColor——漸變的起始色
android:centerColor——漸變的結(jié)束色
android:gradientRadius——漸變半徑尝偎,僅當(dāng)android:type=“radial”時(shí)有效
android:useLevel——一般為false饶火,當(dāng)Drawable作為StateListDrawable使用時(shí)為true
android:tyoe——漸變的類別,有l(wèi)inear(線性漸變)致扯、radial(徑向漸變)肤寝、sweep(掃描線漸變)三種,其中默認(rèn)值為線性漸變
solid——表示純色填充抖僵,通過android:color可指定shape中填充的顏色
stroke——shape的描邊
android:width——描邊的寬度鲤看,越大則shape的邊緣線會(huì)越粗
android:color——描邊的顏色
android:dashWidth——組成虛線的線段的寬度
android:dashGap——組成虛線的線段之間的間隔,間隔越大則虛線看起開空隙就越大
padding——這個(gè)表示空白耍群,表示的是包含它的view的空白
size——shape的大小
android:width——表示shape的寬
android:height——表示shape的高
2.3 LayerDrawable
LayerDrawable對應(yīng)的XML標(biāo)簽是<layer-list>刨摩,表示一種層次化的Drawable集合,通過將不同的Drawable放置在不同層上面從而達(dá)到一種疊加后的效果
一個(gè)layer-list中可以包含多個(gè)item世吨,每個(gè)item表示一個(gè)Drawable澡刹。
常用屬性:android:top、android:bottom耘婚、android:left和android:right罢浇,分別表示Drawable相對于view的上下左右的偏移量,單位為像素沐祷∪卤眨可通過drawable屬性來直接引用一個(gè)已有的資源。
2.4 StateListDrawable
StatelistDrawable對應(yīng)于<selector>標(biāo)簽赖临,它也是表示Drawable集合胞锰,每個(gè)Drawable都對應(yīng)著View的一種狀態(tài),這樣系統(tǒng)就會(huì)根據(jù)View的狀態(tài)來選擇合適的Drawable兢榨。StateListDrawable主要用于設(shè)置可單擊的View的背景嗅榕,最常見的是Button。
android:constantSize——StateListDrawable的固有大小是否不隨著其狀態(tài)的改變而改變吵聪,因?yàn)闋顟B(tài)的改變會(huì)導(dǎo)致StateListDrawable切換到具體的Drawable凌那,而不同的Drawable具有不同的固有大小。True表示StateListDrawable的固有大小保持不變吟逝,這時(shí)它的固有大小是內(nèi)部所有Drwable的固有大小的最大值帽蝶,false則會(huì)隨著狀態(tài)的改變而改變,此項(xiàng)默認(rèn)值為false块攒。
android:dither——是否開啟抖動(dòng)效果励稳,這個(gè)在BitmapDrawable中也有提到佃乘,開啟此項(xiàng)可以讓圖片在低質(zhì)量的屏幕上仍然獲得較好的顯示效果。此選項(xiàng)默認(rèn)為true驹尼。
android:variablePadding——表示是否隨著其狀態(tài)的改變而改變趣避,true表示會(huì)隨著狀態(tài)的改變而改變,false表示其padding是內(nèi)部所有Drawable的padding的最大值扶欣,此選項(xiàng)默認(rèn)值為false,并且不建議開啟此選項(xiàng)千扶。
<item>標(biāo)簽表示一個(gè)具體的Drawable料祠,它的結(jié)構(gòu)也比較簡單,其中android:drawable是一個(gè)已有的Drawable的資源id澎羞,剩下的屬性表示的是View的各種狀態(tài)
2.5 LevelListDrawable
對應(yīng)于<level_list>標(biāo)簽髓绽,它同樣表示一個(gè)Drawable集合,集合中每個(gè)Drawable都有一個(gè)等級的概念妆绞。根據(jù)不同的等級顺呕,LevelListDrawable會(huì)切換為對應(yīng)的Drawable。
其等級范圍為:0~10000
2.6 TransitionDrawable
對應(yīng)于《transition》標(biāo)簽括饶,用于實(shí)現(xiàn)兩個(gè)Drawable之間的淡入淡出效果
2.7 InsetDrawable
對應(yīng)于<inset>標(biāo)簽株茶,可以將其他Drawable內(nèi)嵌到自己當(dāng)中,并可以在四周留出一定的間距图焰。當(dāng)一個(gè)View希望自己的背景比自己的實(shí)際區(qū)域小的時(shí)候启盛,可以采用InsetDrawable來實(shí)現(xiàn)。
2.6 ScaleDrawable
對應(yīng)于<scale>標(biāo)簽技羔,可以根據(jù)自己的等級將指定的Drawable縮放到一定比例
其中僵闯,android:scaleGravity的含義等同于shape中的android:gravity,而android:scaleWidth和android:scaleHeight分別表示對指定Drawable寬和高的縮放比例藤滥,以百分比的形式表示鳖粟。
等級為0表示ScaleDrawable不可見,這是默認(rèn)值拙绊,要想ScaleDrawable可見向图,則其等級不能為0,看源碼:
由于iw一般為0 ,則可見,如果ScaleDrawable的級別為最大值10000茴迁,那么就沒有縮放的效果饮潦;如果ScaleDrawable的級別越大,那么內(nèi)部的Drawable看起來就越大剂跟;如果ScaleDrawable的xml中所定義的縮放比例越大,那么內(nèi)部的Drawable看起來就越小敬察。
2.9 ClipDrawable
對應(yīng)于<clip>標(biāo)簽漠畜,可以根據(jù)自己當(dāng)前的等級來裁剪另一個(gè)Drawable币他,裁剪方向可以通過android:clipOrientation和android:gravity這兩個(gè)屬性來共同控制
clipOrientation表示裁剪方向,有水平和豎直方向憔狞,gravity比較復(fù)雜蝴悉,需要和clipOrientation一起才能發(fā)揮作用。
對于ClipDrawable來說瘾敢,等級0表示完全裁剪拍冠,及整個(gè)Drawable都不可見,最大等級10000表示不裁剪簇抵。