首页
IT
登录
6mi
u
盘
搜
搜 索
IT
自定义progressBar
自定义progressBar
xiaoxiao
2021-03-26
22
public
class
CirclePgBar
extends
View
{
private
Paint
mBackPaint
;
private
Paint
mFrontPaint
;
private
Paint
mTextPaint
;
private
float
mStrokeWidth
=
50
;
private
float
mHalfStrokeWidth
=
mStrokeWidth
/
2
;
private
float
mRadius
=
200
;
private
RectF
mRect
;
private
int
mProgress
=
0
;
//目标值,想改多少就改多少
private
int
mTargetProgress
=
90
;
private
int
mMax
=
100
;
private
int
mWidth
;
private
int
mHeight
;
public
CirclePgBar
(
Context
context
)
{
super
(
context
);
init
();
}
public
CirclePgBar
(
Context
context
,
AttributeSet
attrs
)
{
super
(
context
,
attrs
);
init
();
}
public
CirclePgBar
(
Context
context
,
AttributeSet
attrs
,
int
defStyleAttr
)
{
super
(
context
,
attrs
,
defStyleAttr
);
init
();
}
//完成相关参数初始化
private
void
init
()
{
mBackPaint
=
new
Paint
();
mBackPaint
.
setColor
(
Color
.
WHITE
);
mBackPaint
.
setAntiAlias
(
true
);
mBackPaint
.
setStyle
(
Paint
.
Style
.
STROKE
);
mBackPaint
.
setStrokeWidth
(
mStrokeWidth
);
mFrontPaint
=
new
Paint
();
mFrontPaint
.
setColor
(
Color
.
GREEN
);
mFrontPaint
.
setAntiAlias
(
true
);
mFrontPaint
.
setStyle
(
Paint
.
Style
.
STROKE
);
mFrontPaint
.
setStrokeWidth
(
mStrokeWidth
);
mTextPaint
=
new
Paint
();
mTextPaint
.
setColor
(
Color
.
GREEN
);
mTextPaint
.
setAntiAlias
(
true
);
mTextPaint
.
setTextSize
(
80
);
mTextPaint
.
setTextAlign
(
Paint
.
Align
.
CENTER
);
}
//重写测量大小的onMeasure方法和绘制View的核心方法onDraw()
@Override
protected
void
onMeasure
(
int
widthMeasureSpec
,
int
heightMeasureSpec
)
{
super
.
onMeasure
(
widthMeasureSpec
,
heightMeasureSpec
);
mWidth
=
getRealSize
(
widthMeasureSpec
);
mHeight
=
getRealSize
(
heightMeasureSpec
);
setMeasuredDimension
(
mWidth
,
mHeight
);
}
@Override
protected
void
onDraw
(
Canvas
canvas
)
{
initRect
();
float
angle
=
mProgress
/
(
float
)
mMax
*
360
;
canvas
.
drawCircle
(
mWidth
/
2
,
mHeight
/
2
,
mRadius
,
mBackPaint
);
canvas
.
drawArc
(
mRect
,
-
90
,
angle
,
false
,
mFrontPaint
);
canvas
.
drawText
(
mProgress
+
"%"
,
mWidth
/
2
+
mHalfStrokeWidth
,
mHeight
/
2
+
mHalfStrokeWidth
,
mTextPaint
);
if
(
mProgress
<
mTargetProgress
)
{
mProgress
+=
1
;
invalidate
();
}
}
public
int
getRealSize
(
int
measureSpec
)
{
int
result
=
1
;
int
mode
=
MeasureSpec
.
getMode
(
measureSpec
);
int
size
=
MeasureSpec
.
getSize
(
measureSpec
);
if
(
mode
==
MeasureSpec
.
AT_MOST
||
mode
==
MeasureSpec
.
UNSPECIFIED
)
{
//自己计算
result
=
(
int
)
(
mRadius
*
2
+
mStrokeWidth
);
}
else
{
result
=
size
;
}
return
result
;
}
private
void
initRect
()
{
if
(
mRect
==
null
)
{
mRect
=
new
RectF
();
int
viewSize
=
(
int
)
(
mRadius
*
2
);
int
left
=
(
mWidth
-
viewSize
)
/
2
;
int
top
=
(
mHeight
-
viewSize
)
/
2
;
int
right
=
left
+
viewSize
;
int
bottom
=
top
+
viewSize
;
mRect
.
set
(
left
,
top
,
right
,
bottom
);
}
}
}
转载请注明原文地址: https://ju.6miu.com/read-500014.html
技术
最新回复
(
0
)