Android中常用的Drawable

前言

  • 本文是本人閱讀《Android開(kāi)發(fā)藝術(shù)探索》的第6章《Android的Drawable》后的總結(jié)筆記。包含了Android開(kāi)發(fā)中常用的Drawable,詳解了它們的屬性和用法呈宇。

  • 本文的目錄結(jié)構(gòu)

    • 前言
    • Drawable簡(jiǎn)介
    • Drawable分類(lèi)
      • BitmapDrawable
      • NinePatchDrawable
      • ShapeDrawable
      • LayerDrawable
      • StateListDrawable
      • LevelListDrawable
      • TransitionDrawable
      • InsetDrawable
      • ScaleDrawable
      • ClipDrawable
    • 自定義Drawable

Drawable簡(jiǎn)介

  • Drawable表示的是一種可以在Canvas上進(jìn)行繪制的抽象的概念,可以是純顏色,也可以是圖片等胆建。

  • Drawable一般是通過(guò)XML來(lái)定義,當(dāng)然也可以通過(guò)代碼來(lái)創(chuàng)建肘交。

  • Drawable類(lèi)是抽象類(lèi)笆载,它是所有Drawable的基類(lèi)。

  • Drawable的getIntrinsicWidth()getIntrinsicHeight()獲取其內(nèi)部寬/高涯呻。并不是所有Drawable都有內(nèi)部寬/高凉驻。圖片所形成的Drawable的內(nèi)部寬/高就是圖片的寬/高。顏色所形成的Drawable就沒(méi)有內(nèi)部寬/高的概念了复罐。

  • Drawable是沒(méi)有大小概念的涝登,當(dāng)用作View的背景時(shí),會(huì)被拉伸至View的同等大小市栗。

  • Drawable的使用范圍很單一:一是作為ImageView中的圖像顯示缀拭,二是作為View的背景。

Drawable分類(lèi)

BitmapDrawable

  • 對(duì)應(yīng)<bitmap>標(biāo)簽填帽,幾乎是最簡(jiǎn)單的Drawable蛛淋,表示一張圖片。

  • 在實(shí)際開(kāi)發(fā)中篡腌,我們可直接引用原始的圖片褐荷,也可通過(guò)XML的方式來(lái)描述它。

<?xml version="1.0" encoding="utf-8"?>
<bitmap
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@[package:]drawable/drawable_resource"
    android:antialias="[true | false]"
    android:dither="[true | false]"
    android:filter="[true | false]"
    android:gravity="[top | bottom | left | right |
     center_vertical | fill_vertical | center_horizontal |
      fill_horizontal | center | fill |
       clip_vertical | clip_horizontal]"
    android:mipMap="[true | false]"
    android:tileMode="[disabled | clamp | repeat | mirror]" />
  • android:src:圖片的資源id嘹悼。

  • android:antialias:是否開(kāi)啟圖片抗鋸齒叛甫。開(kāi)啟后會(huì)讓圖片變得平滑,同時(shí)也會(huì)一定程度上降低圖片的清晰度杨伙。

  • android:dither:是否開(kāi)啟抖動(dòng)效果其监。開(kāi)啟后可讓高質(zhì)量的圖片在低質(zhì)量的屏幕上能保持較好的顯示效果。

  • android:filter:是否開(kāi)啟過(guò)濾效果限匣。當(dāng)圖片尺寸被拉伸或壓縮時(shí)抖苦,開(kāi)啟過(guò)濾效果可保持較好的顯示效果。

  • android:gravity:當(dāng)圖片小于容器的尺寸時(shí)米死,設(shè)置此屬性對(duì)圖片進(jìn)行定位锌历。此屬性的可選項(xiàng)較多,也可用|來(lái)組合使用峦筒。

可選項(xiàng) 含義
top 將圖片放在容器的頂部究西,不改變其大小。
bottom 將圖片放在容器的底部物喷,不改變其大小卤材。
left 將圖片放在容器的左部遮斥,不改變其大小。
right 將圖片放在容器的右部商膊,不改變其大小伏伐。
center_vertical 使圖片豎直居中,不改變其大小晕拆。
center_horizontal 使圖片水平居中藐翎,不改變其大小。
fill_vertical 圖片豎直方向填充容器
fill_horizontal 圖片水平方向填充容器
center 使圖片居中实幕,不改變其大小吝镣。
fill 圖片填充容器,默認(rèn)值昆庇。
clip_vertical 豎直方向的裁剪末贾。
clip_horizontal 水平方向的裁剪。
  • android:mipMap:是否開(kāi)啟紋理映射整吆。

  • android:tileMode:平鋪模式拱撵。

可選項(xiàng) 含義
disabled 默認(rèn)值,關(guān)閉平鋪模式表蝙。
clamp 圖片四周的像素會(huì)擴(kuò)展到周?chē)鷧^(qū)域拴测。
repeat 簡(jiǎn)單的水平和豎直方向上的平鋪效果。
mirror 在水平和豎直方向上的鏡面投影效果府蛇。

NinePatchDrawable

  • 表示一張.9格式的圖片集索。.9圖片可自動(dòng)地根據(jù)所需的寬/高進(jìn)行相應(yīng)的縮放并保證不失真。

  • 在實(shí)際使用中直接引用.9圖片汇跨,也可以通過(guò)XML來(lái)描述它务荆。

<?xml version="1.0" encoding="utf-8"?>
<nine-patch
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:src="@[package:]drawable/drawable_resource"
    android:dither="[true | false]" />
  • android:src:圖片的資源id。

  • android:dither:是否開(kāi)啟抖動(dòng)效果穷遂。開(kāi)啟后可讓高質(zhì)量的圖片在低質(zhì)量的屏幕上能保持較好的顯示效果函匕。

ShapeDrawable

  • 圖形◎胶冢可是純色的圖形浦箱,也可以是具有漸變效果的圖形。
<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="[rectangle | oval | line | ring]"
    <corners
        android:radius="integer"
        android:topLeftRaidus="integer"
        android:topRightRaidus="integer"
        android:bottomLeftRaidus="integer"
        android:bottomRightRaidus="integer" />
    <gradient
        android:angle="integer"
        android:centerX="integer"
        android:centerY="integer"
        android:centerColor="color"
        android:endColor="color"
        android:gradientRadius="integer"
        android:startColor="color"
        android:type="[linear | radial | sweep]"
        android:useLevel="[true | false]" />
    <padding
        android:left="integer"
        android:top="integer"
        android:right="integer"
        android:bottom="integer" />
    <size
        android:width="integer"
        android:height="integer" />
    <solid
        android:color="color" />
    <stroke
        android:width="integer"
        android:color="color"
        android:dashWidth="integer"
        android:dashGap="integer" />
  • android:shape:圖形的形狀祠锣,可選有rectangle(矩形)、oval(橢圓)咽安、line(橫線(xiàn))和ring(圓環(huán))伴网。默認(rèn)是rectangle。注意line和ring必須通過(guò)<stroke>標(biāo)簽來(lái)指定線(xiàn)的寬度和顏色等信息妆棒,否則無(wú)法達(dá)到預(yù)期的顯示效果澡腾。

  • android:shape="ring"有5個(gè)特殊屬性沸伏。

屬性 描述
android:innerRadius 圓環(huán)的內(nèi)半徑。<Br>會(huì)覆蓋android:innerRadiusRatio动分。
android:innerRadiusRatio 內(nèi)半徑占整個(gè)Drawable寬度的比例毅糟。
默認(rèn)為9,若為n澜公,則內(nèi)半徑 = 寬度 / n姆另。
android:thickness 圓環(huán)的厚度。即外半徑減去內(nèi)半徑的大小坟乾。<Br>會(huì)覆蓋android:thicknessRatio
android:thicknessRatio 厚度占整個(gè)Drawable寬度的比例迹辐。
默認(rèn)為3,若為n甚侣,則厚度 = 寬度 / n明吩。
android:useLevel 常為false,除非它被當(dāng)做是LevelListDrawable殷费。
  • <corners>:表示shape的四個(gè)圓角的角度印荔,只適用于矩形。

    1. android:radius:為四個(gè)角同事設(shè)定相同的角度详羡。優(yōu)先級(jí)比以下4個(gè)屬性要低仍律。
    2. android:topLeftRadius:左上角的角度。
    3. android:topRightRadius:右上角的角度殷绍。
    4. android:bottomLeftRadius:左下角的角度染苛。
    5. android:bottomRightRadius:右下角的角度。
  • <solid>:純色填充主到,通過(guò)android:color指定填充的顏色茶行。

  • <gradient>:漸變效果。與<solid>純色填充是互相排斥的登钥。

    1. android:angle:漸變的角度畔师。默認(rèn)為0,其值必須為45的倍數(shù)牧牢。此角度會(huì)影響漸變的方向看锉,0表示從左到右,90表示從下到上塔鳍。
    2. android:centerX:漸變的中心點(diǎn)的X坐標(biāo)伯铣。
    3. android:centerY:漸變的中心點(diǎn)的Y坐標(biāo)。
    4. android:startColor:漸變的起始色轮纫。
    5. android:centerColor:漸變的中間色腔寡。
    6. android:endColor:漸變的結(jié)束色。
    7. android:gradient:漸變半徑掌唾。僅當(dāng)android:type="radial"時(shí)有效放前。
    8. android:useLevel:一般為false忿磅,當(dāng)Drawable作為StateListDrawable時(shí)為true。
    9. android:type:漸變的類(lèi)別凭语。有l(wèi)inear(線(xiàn)性漸變)葱她、radial(徑向漸變)、sweep(掃描線(xiàn)漸變)似扔,默認(rèn)為linear吨些。
  • <stroke>:描邊。

    1. android:width:描邊的寬度虫几。
    2. android:color:描邊的顏色锤灿。
    3. android:dashWidth:虛線(xiàn)的寬度。
    4. android:dashGap:虛線(xiàn)之間的間隔辆脸。
  • <padding>:空白但校。有top等四個(gè)屬性。

  • <size>:大小啡氢。其android:widthandroid:height分別設(shè)定shape的寬/高状囱。注意,這個(gè)表示的是shape的固有大小倘是,但并不是其最終大小亭枷。

LayerDrawable

  • 對(duì)應(yīng)<layer-list>標(biāo)簽,表示一種層次化的Drawable集合搀崭,通過(guò)將不同的Drawable放置在不同的層上面從而達(dá)到一種疊加后的效果叨粘。
<?xml version="1.0" encoding="utf-8"?>
<layer-list
    xmlns:android="http://schemas.android.com/apk/res/android"
    <item
        android:drawable="@[package:]drawable/drawable_resource"
        android:id="@[+][package:]id/resource_name"
        android:top="dimension"
        android:right="dimension"
        android:bottom="dimension"
        android:left="dimension" />
    <!-- 其他item -->
</layer-list>
  • 一個(gè)layer-list可包含多個(gè)item,每個(gè)item表示一個(gè)Drawable瘤睹∩茫可在android:drawable中引用一個(gè)現(xiàn)有的Drawable資源,也可在<item>中自定義Drawable轰传。

  • 默認(rèn)情況下驴党,layer-list中的所有Drawable都會(huì)被縮放至View的大小』癫纾可設(shè)置Drawable相對(duì)于View的上下左右偏移量港庄。另外對(duì)于bitmap,需要使用其android:gravity來(lái)控制圖片的顯示效果恕曲。

  • layer-list有層次的概念鹏氧,下面的item會(huì)覆蓋上面的item。通過(guò)合理的分層佩谣,可實(shí)現(xiàn)一些特殊的疊加效果度帮。

  • 利用layer-list實(shí)現(xiàn)一個(gè)文本輸入框。

    <?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>
    </layer-list>
    
    layer-list背景的輸入框

StateListDrawable

  • 對(duì)應(yīng)<selector>標(biāo)簽,表示一個(gè)Drawable的集合笨篷。每個(gè)Drawable對(duì)應(yīng)著View的一種狀態(tài),系統(tǒng)會(huì)根據(jù)View的狀態(tài)來(lái)選擇合適的Drawable瓣履。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
    android:constantSize="[true | false]"
    android:dither="[true | false]"
    android:variablePadding="[true | false]">
    <item
        android:drawable="@[package:]drawable/drawable_resource"
        android:state_pressed="[true | false]"
        android:state_focused="[true | false]"
        android:state_hovered="[true | false]"
        android:state_selected="[true | false]"
        android:state_checkable="[true | false]"
        android:state_checked="[true | false]"
        android:state_enabled="[true | false]"
        android:state_activated="[true | false]"
        android:state_window_focused="[true | false]" />
    <!-- 其他item -->
</selector>
  • android:constantSize:StateListDrawable的固有大小是否不隨著其狀態(tài)的改變而改變率翅。默認(rèn)為false,即隨著狀態(tài)的改變而改變大小袖迎。若為true冕臭,則表示其內(nèi)部所有Drawable的固有大小的最大值。

  • android:dither:是否開(kāi)啟抖動(dòng)效果燕锥。

  • android:variblePadding:StateListDrawable的padding是否隨著其狀態(tài)的改變而改變辜贵。默認(rèn)為false,表示其內(nèi)部所有Drawable的padding的最大值归形。若為true托慨,表示會(huì)隨著狀態(tài)的改變而改變。

  • <item>:表示某種狀態(tài)下的一個(gè)具體的Drawable暇榴。用android:drawable指定一個(gè)現(xiàn)有Drawable的資源id厚棵,剩下的屬性表示的是View的各種狀態(tài)。

狀態(tài) 含義
android:state_pressed 表示按下?tīng)顟B(tài)蔼紧。
android:state_focused 表示已經(jīng)獲取了焦點(diǎn)婆硬。
android:state_selected 表示用戶(hù)選擇了View。
android:state_checked 表示用戶(hù)選中了View奸例。<Br>適用于CheckBox這類(lèi)在選中和非選中狀態(tài)之間進(jìn)行切換的View彬犯。
android:state_enabled 表示View當(dāng)前處于可用狀態(tài)。
  • 系統(tǒng)會(huì)按照從上到下的順序查找查吊,直至查找到第一條匹配的item谐区。一般來(lái)說(shuō),默認(rèn)的item都應(yīng)該放在selector的最后一條菩貌,并且不附帶任何的狀態(tài)卢佣。

LevelListDrawable

  • 對(duì)應(yīng)<level-list>標(biāo)簽,表示一個(gè)Drawable集合箭阶,集合中的每個(gè)Drawable都有一個(gè)等級(jí)的概念虚茶。根據(jù)不同的等級(jí),LevelListDrawable會(huì)切換為對(duì)應(yīng)的Drawable仇参。
<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@[package:]drawable/drawable_resource"
        android:maxLevel="integer"
        android:minLevel="integer" />
    <!-- 其他item -->
</level-list>
  • 每個(gè)item表示一個(gè)Drawable嘹叫,并且有對(duì)應(yīng)的等級(jí)范圍,在maxLevelminLevel之間诈乒。取值范圍為0~10000罩扇,默認(rèn)為0。

  • 若作為View背景時(shí),可通過(guò)Drawable的setLevel()來(lái)設(shè)置不同的等級(jí)來(lái)切換具體的Drawable喂饥。若作為ImageView的前景消约,可通過(guò)ImageView的setImageLevel()來(lái)切換。

TransitionDrawable

  • 對(duì)應(yīng)于<transition>標(biāo)簽员帮,用于實(shí)現(xiàn)兩個(gè)Drawable之間的淡入淡出效果或粮。
<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:drawable="@[package:]drawable/drawable_resource"
        android:id="@[+][package:]id/resource_name"
        android:top="dimension"
        android:right="dimension"
        android:bottom="dimension"
        android:left="dimension" />
    <!-- 另一個(gè)item,注意transition只包含兩個(gè)item -->
</transition>
  • 常將TransitionDrawable作為View的背景捞高,再調(diào)用它的startTransition()reverseTransition()來(lái)實(shí)現(xiàn)淡入淡出效果以及它的逆過(guò)程氯材。
ImageView ivBg = (ImageView) findViewById(R.id.iv_bg);
TransitionDrawable drawable = (TransitionDrawable) ivBg.getBackground();
drawable.startTransition(1000);

InsetDrawable

  • 對(duì)應(yīng)<inset>標(biāo)簽,可將其他Drawable內(nèi)嵌到自己當(dāng)中硝岗,并可在四周留出一定的間距氢哮。
<?xml version="1.0" encoding="utf-8"?>
<inset 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@[package:]drawable/drawable_resource"
    android:inset="dimension"
    android:insetTop="dimension"
    android:insetRight="dimension"
    android:insetBottom="dimension"
    android:insetLeft="dimension" />
  • 當(dāng)一個(gè)View希望自己的背景比自己的實(shí)際區(qū)域小的時(shí)候,可采用InsetDrawable型檀,并通過(guò)inset*屬性來(lái)設(shè)置留白冗尤。

ScaleDrawable

  • 對(duì)應(yīng)<scale>標(biāo)簽,將Drawable縮放到一定比例贱除。
<?xml version="1.0" encoding="utf-8"?>
<scale 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@[package:]drawable/drawable_resource"
    android:scaleGravity="[top | bottom | left | right |
        center_vertical | center_horizontal | center |
        fill_vertical | fill_horizontal | fill |
        clip_vertical | clip_horizontal]"
    android:scaleWidth="percentage"
    android:scaleHeight="percentage" />
  • android:scaleGravity:等同于BitmapDrawable的android:gravity生闲。

  • android:scaleWidthandroid:scaleHeight:指定Drawable寬/高的縮放比例,以百分比的形式表示月幌。如70%碍讯,表示縮放到原來(lái)的30%。


  • 從ScaleDrawable的draw()源代碼來(lái)看扯躺,若等級(jí)為0時(shí)捉兴,不可見(jiàn)。等級(jí)默認(rèn)為0录语,所以調(diào)用ScaleDrawable的setLevel()設(shè)置一個(gè)大于0的等級(jí)倍啥,它才會(huì)可見(jiàn)。
public void draw(Canvas canvas) {
    final Drawable d = getDrawable();
    if (d != null && d.getLevel() != 0) {
        d.draw(canvas);
    }
}
  • 分析ScaleDrawable的onBoundsChange()可看出其內(nèi)部mDrawable的大小和等級(jí)以及縮放比例的關(guān)系澎埠。
// iw常為0
final int iw = min ? d.getIntrinsicWidth() : 0;
// 1. MAX_LEVEL為10000虽缕,即等級(jí)的取值范圍為0~10000。
// 2. 計(jì)算得到的最終w為其內(nèi)部mDrawable最后顯示的寬度蒲稳。因?yàn)槭?=氮趋,所以右邊算數(shù)得到的值越大,則最終w就越小江耀。
// 3. level越大剩胁,其內(nèi)部mDrawable就越大。
// 4. ScaleDrawable的XML中所定義的縮放比例越大祥国,即mState.mScaleWidth越大昵观,則內(nèi)部mDrawable就越小。
w -= (int) ((w - iw) * (MAX_LEVEL - level) * mState.mScaleWidth / MAX_LEVEL);

ClipDrawable

  • 對(duì)應(yīng)<clip>標(biāo)簽,用來(lái)裁剪另一個(gè)Drawable啊犬。
<?xml version="1.0" encoding="utf-8"?>
<clip 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:drawable="@[package:]drawable/drawable_resource"
    android:clipOrientation="[vertical | horizontal]"
    android:gravity="[top | bottom | left | right |
        center_vertical | center_horizontal | center |
        fill_vertical | fill_horizontal | fill |
        clip_vertical | clip_horizontal]" />
  • android:clipOrientation:表示裁剪方向灼擂,可選為水平和豎直。

  • android:gravity:表示對(duì)齊方式觉至,需要和clipOrientation一起發(fā)揮作用缤至。它的取值有下表各種選項(xiàng),可用|來(lái)組合使用康谆。

選項(xiàng) 含義
top 放在容器的頂部,不改變大小嫉到。
若為豎直裁剪沃暗,則從底部開(kāi)始裁剪。
bottom 放在容器的底部何恶,不改變大小孽锥。
若為豎直裁剪,則從頂部開(kāi)始裁剪细层。
left 這是默認(rèn)值惜辑。放在容器的左邊,不改變大小疫赎。
若為水平裁剪盛撑,則從右邊開(kāi)始裁剪。
right 放在容器的右邊捧搞,不改變大小抵卫。
若為水平裁剪,則從左邊開(kāi)始裁剪胎撇。
center_vertical 在容器中豎直居中介粘,不改變大小。
若為豎直裁剪晚树,則從上下同時(shí)裁剪姻采。
center_horizontal 在容器中水平居中,不改變大小爵憎。
若為水平裁剪慨亲,則從左右同時(shí)裁剪。
center 居中纲堵,不改變大小巡雨。
若為豎直裁剪,則從上下同時(shí)裁剪席函。
若為水平裁剪铐望,則從左右同時(shí)裁剪。
fill_vertical 在豎直方向上填充容器。
若為豎直裁剪正蛙,僅當(dāng)?shù)燃?jí)為0時(shí)才能有裁剪行為督弓。
fill_horizontal 在水平方向上填充容器。
若為水平裁剪乒验,僅當(dāng)?shù)燃?jí)為0時(shí)才能有裁剪行為愚隧。
fill 完全填充容器。
僅當(dāng)?shù)燃?jí)為0時(shí)才能有裁剪行為锻全。
clip_vertical 附加選項(xiàng)狂塘,表示豎直方向的裁剪。較少使用鳄厌。
clip_horizontal 附加選項(xiàng)荞胡,表示水平方向的裁剪。較少使用了嚎。

  • ClipDrawable的裁剪程度由level控制泪漂,調(diào)用setLevel()可修改此值。其取值范圍為0~10000歪泳。0表示完全裁剪萝勤,即整個(gè)Drawable都不可見(jiàn);而10000表示不裁剪呐伞。也可將level理解為可見(jiàn)區(qū)域大小敌卓,0表示可見(jiàn)區(qū)最小,10000表示可見(jiàn)區(qū)最大荸哟。

自定義Drawable

  • Drawable的工作原理很簡(jiǎn)單假哎,其核心就是draw()。系統(tǒng)會(huì)調(diào)用Drawable的draw()來(lái)繪制View的背景或ImageView的圖像鞍历,于是我們可通過(guò)重寫(xiě)其draw()來(lái)實(shí)現(xiàn)自定義Drawable舵抹。

  • 通常我們沒(méi)有必要去自定義Drawable,因?yàn)闊o(wú)法在XML中使用自定義Drawable劣砍,這就降低了其使用范圍惧蛹。

  • 創(chuàng)建自定義Drawable,必須重寫(xiě)其draw()刑枝、setAlpha()香嗓、setColorFilter()getOpacity()等方法装畅。以下為自定義Drawable示例:

/**
 * 自定義Drawable
 * Created by daking on 16/9/15.
 */
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 rect =  getBounds();
        float cx = rect.exactCenterX();
        float cy = rect.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 colorFilter) {
        mPaint.setColorFilter(colorFilter);
        invalidateSelf();
    }
    
    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }
}
CustomDrawable drawable = new CustomDrawable(Color.BLUE);
imageView.setBackgroundDrawable(drawable);
  • 若自定義的Drawable有固有大小時(shí)靠娱,要重寫(xiě)getIntrinsicWidth()getIntrinsicHeight()。因?yàn)檫@兩個(gè)方法會(huì)影響到View的wrap_content布局掠兄。

  • 注意像云,Drawable的內(nèi)部大小不等于Drawable的實(shí)際區(qū)域大小锌雀。可通過(guò)getBounds()獲得Drawable的實(shí)際區(qū)域大小迅诬,一般與它的View尺寸相同腋逆。

我的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市侈贷,隨后出現(xiàn)的幾起案子惩歉,更是在濱河造成了極大的恐慌,老刑警劉巖俏蛮,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撑蚌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡搏屑,警方通過(guò)查閱死者的電腦和手機(jī)锨并,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)睬棚,“玉大人,你說(shuō)我怎么就攤上這事解幼∫值常” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵撵摆,是天一觀的道長(zhǎng)底靠。 經(jīng)常有香客問(wèn)我,道長(zhǎng)特铝,這世上最難降的妖魔是什么暑中? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮鲫剿,結(jié)果婚禮上鳄逾,老公的妹妹穿的比我還像新娘。我一直安慰自己灵莲,他們只是感情好雕凹,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著政冻,像睡著了一般枚抵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上明场,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天汽摹,我揣著相機(jī)與錄音,去河邊找鬼苦锨。 笑死逼泣,一個(gè)胖子當(dāng)著我的面吹牛趴泌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播圾旨,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼踱讨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了砍的?” 一聲冷哼從身側(cè)響起痹筛,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎廓鞠,沒(méi)想到半個(gè)月后帚稠,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡床佳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年滋早,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砌们。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡杆麸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出浪感,到底是詐尸還是另有隱情昔头,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布影兽,位于F島的核電站揭斧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏峻堰。R本人自食惡果不足惜讹开,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捐名。 院中可真熱鬧旦万,春花似錦、人聲如沸镶蹋。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)梅忌。三九已至狰腌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間牧氮,已是汗流浹背琼腔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留踱葛,地道東北人丹莲。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓光坝,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親甥材。 傳聞我的和親對(duì)象是個(gè)殘疾皇子盯另,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,522評(píng)論 25 707
  • Drawable有很多種,它們都表示一種圖像的概念洲赵,但它們又不全是圖片鸳惯,通過(guò)顏色也可以構(gòu)造出各式各樣的圖像的效果。...
    cooperise閱讀 494評(píng)論 0 7
  • 內(nèi)容抽屜菜單ListViewWebViewSwitchButton按鈕點(diǎn)贊按鈕進(jìn)度條TabLayout圖標(biāo)下拉刷新...
    皇小弟閱讀 46,712評(píng)論 22 664
  • 概述 今天我們來(lái)探究一下android的樣式叠萍。其實(shí)芝发,幾乎所有的控件都可以使用 background屬性去引用自定義...
    CokeNello閱讀 4,813評(píng)論 1 19
  • 倒不是我的感情多泛濫,但的確是想抓住一個(gè)人苛谷,一個(gè)值得的人傾盡所有去對(duì)他辅鲸。哪怕?lián)Q來(lái)的還是殊途,卻也不曾妄想過(guò)有...
    難像閱讀 161評(píng)論 0 0