android弧形进度条,有详细注释的,比较简单,感兴趣的朋友可以来看看。
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
|
package
com.demo.eric.views;
import
android.content.Context;
import
android.graphics.Canvas;
import
android.graphics.Color;
import
android.graphics.Paint;
import
android.graphics.Paint.Style;
import
android.graphics.RectF;
import
android.util.AttributeSet;
import
android.view.View;
/**
* 弧形进度条
*
* @author Eric
*
*/
public
class
ArcProgressbar
extends
View {
public
ArcProgressbar(Context context) {
super
(context);
}
public
ArcProgressbar(Context context, AttributeSet attrs) {
super
(context, attrs);
}
@Override
protected
void
onDraw(Canvas canvas) {
super
.onDraw(canvas);
init(canvas);
}
private
void
init(Canvas canvas) {
// 画弧形的矩阵区域。
rectBg =
new
RectF(
15
,
15
, diameter, diameter);
// 计算弧形的圆心和半径。
int
cx1 = (diameter +
15
) /
2
;
int
cy1 = (diameter +
15
) /
2
;
int
arcRadius = (diameter -
15
) /
2
;
// ProgressBar结尾和开始画2个圆,实现ProgressBar的圆角。
mPaintCircle =
new
Paint();
mPaintCircle.setAntiAlias(
true
);
mPaintCircle.setColor(bgColor);
canvas.drawCircle(
(
float
) (cx1 + arcRadius * Math.cos(startAngle *
3.14
/
180
)),
(
float
) (cy1 + arcRadius * Math.sin(startAngle *
3.14
/
180
)),
bgStrokeWidth /
2
, mPaintCircle);
// 小圆
canvas.drawCircle(
(
float
) (cx1 + arcRadius
* Math.cos((
180
- startAngle) *
3.14
/
180
)),
(
float
) (cy1 + arcRadius
* Math.sin((
180
- startAngle) *
3.14
/
180
)),
bgStrokeWidth /
2
, mPaintCircle);
// 小圆
// 弧形背景。
mPaintBg =
new
Paint();
mPaintBg.setAntiAlias(
true
);
mPaintBg.setStyle(Style.STROKE);
mPaintBg.setStrokeWidth(bgStrokeWidth);
mPaintBg.setColor(bgColor);
canvas.drawArc(rectBg, startAngle, endAngle,
false
, mPaintBg);
// 弧形小背景。
if
(showSmallBg) {
mPaintSmallBg =
new
Paint();
mPaintSmallBg.setAntiAlias(
true
);
mPaintSmallBg.setStyle(Style.STROKE);
mPaintSmallBg.setStrokeWidth(barStrokeWidth);
mPaintSmallBg.setColor(smallBgColor);
canvas.drawArc(rectBg, startAngle, endAngle,
false
, mPaintSmallBg);
}
// 弧形ProgressBar。
mPaintBar =
new
Paint();
mPaintBar.setAntiAlias(
true
);
mPaintBar.setStyle(Style.STROKE);
mPaintBar.setStrokeWidth(barStrokeWidth);
mPaintBar.setColor(barColor);
canvas.drawArc(rectBg, startAngle, progress,
false
, mPaintBar);
// 随ProgressBar移动的圆。
if
(showMoveCircle) {
mPaintCircle.setColor(barColor);
canvas.drawCircle(
(
float
) (cx1 + arcRadius
* Math.cos(angleOfMoveCircle *
3.14
/
180
)),
(
float
) (cy1 + arcRadius
* Math.sin(angleOfMoveCircle *
3.14
/
180
)),
bgStrokeWidth /
2
, mPaintCircle);
// 小圆
}
invalidate();
}
/**
*
* @param progress
*/
public
void
addProgress(
int
_progress) {
progress += _progress;
angleOfMoveCircle += _progress;
System.out.println(progress);
if
(progress > endAngle) {
progress =
0
;
angleOfMoveCircle = startAngle;
}
invalidate();
}
/**
* 设置弧形背景的画笔宽度。
*/
public
void
setBgStrokeWidth(
int
bgStrokeWidth) {
this
.bgStrokeWidth = bgStrokeWidth;
}
/**
* 设置弧形ProgressBar的画笔宽度。
*/
public
void
setBarStrokeWidth(
int
barStrokeWidth) {
this
.barStrokeWidth = barStrokeWidth;
}
/**
* 设置弧形背景的颜色。
*/
public
void
setBgColor(
int
bgColor) {
this
.bgColor = bgColor;
}
/**
* 设置弧形ProgressBar的颜色。
*/
public
void
setBarColor(
int
barColor) {
this
.barColor = barColor;
}
/**
* 设置弧形小背景的颜色。
*/
public
void
setSmallBgColor(
int
smallBgColor) {
this
.smallBgColor = smallBgColor;
}
/**
* 设置弧形的直径。
*/
public
void
setDiameter(
int
diameter) {
this
.diameter = diameter;
}
/**
* 是否显示小背景。
*/
public
void
setShowSmallBg(
boolean
showSmallBg) {
this
.showSmallBg = showSmallBg;
}
/**
* 是否显示移动的小圆。
*/
public
void
setShowMoveCircle(
boolean
showMoveCircle) {
this
.showMoveCircle = showMoveCircle;
}
private
int
bgStrokeWidth =
44
;
private
int
barStrokeWidth =
15
;
private
int
bgColor = Color.GRAY;
private
int
barColor = Color.RED;
private
int
smallBgColor = Color.WHITE;
private
int
progress =
0
;
private
int
angleOfMoveCircle =
140
;
// 移动小园的起始角度。
private
int
startAngle =
140
;
private
int
endAngle =
260
;
private
Paint mPaintBar =
null
;
private
Paint mPaintSmallBg =
null
;
private
Paint mPaintBg =
null
;
private
Paint mPaintCircle =
null
;
private
RectF rectBg =
null
;
/**
* 直徑。
*/
private
int
diameter =
450
;
private
boolean
showSmallBg =
true
;
// 是否显示小背景。
private
boolean
showMoveCircle =
true
;
// 是否显示移动的小园。
}
|