IMGRigTopPointView.java
4.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
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("设置的模式有误");
}
}
}