6.1 Android中的Drawable

Android中的Drawable

Drawable表示的是一種可以在Canvas上進(jìn)行繪制的抽象的概念盲链,它的種類有很多掌猛,最常見的顏色和圖片都可以是一個(gè)Drawable奈嘿。
Drawable在開發(fā)中有著自己的優(yōu)點(diǎn):首先,它使用簡(jiǎn)單搬设,比自定義View的成本要低鞋诗;其次膀捷,非圖片類型的Drawable占用空間較小,這對(duì)減少apk的大小也很有幫助削彬。

1. Drawable簡(jiǎn)介

Drawable有很多種全庸,它們都表示一種圖像的概念,但是它們又不全是圖片吃警,通過顏色也可以構(gòu)造出各式各樣的圖像的效果糕篇。在Android的設(shè)計(jì)中,Drawable是一個(gè)抽象類酌心,它是所有Drawable對(duì)象的基類,每個(gè)具體的Drawable都是它的子類挑豌,比如ShapeDrawable安券,BitmapDrawable等墩崩。

Drawable的內(nèi)部寬/高這個(gè)參數(shù)比較重要,通過getIntrinsicWidthgetIntrinsicHeight這兩個(gè)方法可以獲取到它們侯勉。但是并不是所有的Drawable都有內(nèi)部寬/高鹦筹,比如一張圖片所形成的的Drawable,它的內(nèi)部寬/高就是圖片的寬/高址貌,但是一個(gè)顏色所形成的Drawable铐拐,它就沒有內(nèi)部寬/高的概念。另外需要注意的是练对,Drawable的內(nèi)部寬/高不等同于它的大小遍蟋,一般來說,Drawable是沒有大小概念的螟凭,當(dāng)用作View的背景時(shí)虚青,Drawable會(huì)被拉伸至View的同等大小。

Drawable的層次結(jié)構(gòu)

2. Drawable的分類

1. BitmapDrawable

這幾乎是最簡(jiǎn)單的Drawable了螺男,它表示的就是一張圖片棒厘。在實(shí)際開發(fā)中,我們可以直接引用原始的圖片即可下隧,但是也可以通過XML的方式來描述它奢人,通過XML來描述的BitmapDrawable可以設(shè)置更多的效果。

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/mainback"
    android:antialias="true"
    android:dither="true"
    android:filter="true"
    android:gravity="center"
    android:mipMap="false"
    android:tileMode="repeat"/>

android:src
圖片的資源id

android:antialias
是否開啟圖片抗鋸齒功能淆院。開啟后會(huì)讓圖片變得平滑何乎,同時(shí)也會(huì)在一定程度上降低圖片的清晰度,但是這個(gè)降低的幅度較低以至于可以忽略迫筑,因此抗鋸齒選項(xiàng)應(yīng)該開啟宪赶。

android:dither
是否開啟抖動(dòng)效果。當(dāng)圖片的像素配置和手機(jī)屏幕的像素配置不一致時(shí)脯燃,開啟這個(gè)選項(xiàng)可以讓高質(zhì)量的圖片在低質(zhì)量的屏幕上還能保持較好的顯示效果搂妻。在Android中設(shè)置的Bitmap一般會(huì)選用ARGB8888這個(gè)模式,即ARGB四個(gè)通道各占8位辕棚,在這種色彩模式下欲主,一個(gè)像素所占的大小為4個(gè)字節(jié),一個(gè)像素的位數(shù)總和越高逝嚎,圖像也就越逼真扁瓢。

android:filter
是否開啟過濾效果,當(dāng)圖片尺寸被拉伸或者壓縮時(shí)补君,開啟過濾效果可以保持較好的顯示效果引几,因此此選項(xiàng)也應(yīng)該開啟。

android:gravity
當(dāng)圖片小于屏幕的尺寸時(shí)挽铁,設(shè)置此選項(xiàng)可以對(duì)圖片進(jìn)行定位伟桅。這個(gè)屬性的可選項(xiàng)比較多敞掘,不同的選項(xiàng)可以通過|來組合使用。

gravity屬性的可選項(xiàng)

android:mipMap
這是一種圖像相關(guān)的處理技術(shù)楣铁,也叫紋理映射玖雁,比較抽象,默認(rèn)值為false盖腕,在日常開發(fā)中此選項(xiàng)不常用赫冬。

android:tileMode
平鋪模式。這個(gè)選項(xiàng)有如下幾個(gè)值:repeat溃列,mirror劲厌,clampdisabled哭廉。其中disabled表示關(guān)閉平鋪模式脊僚,這也是默認(rèn)值。repeat表示的是簡(jiǎn)單的水平和豎直方向上的平鋪效果遵绰;mirror表示一種在水平和豎直方向上的鏡面投影效果辽幌;clamp表示的效果就更加奇特,圖片四周的像素會(huì)拓展到周圍區(qū)域椿访。

平鋪模式下的圖片顯示效果

NinePatchDrawable
它表示的是一張.9格式的圖片乌企,.9圖片可以自動(dòng)地根據(jù)所需的寬/高進(jìn)行相應(yīng)的縮放,并保證不失真成玫,和BitmapDrawable一樣加酵,在實(shí)際的使用中直接引用圖片即可,但是也可以通過XML來描述.9圖哭当。

<?xml version="1.0" encoding="utf-8"?>
<nine-patch
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@drawable/ic_launcher"
    android:dither="true">

</nine-patch>

上述XML中的屬性的含義和BitmapDrawable中的對(duì)應(yīng)屬性的含義是相同的猪腕。

2. ShapeDrawable

android:shape
表示圖形的形狀,有四個(gè)選項(xiàng)钦勘,rectangle(矩形)陋葡,oval(橢圓),line(線性)彻采,ring(圓環(huán))腐缤。它的默認(rèn)值是矩形,另外linering這兩個(gè)選項(xiàng)必須要通過<stroke>標(biāo)簽來指定線的寬度和顏色等信息肛响,否則將無法達(dá)到預(yù)期的顯示效果岭粤。
針對(duì)ring這個(gè)形狀,有5個(gè)特殊的屬性特笋,android:innerRadius剃浇,android:thicknessandroid:innerRadiusRatioandroid:thicknessRatio偿渡,android:useLevel臼寄。含義如下表所示:

ring的屬性值

·corners·
表示shape的四個(gè)角的角度霸奕,它只適用于矩形shape溜宽,這里的角度是指圓角的程度。
android:radius
為4個(gè)角同時(shí)設(shè)定相同的角度质帅,優(yōu)先級(jí)較低适揉,會(huì)被其他四個(gè)屬性覆蓋。
android:topLeftRadius
設(shè)定左上角的角度
android:topRightRadius
設(shè)定右上角的角度
android:bottomLeftRadius
設(shè)定左下角的角度
android:bottomRightRadius
設(shè)定右下角的角度

gradient
它與<solid>標(biāo)簽是互相排斥的煤惩,其中solid表示純色填充嫉嘀,而gradient則表示漸變效果。
android:angle
漸變的角度魄揉,默認(rèn)為0剪侮,其值必須為45的倍數(shù),0表示從左到右洛退,90表示從下到上瓣俯。
android:centerX
漸變的中心點(diǎn)的橫坐標(biāo)
android:centerY
漸變的中心點(diǎn)的縱坐標(biāo),漸變的中心點(diǎn)會(huì)影響漸變的具體效果
android:startColor
漸變的起始色
android:centerColor
漸變的中間色
android:endColor
漸變的結(jié)束色
android:gradientRadius
漸變半徑兵怯,僅當(dāng)android:type="radial"時(shí)有效
android:useLevel
一般為false彩匕,當(dāng)Drawable作為StateListDrawable使用時(shí)為true
android:type
漸變的類型媒区,有linear(線性漸變)驼仪,radial(徑向漸變),sweep(掃描線漸變)三種袜漩,其中默認(rèn)值為線性漸變绪爸。

漸變的類別,從左到右依次為linear宙攻,radial奠货,sweep

solid
這個(gè)標(biāo)簽表示純色填充,通過android:color即可指定shape中填充的顏色

stroke
shape的描邊
android:width
描邊的寬度粘优,越大則shape的邊緣線就會(huì)看起來越粗仇味。
android:color
描邊的顏色
android:dashWidth
組成虛線的線段的寬度
android:dashGap
組成虛線的線段之間的間隔,間隔越大則虛線看起來空隙就越大雹顺。注意:如果android:dashWidthandroid:dashGap有任何一個(gè)為0丹墨,那么虛線效果將不能生效。

padding
這個(gè)表示空白嬉愧,但是它表示的不是shape的空白贩挣,而是包含它的View的空白,有四個(gè)屬性:android:top,android:right,android:bottom,android:left

size
設(shè)置的寬/高就是ShapeDrawable的固有寬高王财,但是作為View的背景時(shí)卵迂,shape還會(huì)被拉伸或者縮小為View的大小。

3. LayerDrawable

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

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <!--第一層-->
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#0ac39e"/>
        </shape>
    </item>

    <!--第二層-->
    <item android:bottom="6dp">
        <shape android:shape="rectangle">
            <solid android:color="#FFFFFF"/>
        </shape>
    </item>

    <!--第三層-->
    <item android:bottom="1dp"
        android:left="1dp"
        android:right="1dp">
        <shape android:shape="rectangle">
            <solid android:color="#FFFFFF"/>
        </shape>
    </item>

    <item android:drawable="@drawable/ic_launcher"
        android:gravity="right">

    </item>

</layer-list>

一個(gè)layer-list中可以包含多個(gè)item,每個(gè)item表示一個(gè)Drawable挂疆,item的結(jié)構(gòu)也比較簡(jiǎn)單改览,比較常用的屬性有android:bottomandroid:left缤言,android:right宝当,android:top,它們分別表示Drawable相對(duì)于View的上下左右的偏移量胆萧,單位為px庆揩。另外,我們可以通過android:drawable屬性來直接引用一個(gè)已有的Drawable資源跌穗,也可以在item中自定義Drawable订晌。默認(rèn)情況下,layer-list中的所有Drawable都會(huì)被縮放至View的大小瞻离,對(duì)于Bitmap來說腾仅,需要使用android:gravity屬性才能控制圖片的顯示效果。layer-list有層次的概念套利,下面的Item會(huì)覆蓋上面的item推励,通過合理的分層,可以實(shí)現(xiàn)一些特殊的疊加效果肉迫。

效果圖

4. StateListDrawable

StateListDrawable對(duì)應(yīng)于<selector>標(biāo)簽,它也是表示Drawable集合验辞,每個(gè)Drawable都對(duì)應(yīng)著View的一種狀態(tài),這樣系統(tǒng)就會(huì)根據(jù)View的狀態(tài)來選擇合適的Drawable喊衫。

<selector
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:constantSize="false"
    android:dither="true"
    android:variablePadding="false">

    <item
         android:drawable="@drawable/shape_main"
        android:state_pressed="true"/>

    <item
        android:drawable="@color/colorAccent"/>
</selector>

android:constantSize
StateListDrawable的固有大小是否隨著其狀態(tài)的改變而改變跌造,因?yàn)闋顟B(tài)的改變會(huì)導(dǎo)致StateListDrawable切換到具體的Drawable,而不同的Drawable具有不同的固有大小族购。true表示StateListDrawable的固有大小保持不變壳贪,這時(shí)它的固有大小是內(nèi)部所有Drawable的固有大小的最大值,false則會(huì)隨著狀態(tài)的改變而改變寝杖。此選項(xiàng)默認(rèn)值為fasle违施。

android:dither
是否開啟抖動(dòng)效果,開啟此選項(xiàng)可以讓圖片在低質(zhì)量的屏幕上依然獲得較好的顯示效果瑟幕,此選項(xiàng)默認(rèn)值為true磕蒲。

android:variablePadding
StateListDrawablepadding表示是否隨著其狀態(tài)的改變而改變留潦,true表示會(huì)隨著狀態(tài)的改變而改變,false表示StateListDrawablepadding是內(nèi)部所有Drawablepadding的最大值辣往。此選項(xiàng)默認(rèn)值為fasle兔院,不建議開啟此選項(xiàng)。

<item>標(biāo)簽表示一個(gè)具體的Drawable站削,android:drawable是一個(gè)已有Drawable的資源id坊萝,剩下的屬性表示的是View的各種狀態(tài),每個(gè)item表示的都是一種狀態(tài)下的Drawable信息钻哩。

View的常見狀態(tài)

系統(tǒng)會(huì)根據(jù)View當(dāng)前的狀態(tài)從<selector>中選擇對(duì)應(yīng)的item屹堰,每個(gè)item對(duì)應(yīng)著一個(gè)具體的Drawable,系統(tǒng)按照從上到下的順序查找街氢,直至查找到第一條匹配的item。一般來說睦袖,默認(rèn)的item都應(yīng)該放在<selector>的最后一條珊肃,并且不附帶任何的狀態(tài),這樣當(dāng)上面的item都無法匹配View的當(dāng)前狀態(tài)時(shí)馅笙,系統(tǒng)就會(huì)選擇默認(rèn)的item伦乔,因?yàn)槟J(rèn)的item不附帶狀態(tài),所以它可以匹配View的任何狀態(tài)董习。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末烈和,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子皿淋,更是在濱河造成了極大的恐慌招刹,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窝趣,死亡現(xiàn)場(chǎng)離奇詭異疯暑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)哑舒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門妇拯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人洗鸵,你說我怎么就攤上這事越锈。” “怎么了膘滨?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵甘凭,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我吏祸,道長(zhǎng)对蒲,這世上最難降的妖魔是什么钩蚊? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮蹈矮,結(jié)果婚禮上砰逻,老公的妹妹穿的比我還像新娘。我一直安慰自己泛鸟,他們只是感情好蝠咆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著北滥,像睡著了一般刚操。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上再芋,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天菊霜,我揣著相機(jī)與錄音,去河邊找鬼济赎。 笑死鉴逞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的司训。 我是一名探鬼主播构捡,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼壳猜!你這毒婦竟也來了勾徽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤统扳,失蹤者是張志新(化名)和其女友劉穎喘帚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體闪幽,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡啥辨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盯腌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溉知。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖腕够,靈堂內(nèi)的尸體忽然破棺而出级乍,到底是詐尸還是另有隱情,我是刑警寧澤帚湘,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布玫荣,位于F島的核電站,受9級(jí)特大地震影響大诸,放射性物質(zhì)發(fā)生泄漏捅厂。R本人自食惡果不足惜贯卦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望焙贷。 院中可真熱鬧撵割,春花似錦、人聲如沸辙芍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽故硅。三九已至庶灿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吃衅,已是汗流浹背往踢。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捐晶,地道東北人菲语。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像惑灵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子眼耀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

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

  • 優(yōu)點(diǎn):使用簡(jiǎn)單英支,比自定義View的成本低;非圖片類型的Drawable占用空間較小哮伟,這對(duì)減小apk的大小也有很大的...
    小柏不是大白閱讀 2,311評(píng)論 0 1
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,127評(píng)論 25 707
  • 6.1 Drawable 簡(jiǎn)介 Android 中的 Drawable 表示一種可以在 Canvas 上進(jìn)行繪制的...
    kongjn閱讀 1,573評(píng)論 0 1
  • 最近要考試干花,得去認(rèn)真的準(zhǔn)備一下了,所以畫畫可能會(huì)慢下來楞黄,但是還是會(huì)畫下去的池凄,不會(huì)放棄的(???)╯╰(???)?
    一只好coffee閱讀 100評(píng)論 0 0
  • 樹/艾青 一棵樹,一棵樹 彼此孤離地兀立著 風(fēng)與空氣 告訴著它們的距離 但是在泥土的覆蓋下 它們的根伸長(zhǎng)著 在看不...
    姬亞琳閱讀 1,426評(píng)論 19 17