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>