IMGRigTopPointView.java 4.34 KB
package com.sw.laryngoscope.widget;


import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.widget.ImageView;

import androidx.annotation.Nullable;

@SuppressLint("AppCompatCustomView")
public class IMGRigTopPointView extends ImageView {
    // 默认模式
    private int pointMode = NUMBER_POINT;
    // 1.不显示红点
    public static final int NO_POINT = 1;
    // 2.只显示一个红点,表示有新消息
    public static final int ONLY_POINT = 2;
    // 3.显示一个红点,红点中间还有消息的数量
    public static final int NUMBER_POINT = 3;
    //设置圆的X轴,Y轴坐标
    private float PNUMX;
    private float PNUMY;
    private float cx;
    private float cy;
    private float radius;
    //消息的数量
    private  int  number = 0;
    //记录当前是否有新消息
    public boolean  isHaveMesage = false;
    //画圆
    private Paint paint;
    // 画消息条数,有未画先知的功能,可以提前知道需要画的文字的长宽
    private TextPaint paintText;

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

    public IMGRigTopPointView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        initView(context,attrs);
    }

    private void initView(Context context, @Nullable AttributeSet attrs){
        //画圆
        paint = new Paint();
        //设置圆形状
        paint.setStyle(Paint.Style.FILL);
        //设置圆背景色
        //ContextCompat.getColor(context, R.color.circle_color)
        paint.setColor(Color.parseColor("#F98945"));
        //抗锯齿
        paint.setAntiAlias(true);

        //设置文字
        paintText = new TextPaint();
        //设置字体颜色
        paintText.setColor(Color.WHITE);
        //设置显示条数的文本大小
        paintText.setTextSize(12);
        //抗锯齿
        paintText.setAntiAlias(true);
        //设置字体样式
        paint.setStyle(Paint.Style.FILL);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //if (!isHaveMesage)return;
        switch (pointMode){
            case NO_POINT:
                //不显示红点
                break;
            case ONLY_POINT:
                //只显示红点
                //canvas.drawCircle(getWidth()-getPaddingRight(),getPaddingTop(),getPaddingRight()-10,paint);
                break;
            case NUMBER_POINT:
                //显示红点和对应数字
                //canvas.drawCircle(getWidth()-getPaddingRight(),getPaddingTop(),getPaddingRight()-10,paint);
                canvas.drawCircle(getWidth() - 17, getHeight() - 17,12, paint);
                //设置文字基准线
                String tvTextName = "";
                if ( number >= 0 && number <= 999 ) {
                    tvTextName = number + "";
                } else {
                    tvTextName = "999";
                }
                //测量文字内容的宽度
                float tvWidth = paintText.measureText(tvTextName);
                //图片右顶点减去文本的一半,使文本中心与图片右顶点重合
                float x = getWidth() - getPaddingRight() - tvWidth / 2 - 18;
                //y抽坐标,文字的基准线为图片右顶点下面点
                float y = (float) (getHeight() - getPaddingTop() - paintText.getFontMetrics().bottom*1.5 - 6);
                canvas.drawText(tvTextName, x, y - 1, paintText);
                break;
            default:
                break;
        }
    }
    /**
     * 设置消息条数
     */
    public void setMessageNum(int number) {
        this.number = number;
        invalidate();
    }

    /**
     * 是否有新消息
     * @param isHaveMesage true代表有
     */
    public void setHaveMesage(boolean isHaveMesage) {
        this.isHaveMesage = isHaveMesage;
        //如果不能即时刷新,使用postInvalidate()就好了
        invalidate();
    }
    /**
     * 设置显示模式
     * @param mode
     */
    public void setPointMode(int mode) {
        if ( mode > 0 && mode <= 3 ) {
            pointMode = mode;
        } else {
            throw new RuntimeException("设置的模式有误");
        }
    }

}