android 自定義 按鈕, 實(shí)現(xiàn)不同角的圓角 ,添加邊框

image.png

布局中寫法

<ZTButton
            android:layout_width="300dp"
            android:layout_height="100dp"
            android:layout_gravity="center"
            android:layout_margin="20dp"
            android:text="圓角按鈕"
            android:textColor="#ffffff"
            android:textSize="30sp"
            zt_btn:bgColor="@color/colorPrimaryDark"
            zt_btn:borderColor="#ff0000"
            zt_btn:borderWidth="5dp"
            zt_btn:bottom_left_radius="0"
            zt_btn:bottom_right_radius="100"
            zt_btn:radius="20"
            zt_btn:shape="rectangle"
            zt_btn:top_left_radius="100"
            zt_btn:top_right_radius="0" />

attrs.xml 文件中添加如下代碼

 <declare-styleable name="ZTButton">
        <attr name="bgColor" format="color" /><!--背景顏色-->
        <attr name="borderWidth" format="dimension" /><!--邊框?qū)挾?->
        <attr name="borderColor" format="color" /><!--邊框顏色-->
        <attr name="radius" format="float" /><!--圓角-->
        <attr name="top_left_radius" format="float" /><!--圓角左上-->
        <attr name="top_right_radius" format="float" /><!--圓角右上-->
        <attr name="bottom_left_radius" format="float" /><!--圓角左下-->
        <attr name="bottom_right_radius" format="float" /><!--圓角右下-->
        <attr name="shape">
            <enum name="rectangle" value="0" /><!--矩形(圓角矩形)-->
            <enum name="oval" value="1" /><!--橢圓逐样,圓-->
            <enum name="line" value="2" /><!--線-->
            <enum name="ring" value="3" /><!--圓環(huán)-->
        </attr>
    </declare-styleable>

控件代碼


/**
 * 作者:zt
 * 時(shí)間:on 18/12/26
 * 說明: 自定義 按鈕, 實(shí)現(xiàn)不同角的圓角 ,添加邊框
 */
public class ZTButton extends android.support.v7.widget.AppCompatButton {
    //形狀 圖
    private GradientDrawable shapeDrawable;

    public ZTButton(Context context) {
        super(context);
    }

    public ZTButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ZTButton);
        if (a != null) {
            //背景顏色
            int bgColor = a.getColor(R.styleable.ZTButton_bgColor, 0);
            setBgColor(bgColor);
            //獲取形狀
            int shape = a.getInteger(R.styleable.ZTButton_shape, 0);
            setShape(shape);
            //獲取圓角
            float radius = a.getFloat(R.styleable.ZTButton_radius, 0);
            setRadius(radius);
            //獲取左上圓角
            float topLeftRadius = a.getFloat(R.styleable.ZTButton_top_left_radius, 0);
            //獲取右上圓角
            float topRightRadius = a.getFloat(R.styleable.ZTButton_top_right_radius, 0);
            //獲取左下圓角
            float bottomLeftRadius = a.getFloat(R.styleable.ZTButton_bottom_left_radius, 0);
            //獲取右下圓角
            float bottomRightRadius = a.getFloat(R.styleable.ZTButton_bottom_right_radius, 0);
            if (topLeftRadius != 0 || bottomLeftRadius != 0 || topRightRadius != 0 || bottomRightRadius != 0) {
                setRadius(topLeftRadius, topRightRadius, bottomLeftRadius, bottomRightRadius);
            }
            //邊框?qū)挾?            int borderWidth = (int) a.getDimension(R.styleable.ZTButton_borderWidth, 0);
            //邊框顏色
            int borderColor = a.getColor(R.styleable.ZTButton_borderColor, bgColor);
            setBorder(borderWidth, borderColor);
        }
    }

    /**
     * 設(shè)置邊框
     *
     * @param borderColor 邊框顏色
     * @param borderWidth 邊框?qū)挾?     */
    private void setBorder(int borderWidth, @ColorInt int borderColor) {
        getGradientDrawable();
        shapeDrawable.setStroke(borderWidth, borderColor);
        setDrawable(shapeDrawable);
    }

    /**
     * 設(shè)置背景顏色
     *
     * @param bgColor
     */
    private void setBgColor(@ColorInt int bgColor) {
        getGradientDrawable();
        shapeDrawable.setColor(bgColor);
        setDrawable(shapeDrawable);
    }


    /**
     * 設(shè)置圓角
     *
     * @param radius 角度
     */
    private void setRadius(float radius) {
        getGradientDrawable();
        shapeDrawable.setCornerRadius(radius);
        setDrawable(shapeDrawable);
    }


    /**
     * 設(shè)置圓角
     *
     * @param topLeftRadius     左上
     * @param topRightRadius    右上
     * @param bottomLeftRadius  左下
     * @param bottomRightRadius 右下
     */
    private void setRadius(float topLeftRadius, float topRightRadius, float bottomLeftRadius, float bottomRightRadius) {
        getGradientDrawable();
        shapeDrawable.setCornerRadii(new float[]{
                topLeftRadius, topLeftRadius,
                topRightRadius, topRightRadius,
                bottomRightRadius, bottomRightRadius,
                bottomLeftRadius, bottomLeftRadius
        });
        setDrawable(shapeDrawable);
    }


    /**
     * 設(shè)置圖形類型
     *
     * @param shape 形狀
     */
    private void setShape(int shape) {
        getGradientDrawable();
        shapeDrawable.setShape(shape);
        setDrawable(shapeDrawable);
    }


    /**
     * 設(shè)置背景
     *
     * @param drawable 背景
     */
    private void setDrawable(Drawable drawable) {
        setBackgroundDrawable(drawable);
    }

    /**
     * 獲取需要設(shè)置到背景的圖片
     */
    private void getGradientDrawable() {
        if (shapeDrawable == null) {
            shapeDrawable = new GradientDrawable();
        }
    }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市交惯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖逗鸣,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贞让,死亡現(xiàn)場離奇詭異,居然都是意外死亡甜无,警方通過查閱死者的電腦和手機(jī)扛点,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岂丘,“玉大人陵究,你說我怎么就攤上這事“铝保” “怎么了铜邮?”我有些...
    開封第一講書人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我松蒜,道長扔茅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任牍鞠,我火速辦了婚禮咖摹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘难述。我一直安慰自己萤晴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開白布胁后。 她就那樣靜靜地躺著店读,像睡著了一般。 火紅的嫁衣襯著肌膚如雪攀芯。 梳的紋絲不亂的頭發(fā)上屯断,一...
    開封第一講書人閱讀 49,185評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音侣诺,去河邊找鬼殖演。 笑死,一個(gè)胖子當(dāng)著我的面吹牛年鸳,可吹牛的內(nèi)容都是我干的趴久。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼搔确,長吁一口氣:“原來是場噩夢啊……” “哼彼棍!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起膳算,我...
    開封第一講書人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤座硕,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后涕蜂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體华匾,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年机隙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瘦真。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡黍瞧,死狀恐怖诸尽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情印颤,我是刑警寧澤您机,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響际看,放射性物質(zhì)發(fā)生泄漏咸产。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一仲闽、第九天 我趴在偏房一處隱蔽的房頂上張望脑溢。 院中可真熱鬧,春花似錦赖欣、人聲如沸屑彻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽社牲。三九已至,卻和暖如春悴了,著一層夾襖步出監(jiān)牢的瞬間搏恤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來泰國打工湃交, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留熟空,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓搞莺,卻偏偏與公主長得像痛阻,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子腮敌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

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

  • 【Android 自定義View】 [TOC] 自定義View基礎(chǔ) 接觸到一個(gè)類,你不太了解他俏扩,如果貿(mào)然翻閱源碼只...
    Rtia閱讀 3,936評(píng)論 1 14
  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程糜工,因...
    小菜c閱讀 6,358評(píng)論 0 17
  • Day1: 在代碼中通過R.string.hello_world可以獲得該字符串的引用; 在XML中通過@stri...
    冰凝雪國閱讀 1,386評(píng)論 0 5
  • 如果我沒有讀懂一首詩我就不會(huì)叫好可我經(jīng)常讀不懂現(xiàn)在的詩 關(guān)于詩聽說不能直白不能用人人都用的詞 得委婉得含蓄得留白否...
    真小實(shí)閱讀 271評(píng)論 11 10
  • 每當(dāng)一個(gè)年頭快結(jié)束的時(shí)候總想著寫點(diǎn)總結(jié)录淡,今年也不例外捌木。一直在等老公的博士錄取結(jié)果,想著要是真能錄取嫉戚,2017也算完...
    小胖熊2018閱讀 100評(píng)論 0 0