GradientDrawable與ShapeDrawable

引言:常規(guī)shape的用法

當(dāng)我們?cè)贏ndroid項(xiàng)目中畫(huà)一個(gè)圓角矩形的時(shí)候,我們通常會(huì)這樣先在res/drawable里建一個(gè)drawable resouce file,比如round_rect.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="@color/colorPrimary"/>
    <corners android:radius="10dp"/>
</shape>

然后在xml中設(shè)置給xml,或都直接用Drawable draw = getResources().getDrawable(R.drawable.round_rect);來(lái)實(shí)例化后使用句占。一直以來(lái)暮蹂,我以為shape對(duì)應(yīng)的是ShapeDrawable,然而我打個(gè)斷點(diǎn)然痊,看到的卻是這樣的

drawable的查看

沒(méi)錯(cuò),xml中的shape被解析后實(shí)例化的是GradientDrawable焦人,不相信的具體可以去查看源碼募疮。

GradientDrawable實(shí)例化用法

當(dāng)計(jì)設(shè)圖里有很多圓角背景草讶,但我們又不相創(chuàng)造那么多xml的時(shí)候逝嚎,就可以用GradientDrawable來(lái)實(shí)例化對(duì)象扁瓢。

/**
     * @param roundRadius
     *            圓角幅度
     * @param bgfillColor
     *            背景填充色
     * @param bgfillColorAlpha
     *            背景填充色透明度 double類(lèi)型范圍(0 ~ 1)
     * @param strokeWidth
     *            邊框?qū)挾?(0 無(wú)邊框)
     * @param strokeColor
     *            邊框顏色
     * @return
     */
    public static GradientDrawable myCustomShape(int roundRadius,
            int bgfillColor, double bgfillColorAlpha, int strokeWidth,
            int strokeColor) {
        GradientDrawable gradientDrawable = new GradientDrawable();
        if (0 != bgfillColorAlpha) {// 設(shè)置為0 則為全透明 不需要設(shè)置以下參數(shù)
            gradientDrawable.setColor(bgfillColor);
            gradientDrawable.setAlpha((int) (bgfillColorAlpha * 255));
        }
        gradientDrawable.setCornerRadius(roundRadius);
        gradientDrawable.setStroke(strokeWidth, strokeColor == 0 ? bgfillColor
                : strokeColor);
        return gradientDrawable;
    }

當(dāng)然你也可以給每個(gè)角設(shè)置不同的圓角弧度,如果是有兩種狀態(tài)的补君,則可以用StateListDrawable,比如

/**
     * // 1引几、2兩個(gè)參數(shù)表示左上角,3挽铁、4表示右上角伟桅,5、6表示右下角叽掘,7楣铁、8表示左下角
     * @param nor_bg
     * @param nor_stroke
     * @param sel_bg
     * @param sel_stroke
     * @param topLeft
     * @param bottomLeft
     * @param topRight
     * @param bottomRight
     * @return
     */
    public static Drawable getDrawable(int nor_bg,int nor_stroke,int sel_bg,int sel_stroke, int topLeft, int bottomLeft, int topRight,
            int bottomRight){
        StateListDrawable bg = new StateListDrawable();
        GradientDrawable normal_drawable = new GradientDrawable();
        normal_drawable.setColor(nor_bg);
        normal_drawable.setCornerRadii(new float[] { topLeft, topLeft,
                topRight, topRight, bottomRight, bottomRight, bottomLeft,
                bottomLeft });
        normal_drawable.setStroke(Util.toDip(1), sel_stroke);

        GradientDrawable checked_drawable = new GradientDrawable();
        checked_drawable.setColor(sel_bg);
        checked_drawable.setCornerRadii(new float[] { topLeft, topLeft,
                topRight, topRight, bottomRight, bottomRight, bottomLeft,
                bottomLeft });
        checked_drawable.setStroke(Util.toDip(1), sel_stroke);

        bg.addState(new int[] { android.R.attr.state_checked },
                checked_drawable);
        bg.addState(new int[] {}, normal_drawable);
        return bg;
    }

更多的屬性大家可以根據(jù)需要自己進(jìn)行封裝。

ShapeDrawable實(shí)例化用法

說(shuō)完GradientDrawable,我們來(lái)看一下ShapeDrawable怎么用呢更扁。其實(shí)在沒(méi)有用GradientDrawable之前民褂,我是一直在用ShapeDrawable來(lái)寫(xiě)這種背景的

static public ShapeDrawable getRoundRect(int color,float roundLeftTop,float roundRightTop,float roundRightBottom,float roundLeftBottom){
        ShapeDrawable shapeDrawable = new ShapeDrawable();
        float[] outRadii=new float[]{roundLeftTop,roundLeftTop,roundRightTop,roundRightTop,roundRightBottom,roundRightBottom,roundLeftBottom,roundLeftBottom};
        RoundRectShape shape=new RoundRectShape(outRadii,null,null);

        shapeDrawable.setShape(shape);
        shapeDrawable.getPaint().setColor(color);
        return shapeDrawable;
    }

有沒(méi)有發(fā)現(xiàn)RoundRectShape 第二個(gè)第三個(gè)參數(shù)傳的都是null.
public RoundRectShape(@Nullable float[] outerRadii, @Nullable RectF inset, @Nullable float[] innerRadii) 這個(gè)類(lèi)一共有3個(gè)參數(shù),我在上面的注解已經(jīng)說(shuō)明了.

注意!這3個(gè)參數(shù)都是可以為null的.意思就是,你可以取消任意一個(gè).獲得一些其他效果,比如設(shè)置第二個(gè)和第三個(gè)參數(shù)為null,你就可以得到一個(gè)實(shí)心的圓角矩形.

如果你給后兩個(gè)參數(shù)設(shè)置了,效果圖大概是這個(gè)樣子:


image.png

innerRadii 比較好理解就是圓角的弧度疯潭,inset 代表的是圖里面黑色部分的厚度赊堪,中間白色的部分其實(shí)是父對(duì)象的背景。

ShapeDrawable除了可以畫(huà)GradientDrawable能畫(huà)的純色圖外竖哩,還可以畫(huà)很多別的圖形哭廉,比如扇形,或者是自定義的path圖相叁。更多關(guān)于ShapeDrawable用法可以參考Android開(kāi)發(fā) ShapeDrawable詳解

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末遵绰,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子增淹,更是在濱河造成了極大的恐慌椿访,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虑润,死亡現(xiàn)場(chǎng)離奇詭異成玫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)拳喻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)哭当,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人冗澈,你說(shuō)我怎么就攤上這事钦勘。” “怎么了亚亲?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵彻采,是天一觀(guān)的道長(zhǎng)腐缤。 經(jīng)常有香客問(wèn)我,道長(zhǎng)肛响,這世上最難降的妖魔是什么岭粤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮终惑,結(jié)果婚禮上绍在,老公的妹妹穿的比我還像新娘。我一直安慰自己雹有,他們只是感情好偿渡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著霸奕,像睡著了一般溜宽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上质帅,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天适揉,我揣著相機(jī)與錄音,去河邊找鬼煤惩。 笑死嫉嘀,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的魄揉。 我是一名探鬼主播剪侮,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼洛退!你這毒婦竟也來(lái)了瓣俯?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤兵怯,失蹤者是張志新(化名)和其女友劉穎彩匕,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體媒区,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驼仪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驻仅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谅畅。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖噪服,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胜茧,我是刑警寧澤粘优,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布仇味,位于F島的核電站,受9級(jí)特大地震影響雹顺,放射性物質(zhì)發(fā)生泄漏丹墨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一嬉愧、第九天 我趴在偏房一處隱蔽的房頂上張望贩挣。 院中可真熱鬧,春花似錦没酣、人聲如沸王财。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)绒净。三九已至,卻和暖如春偿衰,著一層夾襖步出監(jiān)牢的瞬間挂疆,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工下翎, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缤言,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓视事,卻偏偏與公主長(zhǎng)得像胆萧,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子郑口,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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