Android中的Drawable

優(yōu)點(diǎn):使用簡單,比自定義View的成本低;非圖片類型的Drawable占用空間較小,這對減小apk的大小也有很大的幫助

一、Drawable的簡介

在Android的設(shè)計中,Drawable是一個抽象類,它是所有Drawable對象的基類,每個具體的Drawable都是它的子類。

Drawable的內(nèi)部寬高這個參數(shù)比較重要,通過getIntrinsicWidth和getIntrinsicHeight這兩個方法可以獲取到它們。

二、Drawable的分類

2.1 BitmapDrawable

表示一張圖片,可通過xml的方式來描述它

android:src——圖片的資源id

android:antialias——是否開啟圖片抗鋸齒功能,開啟后會讓圖片變得平滑,同時也會在一定程度上降低圖片的清晰度

android:dither——是否開啟抖動效果,當(dāng)圖片的像素配置和手機(jī)屏幕的像素配置不一致時,開啟這個選項(xiàng)可以讓高質(zhì)量的圖片在低質(zhì)量的屏幕上還能保持很好的顯示效果

android:filter——是否開啟過濾功能,當(dāng)圖片尺寸被拉伸或者壓縮時,開啟過濾效果可以保持較好的顯示效果

android:gravity——但圖片小于容器的尺寸時,設(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:表示的效果更佳奇特,圖片四周的像素會擴(kuò)展到周圍區(qū)域

2.2 ShapeDrawable

通過顏色來構(gòu)造的圖形,既可以是純色的圖形,也可以是具有漸變的圖形

android:shape——表示圖形的形狀,有四個屬性值:rectangle(矩形)、oval(橢圓)、line(橫線)和ring(圓環(huán))。默認(rèn)值是矩形,其中l(wèi)ine和ring必須通過stroke標(biāo)簽來指定線的寬度和顏色等信息

corners——表示shape的四個角的角度,只適用于矩形shape,這里的角度是指圓形的程度,用px來表示,有如下5個屬性:

android:radius——為四個角同時設(shè)定相同的角度,優(yōu)先級較低,會被其他四個屬性覆蓋

android:topLeftRadius——設(shè)定左上角的角度

android:topRightRadius——設(shè)定右上角的角度

android:bottomLeftRadius——設(shè)定左下角的角度

android:bottomRightRadius——設(shè)定右下角的角度

gradient——與solid標(biāo)簽互斥,其中solid表示純色填充,而gradient則表示漸變效果,gradient又如下幾個屬性:

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”時有效

android:useLevel——一般為false,當(dāng)Drawable作為StateListDrawable使用時為true

android:tyoe——漸變的類別,有l(wèi)inear(線性漸變)、radial(徑向漸變)、sweep(掃描線漸變)三種,其中默認(rèn)值為線性漸變

solid——表示純色填充,通過android:color可指定shape中填充的顏色


stroke——shape的描邊

android:width——描邊的寬度,越大則shape的邊緣線會越粗

android:color——描邊的顏色

android:dashWidth——組成虛線的線段的寬度

android:dashGap——組成虛線的線段之間的間隔,間隔越大則虛線看起開空隙就越大

padding——這個表示空白,表示的是包含它的view的空白

size——shape的大小

android:width——表示shape的寬

android:height——表示shape的高

2.3 LayerDrawable

LayerDrawable對應(yīng)的XML標(biāo)簽是<layer-list>,表示一種層次化的Drawable集合,通過將不同的Drawable放置在不同層上面從而達(dá)到一種疊加后的效果

一個layer-list中可以包含多個item,每個item表示一個Drawable。

常用屬性:android:top、android:bottom、android:left和android:right,分別表示Drawable相對于view的上下左右的偏移量,單位為像素??赏ㄟ^drawable屬性來直接引用一個已有的資源。

2.4 StateListDrawable

StatelistDrawable對應(yīng)于<selector>標(biāo)簽,它也是表示Drawable集合,每個Drawable都對應(yīng)著View的一種狀態(tài),這樣系統(tǒng)就會根據(jù)View的狀態(tài)來選擇合適的Drawable。StateListDrawable主要用于設(shè)置可單擊的View的背景,最常見的是Button。

android:constantSize——StateListDrawable的固有大小是否不隨著其狀態(tài)的改變而改變,因?yàn)闋顟B(tài)的改變會導(dǎo)致StateListDrawable切換到具體的Drawable,而不同的Drawable具有不同的固有大小。True表示StateListDrawable的固有大小保持不變,這時它的固有大小是內(nèi)部所有Drwable的固有大小的最大值,false則會隨著狀態(tài)的改變而改變,此項(xiàng)默認(rèn)值為false。

android:dither——是否開啟抖動效果,這個在BitmapDrawable中也有提到,開啟此項(xiàng)可以讓圖片在低質(zhì)量的屏幕上仍然獲得較好的顯示效果。此選項(xiàng)默認(rèn)為true。

android:variablePadding——表示是否隨著其狀態(tài)的改變而改變,true表示會隨著狀態(tài)的改變而改變,false表示其padding是內(nèi)部所有Drawable的padding的最大值,此選項(xiàng)默認(rèn)值為false,并且不建議開啟此選項(xiàng)。

<item>標(biāo)簽表示一個具體的Drawable,它的結(jié)構(gòu)也比較簡單,其中android:drawable是一個已有的Drawable的資源id,剩下的屬性表示的是View的各種狀態(tài)


2.5 LevelListDrawable

對應(yīng)于<level_list>標(biāo)簽,它同樣表示一個Drawable集合,集合中每個Drawable都有一個等級的概念。根據(jù)不同的等級,LevelListDrawable會切換為對應(yīng)的Drawable。

其等級范圍為:0~10000

2.6 TransitionDrawable

對應(yīng)于《transition》標(biāo)簽,用于實(shí)現(xiàn)兩個Drawable之間的淡入淡出效果

2.7 InsetDrawable

對應(yīng)于<inset>標(biāo)簽,可以將其他Drawable內(nèi)嵌到自己當(dāng)中,并可以在四周留出一定的間距。當(dāng)一個View希望自己的背景比自己的實(shí)際區(qū)域小的時候,可以采用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)前的等級來裁剪另一個Drawable,裁剪方向可以通過android:clipOrientation和android:gravity這兩個屬性來共同控制

clipOrientation表示裁剪方向,有水平和豎直方向,gravity比較復(fù)雜,需要和clipOrientation一起才能發(fā)揮作用。

對于ClipDrawable來說,等級0表示完全裁剪,及整個Drawable都不可見,最大等級10000表示不裁剪。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容