android自定义控件显示小红点

package baize.bigvision.client.widgt;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.widget.TextView;

import baize.bigvision.client.R;
import baize.bigvision.client.utils.MobileInfoUtils;

/**
 * Created by   xiaobingliu
 * Copyright:   BaiZe ShangHai
 * Date:        2017/12/13
 * Description: 提示标签,支持椭圆与不同的颜色显示,本类支持扩展
 */

public class BZBadgeView extends TextView{

    private Context mContext;
    private int DEFAULT_WIDTH = 400;
    private int DEFAULT_HEIGHT = 100;
    private Paint mPaint;
    private String tips;
    private int width;
    private int height;
    private int tipsColor;
    private int tipsFontSize;
    private int tipsRadius;
    private int tipsTextColor;
    private String tipsText;
    private boolean bIsShowTipsText;
    private TipsType eType;
    private RectF roundRect;

    public void showTipsText(boolean show){
        bIsShowTipsText = show;
    }

    public String getTips() {
        return tips;
    }

    public void setTips(String tips) {
        this.tips = tips;
    }

    public void setType(TipsType type){
        this.eType = type;
    }

    public BZBadgeView(Context context) {
        super(context);
        initAttr(context,null);
    }

    public BZBadgeView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initAttr(context,attrs);
    }

    public BZBadgeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initAttr(context,attrs);
    }

    private void initAttr(Context context, AttributeSet attrs){
        this.mContext = context;
        TypedArray array = mContext.obtainStyledAttributes(attrs, R.styleable.BZBadgeAttr);
        int n = array.getIndexCount();
        for (int i = 0; i < n; i++) {
            int attr = array.getIndex(i);
            switch (attr) {
                case R.styleable.BZBadgeAttr_tips_color:
                    tipsColor = array.getColor(attr, Color.RED);
                    break;
                case R.styleable.BZBadgeAttr_tips_font_size:
                    tipsFontSize = array.getDimensionPixelSize(attr, MobileInfoUtils.dp2px(context,10));
                    break;

                case R.styleable.BZBadgeAttr_tips_radius:
                    tipsRadius = array.getDimensionPixelSize(attr, MobileInfoUtils.dp2px(context,10));
                    break;

                case R.styleable.BZBadgeAttr_show_tips:
                    bIsShowTipsText = array.getBoolean(attr,false);
                    break;
                case R.styleable.BZBadgeAttr_tips_text:
                    tipsText = array.getString(attr);
                    break;
                case R.styleable.BZBadgeAttr_tips_textColor:
                    tipsTextColor = array.getColor(attr,Color.WHITE);
                    break;

                default:
                    break;
            }
        }

        array.recycle();


        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setStrokeWidth(1);

        roundRect = new RectF();


    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);

        //只处理 wrap_content 情况 给定一个默认宽高
        //MeasureSpec.EXACTLY 具体的像素值或者match_parent,直接设会生效故不处理
        if (widthSpecMode == MeasureSpec.AT_MOST && heightSpecMode == MeasureSpec.AT_MOST) {
            setMeasuredDimension(Math.min(MobileInfoUtils.dp2px(mContext, DEFAULT_WIDTH), widthSpecSize), Math.min(MobileInfoUtils.dp2px(mContext, DEFAULT_HEIGHT), heightSpecSize));
        } else if (widthSpecMode == MeasureSpec.AT_MOST) {
            setMeasuredDimension(Math.min(MobileInfoUtils.dp2px(mContext, DEFAULT_WIDTH), widthSpecSize), heightSpecSize);
        } else if (heightSpecMode == MeasureSpec.AT_MOST) {
            setMeasuredDimension(widthSpecSize, Math.min(MobileInfoUtils.dp2px(mContext, DEFAULT_HEIGHT), heightSpecSize));
        }
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        width = getWidth();
        height = getHeight();
    }

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

        mPaint.setColor(tipsColor);
        canvas.drawCircle(width - tipsRadius,tipsRadius + 10,tipsRadius,mPaint);

        if(bIsShowTipsText && !TextUtils.isEmpty(tipsText)){

            mPaint.setColor(tipsTextColor);

            canvas.drawText(tipsText,width - tipsRadius - mPaint.measureText(tipsText,0,tipsText.length()),
                    tipsRadius + getFontHeight(tipsFontSize) / 2,mPaint);
        }

        roundRect.left = width - 100;
        roundRect.top = height - 80;
        roundRect.right = width - 10;
        roundRect.bottom = height - 20;


        canvas.drawRoundRect(roundRect,15,15,mPaint);

        mPaint.setColor(Color.RED);
        canvas.drawText(tipsText + 23,
                roundRect.left + 90 / 2  - mPaint.measureText(tipsText,0,tipsText.length()) / 2,
                        roundRect.top + 60 / 2 - 10 + getFontHeight(tipsFontSize) / 2,
                        mPaint);


    }

    /**
     * tips样式
     */
    public enum TipsType{

        CIRCLE,
        ROUNDRECT,
    }

    /**
     * 根据字字体获取字体高度
     *
     * @param fontSize
     * @return
     */
    public int getFontHeight(float fontSize) {
        mPaint.setTextSize(fontSize);
        Paint.FontMetrics fm = mPaint.getFontMetrics();
        return (int) Math.ceil(fm.descent - fm.top) + 2;
    }



}
 
 
 
 
 
 
 
 
 
 
 
 
属性文件 :
 
 
 
 
<!--带小点提示的文本属性值-->
<declare-styleable name="BZBadgeAttr">
    <attr name="tips_color" format="color"/>
    <attr name="tips_font_size" format="dimension"/>
    <attr name="tips_radius" format="dimension"/>
    <attr name="show_tips" format="boolean" />
    <attr name="tips_text" format="string" />
    <attr name="tips_textColor" format="color"/>
</declare-styleable>

猜你喜欢

转载自blog.csdn.net/d06110902002/article/details/78796040
今日推荐