Android中的Drawable

優(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,看源碼:

ScaleDrawable的draw方法
ScaleDrawable的onBoundsChange方法

由于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表示不裁剪簇抵。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末庆杜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子碟摆,更是在濱河造成了極大的恐慌晃财,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件典蜕,死亡現(xiàn)場離奇詭異断盛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)愉舔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門钢猛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人轩缤,你說我怎么就攤上這事厢洞。” “怎么了典奉?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵躺翻,是天一觀的道長。 經(jīng)常有香客問我卫玖,道長公你,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任假瞬,我火速辦了婚禮陕靠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘脱茉。我一直安慰自己剪芥,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布琴许。 她就那樣靜靜地躺著税肪,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上益兄,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天锻梳,我揣著相機(jī)與錄音,去河邊找鬼净捅。 笑死疑枯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蛔六。 我是一名探鬼主播荆永,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼国章!你這毒婦竟也來了具钥?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤捉腥,失蹤者是張志新(化名)和其女友劉穎氓拼,沒想到半個(gè)月后你画,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抵碟,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坏匪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年拟逮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片适滓。...
    茶點(diǎn)故事閱讀 38,039評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡敦迄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凭迹,到底是詐尸還是另有隱情罚屋,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布嗅绸,位于F島的核電站脾猛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鱼鸠。R本人自食惡果不足惜猛拴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蚀狰。 院中可真熱鬧愉昆,春花似錦、人聲如沸麻蹋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至倒谷,卻和暖如春蛛蒙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背渤愁。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工牵祟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抖格。 一個(gè)月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓诺苹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親雹拄。 傳聞我的和親對象是個(gè)殘疾皇子收奔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,506評論 25 707
  • 6.1 Drawable 簡介 Android 中的 Drawable 表示一種可以在 Canvas 上進(jìn)行繪制的...
    kongjn閱讀 1,566評論 0 1
  • Android中Drawable是一種可以在Canvas上進(jìn)行繪制抽象的概念,種類很多滓玖,常見的顏色和圖片都可以是一...
    斜杠時(shí)光閱讀 1,228評論 0 7
  • 前言 本文是本人閱讀《Android開發(fā)藝術(shù)探索》的第6章《Android的Drawable》后的總結(jié)筆記坪哄。包含了...
    daking閱讀 5,296評論 2 29
  • 朋友靜靜是一個(gè)非常勤奮的人禁悠,不管是學(xué)生時(shí)代念祭,還是參加工作之后,都表現(xiàn)得非常優(yōu)異碍侦,一直以來她都是我的榜樣粱坤。 但是,前...
    懶der閑閱讀 413評論 0 0