自定義支持圓角的TextView

給textview添加圓角

如果想給一個普通的textview添加圓角、邊框等,一般的做法是寫一個drawable文件,通過android:background="@drawable/xxxx"設置為textview的背景。麻煩是不麻煩,可是如果項目里出現了很多需要圓角或者邊框的需求時,drawable文件會變得很多很亂,維護起來也十分不方便。

如果直接可以通過屬性設置radius border borderWidth等屬性值,就會方便很多。github上有一個 SuperTextView ,可以實現。但是功能太多太雜了。搜了搜網上的寫法,基本都是重新定義view,重寫onDraw onMeasure ,可是這些功能textview都有,沒必要,況且重寫之后,textview的很多功能就沒了。

這里的思路是,通過繼承TextView來自定義Textview,利用代碼來控制drawable文件。代碼創建drawable文件的方式如下:

自定義view的方式有三種:組合、繼承、完全自定義

GradientDrawable gd = new GradientDrawable();//創建drawable
gd.setColor(rtvBgColor);
gd.setCornerRadius(rtvRadius);

所以方法就是,自定義屬性,通過屬性值創建drawable文件控制圓角、邊框等。如果不設置自定義屬性,和一個普通TextView沒有任何差別!

代碼

/**
 * 支持圓角的TextView
 * Created by stephen on 2017/12/18.
 */
public class RoundTextView extends android.support.v7.widget.AppCompatTextView {

    public RoundTextView(Context context) {
        this(context, null);
    }

    public RoundTextView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public RoundTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        TypedArray attributes = context.getTheme().obtainStyledAttributes(attrs, R.styleable.RoundTextView, defStyleAttr, 0);

        if (attributes != null) {

            int rtvBorderWidth = attributes.getDimensionPixelSize(R.styleable.RoundTextView_rtvBorderWidth, 0);
            int rtvBorderColor = attributes.getColor(R.styleable.RoundTextView_rtvBorderColor, Color.BLACK);
            float rtvRadius = attributes.getDimension(R.styleable.RoundTextView_rtvRadius, 0);
            int rtvBgColor = attributes.getColor(R.styleable.RoundTextView_rtvBgColor, Color.WHITE);
            attributes.recycle();

            GradientDrawable gd = new GradientDrawable();//創建drawable
            gd.setColor(rtvBgColor);
            gd.setCornerRadius(rtvRadius);
            if (rtvBorderWidth > 0) {
                gd.setStroke(rtvBorderWidth, rtvBorderColor);
            }

            this.setBackground(gd);
        }
    }

    public void setBackgroungColor(@ColorInt int color) {
        GradientDrawable myGrad = (GradientDrawable) getBackground();
        myGrad.setColor(color);
    }
}

attr中添加屬性

<!--支持圓角的TextView-->
<declare-styleable name="RoundTextView">
    <attr name="rtvBgColor" format="color"/>
    <attr name="rtvBorderWidth" format="dimension"/>
    <attr name="rtvBorderColor" format="dimension"/>
    <attr name="rtvRadius" format="dimension"/>
</declare-styleable>

代碼使用

 <io.github.imwyy.RoundTextView
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:text="瀏覽"
                android:textColor="@color/text_black_select_color"
                android:textSize="@dimen/sp_14"
                app:rtvRadius="6dp"
                app:rtvBgColor="@color/colorSearchArea"/>

這樣顯然就方便很多了。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • ¥開啟¥ 【iAPP實現進入界面執行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個線程,因...
    小菜c閱讀 6,535評論 0 17
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,368評論 25 708
  • 前言 如上圖所示,相信可愛的安卓程序猿們在開發中經常會遇到這種樣式的UI開發。其實上面這種布局很簡單,沒有難度,只...
    笑哥哥閱讀 3,898評論 0 4
  • 2046 —————— 我有話想跟你說 有很多 所有神經元至舌尖 一切可能的逃脫 —————— 一些詞句被排列 比...
    嚼水仙的貓閱讀 166評論 0 0
  • 早上和媽媽聊到我的飲食習慣,想起來在lakeside遇到的幾個人路過一個叫等風來的飯店去蘭花吃中餐。路過的時候覺得...
    scot0714閱讀 258評論 0 1