Android 中的 Drawable

6.1 Drawable 簡介


Android 中的 Drawable 表示一種可以在 Canvas 上進(jìn)行繪制的抽象的概念亭引,比如顏色和圖片都可以是一個 Drawable。

Drawable 的層次關(guān)系

6.2 Drawable 的分類

6.2.1 BitmapDrawable

BitmapDrawable 表示一張圖片辜羊,可以用原始圖片顯示,也可以用 XML 的方式馒稍。

<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
        android:src="@drawable/image1"    //圖片資源 id
        android:antialias="true"           //抗鋸齒
        android:dither="true"              //抖動                 
        android:filter="true"
        android:gravity="center"
        android:mipMap="false"
        android:tileMode="disabled">
</bitmap>
  • android:src
    圖片資源 id
  • android:antialias
    抗鋸齒构罗,開啟后讓圖片變得平滑。
  • android:dither
    抖動效果溪北,開啟后圖像在不同屏幕上的顯示效果越逼真桐绒。
  • android:filter
    過濾效果,當(dāng)圖片尺寸被拉伸之拨,開啟過濾效果可以保持較好的顯示效果茉继。
  • android:gravity
    對圖片在容器中定位。
  • android:mipMap
    這一種圖像相關(guān)的處理技術(shù)敦锌,也叫紋理映射馒疹,比較抽象佳簸,默認(rèn) false乙墙,不用深究。
  • android:tileMode
  • disabled :禁用
  • repeat :水平和豎直方向上的平鋪效果
  • mirror :水平和豎直方向上的鏡面投影效果
  • clamp :四周的像素擴(kuò)散到周圍
tileMode 平鋪效果

6.2 ShapeDrawable

ShapeDrawable 可以理解為通過顏色來構(gòu)造的圖形生均,可以是純色或者具有漸變的圖形听想。需要注意的是<shape>標(biāo)簽創(chuàng)建的 Drawable 其實體類是 GradientDrawable。

  • android:shape
    表示圖形的形狀马胧,有四個選項:
  • rectangle(矩形):默認(rèn)選擇
  • oval(橢圓)
  • line(橫線):必須通過<stroke>標(biāo)簽來指定線的寬度和顏色等信息
  • ring(圓環(huán)):必須通過<stroke>標(biāo)簽來指定線的寬度和顏色等信息
value Desciption
android:innerRadius 圓環(huán)的內(nèi)半徑汉买,和 android:innerRadiusRatio 同時存在時,以android:innerRadius為準(zhǔn)
android:thickness 圓環(huán)的厚度佩脊,即半徑減去內(nèi)半徑的大小
android:innerRadiusRatio 內(nèi)半徑占整個 Drawable 寬度的比例蛙粘,默認(rèn)值為 9。如果為 n威彰,那么內(nèi)半徑 = 寬度 / n
android:thicknessRatio 厚度占整個 Drawable 寬度的比例出牧,默認(rèn)值為 3,,如果為 n歇盼,那么厚度 = 寬度 / n
android:useLevel 一般都應(yīng)該使用 false
  • <corners>
    表示 shape 四個角的角度舔痕,只適用于矩形 shape,用 px 來表示:

  • android:radius —— 為四個角同時設(shè)定相同的角度;

  • android:topRightRadius —— 設(shè)定右上角的角度伯复;

  • android:bottomLeftRadius —— 設(shè)定左下角的角度慨代;

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

  • <gradient>
    它與<soild>標(biāo)簽是互相排斥的啸如,soild 表示純色填充侍匙,gradient 表示漸變效果。

  • android:angle —— 漸變的角度组底,默認(rèn)為 0丈积,其值必須為 45 的背熟,0 表示從左到右债鸡,90 表示從上到下江滨。

  • android:centerX —— 漸變的中心點的橫坐標(biāo);

  • android:centerY —— 漸變的中心點的縱坐標(biāo)

  • android:startColor —— 漸變的起始色

  • android:centerColor —— 漸變的中間色

  • android:endColor —— 漸變的結(jié)束色

  • android:gradientRadius —— 漸變的半徑厌均,僅當(dāng) android:type = “radial” 時有效唬滑。

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

  • android:type —— 漸變的類別晶密,linear(線性漸變)、radial(徑向漸變)模她、sweep(掃描線漸變)

從左到右依次是:linear稻艰、radial、sweep
  • <soild>
    純色填充

  • <stroke>
    Shape 的描邊

  • android:width —— 描邊的寬度侈净;

  • android:color —— 描邊的顏色尊勿;

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

  • android:dashGap —— 組成虛線的線段之間的間隔畜侦;

  • <padding>
    四個屬性:android:left元扔、top、right旋膳、bottom

  • <size>
    shape 的大小澎语,有兩個屬性:android:width、height验懊,表示 shape 的固有大小擅羞,但作為 View 的背景時,還是會被顯示為 View 的大小义图。

6.2.3 LayerDrawable

LayerDrawable 對應(yīng)的 XML 標(biāo)簽是<layer-list> 减俏,通過不同的 Drawable 放置不再通的層上面從而達(dá)到一種疊加后的效果。

<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>
</layer-list>
layer-list 都應(yīng)用

6.2.4 StateListDrawable

StateListDrawable 對應(yīng)<selector> 標(biāo)簽歌溉,表示 Drawable 的集合垄懂。

  • android:constantSize
    StateListDrawable 的固有大小是否隨著其狀態(tài)的改變而改變骑晶,因為狀態(tài)的改變而切換到具體的 Drawable,為 true 則表示 StateListDrawable 的固有大小是所有 Drawable 最大值并且保持不變草慧,默認(rèn)為 false桶蛔,會改變。

  • android:dither
    開啟抖動效果漫谷,默認(rèn)為 true仔雷,開啟后在低質(zhì)量的屏幕上仍有較好的顯示效果。

  • android:variablePadding
    StateListDrawable 的 padding 是否隨其狀態(tài)的改變而改變舔示,true 是改變碟婆,默認(rèn)為 false(推薦)。

  • <item>
    表示一個具體的 Drawable惕稻。

狀態(tài) 含義
android:state_proessed 表示按下狀態(tài)
android:state_focused 表示 View 已經(jīng)獲取了焦點
android:state_selected 表示用戶選擇了焦點
android:state_checked 表示用戶選中了 View竖共,一般適用于 CheckBox 這類。
android:state_enabled 表示 View 當(dāng)前處于可用狀態(tài)

6.2.5 LeveListDrawable

LeveListDrawable 對應(yīng)于 <level-list> 標(biāo)簽俺祠,表示一個 Drawable 集合公给,根據(jù)其中的 level 來切換對應(yīng)的 Drawable。

  • 作為 View 的背景:通過 setLevel 來切換
  • 作為 ImageView 的前景 Drawable:通過 ImageView.setImageLevel 來切換蜘渣。

6.2.6 TransitionDrawable

TransitionDrawable 對應(yīng)于<transiton>標(biāo)簽淌铐,用于實現(xiàn)兩個 Drawable 之間的淡入淡出效果。

<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@drawable/bitmap_drawable_clamp"/>
    <item android:drawable="@drawable/bitmap_drawable_mirror"/>
</transition>
TransitionDrawable drawable = (TransitionDrawable) button.getBackground();
drawable.startTransition(3000);
TransitionDrawable 效果圖

6.2.7 InsetDrawable

InsetDrawable 對應(yīng)于<inset>標(biāo)簽蔫缸,它可用將其他 Drawable 內(nèi)嵌到自己當(dāng)中腿准,并可用在四周流出一定的間距。

<inset xmlns:android="http://schemas.android.com/apk/res/android"
    android:insetBottom="15dp"
    android:insetLeft="15dp"
    android:insetRight="15dp"
    android:insetTop="15dp" >

    <shape android:shape="rectangle" >
        <solid android:color="#ff0000" />
    </shape>
</inset>
image.png

6.2.8 ScaleDrawable

ScaleDrawable 對應(yīng)于<scale>標(biāo)簽拾碌,下面案例:顯示 30% 的大小

<scale xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@drawable/image1"
    android:scaleHeight="70%"
    android:scaleWidth="70%"
    android:scaleGravity="center" />

必須設(shè)置一個比 大于 0 小于 10000 的數(shù)字吐葱,否則無效

ScaleDrawable drawable = (ScaleDrawable) button.getBackground();
drawable.setLevel(1);
image.png

6.2.9 ClipDrawable

ClipDrawable 對應(yīng)于<clip>標(biāo)簽,它可以根據(jù)自己當(dāng)前的等級(level)來裁剪另一個 Drawable倦沧。

  • android:clipOrientation

  • horizontal:橫向

  • vertical:豎向

  • android:gravity

選項 含義
top 將內(nèi)部的 Drawable 放在容器的頂部唇撬,不改變它的大小它匕。如果為豎直裁剪展融,那么從底部開始裁剪。
bottom 將內(nèi)部的 Drawable 放在容器的底部豫柬,不改變它的大小告希。如果為豎直裁剪,那么從頂部開始裁剪
left 將內(nèi)部的 Drawable 放在容器的左邊烧给,不改變它的大小燕偶。如果為水平裁剪,那么從右邊開始裁剪(默認(rèn))
right 將內(nèi)部的 Drawable 放在容器的右础嫡,不改變它的大小指么。如果為水平裁剪酝惧,那么從左邊開始裁剪
center_vertical 將內(nèi)部的 Drawable 在容器中豎直居中,不改變它的大小伯诬。如果為豎直裁剪晚唇,那么從上下同時開始裁剪
fill_vertical 使內(nèi)部的 Drawable 在豎直方向上填充容器,如果為豎直裁剪盗似。那么僅當(dāng) ClipDrawable 的等級為 0(0 表示 ClipDrawable 被完全裁剪哩陕,既不可見)時,才能有裁剪行為
fill_horizontal 使內(nèi)部的 Drawable 在水平方向上填充容器赫舒,如果為水平裁剪悍及。那么僅當(dāng) ClipDrawable 的等級為 0時,才能有裁剪行為
center 使內(nèi)部的 Drawable 在水平和豎直方向上都居中接癌,不改變它的大小心赶。如果為豎直裁剪,那么從上下同時開始裁剪缺猛,如果為水平裁剪园担,那么從左右同時開始裁剪
fill 使內(nèi)部的 Drawable 在水平和豎直方向上同時填充容器,僅當(dāng) ClipDrawable 的等級為 0時枯夜,才能有裁剪行為
clip_vertical 附加選項弯汰,表示豎直方向裁剪,較少使用
clip_horizontal 附加選項湖雹,表示水平方向裁剪咏闪,較少使用
<clip xmlns:android="http://schemas.android.com/apk/res/android"
    android:clipOrientation="vertical"
    android:drawable="@drawable/image1"
    android:gravity="bottom" />

0-10000區(qū)間

 ClipDrawable drawable = (ClipDrawable) button.getBackground();
 drawable.setLevel(8000);
豎直裁剪 20 %

6.3 自定義 Drawable


很簡單,繼承 Drawable 實現(xiàn)里面的四個方法摔吏。

public class CustomDrawable extends Drawable {
    private Paint mPaint;

    public CustomDrawable(int color) {
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setColor(color);
    }

    @Override
    public void draw(Canvas canvas) {
        final Rect r = getBounds();
        float cx = r.exactCenterX();
        float cy = r.exactCenterY();
        canvas.drawCircle(cx, cy, Math.min(cx, cy), mPaint);
    }

    @Override
    public void setAlpha(int alpha) {
        mPaint.setAlpha(alpha);
        invalidateSelf();

    }

    @Override
    public void setColorFilter(ColorFilter cf) {
        mPaint.setColorFilter(cf);
        invalidateSelf();
    }

    @Override
    public int getOpacity() {
        // not sure, so be safe
        return PixelFormat.TRANSLUCENT;
    }
View testCustomDrawable = findViewById(R.id.test_custom_drawable);
CustomDrawable customDrawable = new CustomDrawable(Color.parseColor("#0ac39e"));
testCustomDrawable.setBackgroundDrawable(customDrawable);
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸽嫂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子征讲,更是在濱河造成了極大的恐慌据某,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件诗箍,死亡現(xiàn)場離奇詭異癣籽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)滤祖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門筷狼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匠童,你說我怎么就攤上這事埂材。” “怎么了汤求?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵俏险,是天一觀的道長严拒。 經(jīng)常有香客問我,道長竖独,這世上最難降的妖魔是什么糙俗? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮预鬓,結(jié)果婚禮上巧骚,老公的妹妹穿的比我還像新娘。我一直安慰自己格二,他們只是感情好劈彪,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著顶猜,像睡著了一般沧奴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上长窄,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天滔吠,我揣著相機(jī)與錄音,去河邊找鬼挠日。 笑死疮绷,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嚣潜。 我是一名探鬼主播冬骚,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼懂算!你這毒婦竟也來了只冻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤计技,失蹤者是張志新(化名)和其女友劉穎喜德,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垮媒,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡舍悯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了涣澡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贱呐。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡丧诺,死狀恐怖入桂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情驳阎,我是刑警寧澤抗愁,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布馁蒂,位于F島的核電站,受9級特大地震影響蜘腌,放射性物質(zhì)發(fā)生泄漏沫屡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一撮珠、第九天 我趴在偏房一處隱蔽的房頂上張望沮脖。 院中可真熱鬧,春花似錦芯急、人聲如沸勺届。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽免姿。三九已至,卻和暖如春榕酒,著一層夾襖步出監(jiān)牢的瞬間胚膊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工想鹰, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留紊婉,地道東北人。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓辑舷,卻偏偏與公主長得像肩榕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子惩妇,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

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

  • 優(yōu)點:使用簡單株汉,比自定義View的成本低;非圖片類型的Drawable占用空間較小歌殃,這對減小apk的大小也有很大的...
    小柏不是大白閱讀 2,288評論 0 1
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,506評論 25 707
  • Android中Drawable是一種可以在Canvas上進(jìn)行繪制抽象的概念乔妈,種類很多,常見的顏色和圖片都可以是一...
    斜杠時光閱讀 1,228評論 0 7
  • 前言 本文是本人閱讀《Android開發(fā)藝術(shù)探索》的第6章《Android的Drawable》后的總結(jié)筆記氓皱。包含了...
    daking閱讀 5,296評論 2 29
  • 01 沉睡了一夜后路召,打破村莊寂靜的總是那一聲聲如約而來的響亮而持久的雞鳴聲。一聲雞鳴聲就可以響徹整個村莊波材,它就如同...
    楊喜愛閱讀 1,416評論 11 158