一个colortagview,告别繁琐的xml

看一眼上次写博客的时间,俨然已经过去了好久,必须要写写什么了,因为代码才能让人觉得内心的平静。。。OK,废话不多说,在项目中有时候可能遇到下面的效果如图
这里写图片描述
一般人一看这个简单只需要配置drawable下的xml不就完了么,但是如果你需要加载多个且每个的颜色还都不一样,你还是要写xml么,显然是不太合适的。要实现这样的就是给个自定义view添加背景同时确定绘制的view在其中心就OK了
so.看具体的代码

package com.vc.view.colortagview;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;

/**
 * Created by vc on 2017/7/5.
 */

public class ColorTagView extends View {

    private int width;

    private int height;

    private int mTagRadius;

    private int mTagBgColor;

    private String mTagText;

    private int mTagTextSize;

    private int mTagTextColor;



    public static final int FILL =0;

    public static final int STROKE= 1;

    private int mTagBgStyle;

    private int mTagBgStrokeWidth;
    RectF rectF;

    Paint  paint  =new Paint(Paint.ANTI_ALIAS_FLAG);

    private Paint mTextPaint =new Paint(Paint.ANTI_ALIAS_FLAG);;

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

    public ColorTagView(Context context,  AttributeSet attrs) {
        this(context, attrs,0);
    }

    public ColorTagView(Context context,  AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);

        TypedArray array = context.obtainStyledAttributes(attrs,R.styleable.ColorTagView);

        mTagRadius = array.getDimensionPixelSize(R.styleable.ColorTagView_tag_radius,dp2px(20));

        mTagBgColor = array.getColor(R.styleable.ColorTagView_tag_bg,Color.WHITE);

        mTagBgStyle = array.getInt(R.styleable.ColorTagView_tag_bg_style,FILL);

        mTagBgStrokeWidth  =array.getDimensionPixelSize(R.styleable.ColorTagView_tag_bg_stroke_width,dp2px(1));

        mTagText  = array.getString(R.styleable.ColorTagView_tag_text);

        mTagTextSize = array.getDimensionPixelSize(R.styleable.ColorTagView_tag_textSize,sp2px(14));

        mTagTextColor = array.getColor(R.styleable.ColorTagView_tag_textColor,Color.BLACK);




        array.recycle();



        mTextPaint.setTextSize(mTagTextSize);



    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightMode= MeasureSpec.getMode(heightMeasureSpec);


        if(widthMode ==MeasureSpec.EXACTLY ){

              width = MeasureSpec.getSize(widthMeasureSpec);

        }else if(widthMode ==MeasureSpec.AT_MOST || widthMode ==MeasureSpec.UNSPECIFIED) {


              width = (int) mTextPaint.measureText(mTagText) + getPaddingLeft() +getPaddingRight();
        }


        if(heightMode ==MeasureSpec.EXACTLY){

            height = MeasureSpec.getSize(heightMeasureSpec);

        }else  if(heightMode ==MeasureSpec.AT_MOST || heightMode ==MeasureSpec.UNSPECIFIED) {


            Paint.FontMetrics fontMetrics = mTextPaint.getFontMetrics();

            height  = (int) (fontMetrics.bottom - fontMetrics.top) + getPaddingTop() + getPaddingBottom();

        }

        setMeasuredDimension(width,height);


    }






    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        paint.setColor(mTagBgColor);
        if(mTagBgStyle == FILL){
            paint.setStyle(Paint.Style.FILL);
        }else {
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeWidth(mTagBgStrokeWidth);
        }


        if(mTagBgStyle == STROKE){
            rectF =new RectF(mTagBgStrokeWidth,mTagBgStrokeWidth,getMeasuredWidth() -mTagBgStrokeWidth,getMeasuredHeight()-mTagBgStrokeWidth );

            canvas.drawRoundRect(rectF,mTagRadius,mTagRadius,paint);
        }else {
            rectF =new RectF(0,0,getMeasuredWidth(),getMeasuredHeight());


            canvas.drawRoundRect(rectF,mTagRadius,mTagRadius,paint);
        }



        mTextPaint.setColor(mTagTextColor);


        // 计算绘制文本的高度
        Paint.FontMetrics fontMetrics = mTextPaint.getFontMetrics();

        int textHeight = (int) (getMeasuredHeight() / 2 - fontMetrics.descent + (fontMetrics.bottom - fontMetrics.top) / 2);


        canvas.drawText(mTagText,getPaddingLeft(),textHeight,mTextPaint);



    }

    public int getTagRadius() {
        return mTagRadius;
    }

    public void setTagRadius(int tagRadius) {
        mTagRadius = dp2px(tagRadius);
    }

    public int getTagBgColor() {
        return mTagBgColor;
    }

    public void setTagBgColor(int tagBgColor) {
        mTagBgColor = tagBgColor;
    }

    public String getTagText() {
        return mTagText;
    }

    public void setTagText(String tagText) {
        mTagText = tagText;
    }

    public int getTagTextSize() {
        return mTagTextSize;
    }

    public void setTagTextSize(int tagTextSize) {
        mTagTextSize = tagTextSize;
    }

    public int getTagTextColor() {
        return mTagTextColor;
    }

    public void setTagTextColor(int tagTextColor) {
        mTagTextColor = tagTextColor;
    }

    public int getTagBgStyle() {
        return mTagBgStyle;
    }

    public void setTagBgStyle(int tagBgStyle) {
        mTagBgStyle = tagBgStyle;
    }

    public int getTagBgStrokeWidth() {
        return mTagBgStrokeWidth;
    }

    public void setTagBgStrokeWidth(int tagBgStrokeWidth) {
        mTagBgStrokeWidth = tagBgStrokeWidth;
        paint.setStrokeWidth(dp2px(mTagBgStrokeWidth));
        invalidate();

    }

    public int sp2px(int spVal) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, spVal, getResources().getDisplayMetrics());
    }

    public int dp2px(int dpVal) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpVal, getResources().getDisplayMetrics());

    }



}

接下来是自定义的属性

<?xml version="1.0" encoding="utf-8"?>
<resources>


    <declare-styleable name="ColorTagView">

        <attr name="tag_bg" format="color"></attr>   <!-- backgroud tagview   背景颜色-->

        <attr name="tag_bg_style" format="enum">     <!-- tag style   显示样式-->
            <enum name="FILL" value="0"></enum>

            <enum name="STROKE" value="1"></enum>
        </attr>

        <attr name="tag_bg_stroke_width" format="dimension"></attr>   <!-- stoke width   -->

        <attr name="tag_text" format="string"></attr>                <!--tag text -->

        <attr name="tag_textSize" format="dimension"></attr>          <!-- tag text size  字体大小-->

        <attr name="tag_textColor" format="color"></attr>             <!-- text color  字体颜色 -->

        <attr name="tag_radius" format="dimension"></attr>            <!--tag  radius   -->


    </declare-styleable>
</resources>

OK一个简单的tagview就OK了,同时详细用法—->colortagview 欢迎拍砖

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值