private void drawScheduleCircle(Canvas canvas) {
/*设置是否使用抗锯齿功能,会消耗较大资源,绘制图形速度会变慢。
如果不设置的话画出来的图形会比较粗糙*/
mPaint.setAntiAlias(true);
setPaint(Color.BLACK, Paint.Style.STROKE, 1);
/*背景圆*/
canvas.drawCircle(getWidth() / 2, getHeight() / 2, getWidth() / 3, mPaint);
/*进度条*/
/*设置线冒样式,有圆 有方
随意,不设置也无所谓,只要是笔触的形状分别*/
//mPaint.setStrokeCap(Paint.Cap.ROUND);
//mPaint.setStrokeCap(Paint.Cap.BUTT);
//mPaint.setStrokeCap(Paint.Cap.SQUARE);
/*此处设置画笔的宽度主要就是为了让进度条显示为圆环形状,宽度就是圆环的宽度*/
setPaint(Color.BLUE, Paint.Style.STROKE, getWidth() / 20);
/*设置进度条的位置坐标
getWidth() / 2 - getWidth() / 3 + getWidth() / 40
getWidth() / 2 为控件的中间位置,getWidth() / 3 为上面所画圆的半径,
getWidth() / 40 为进度条的宽度的一半
这里是因为所画的进度条为圆环形,且圆环在上面所画圆的内部,如果不不减去圆
环宽度的一半,那么圆环会有一半在圆的外边*/
RectF rectF = new RectF(
getWidth() / 2 - getWidth() / 3 + getWidth() / 40,
getHeight() / 2 - getWidth() / 3 + getWidth() / 40,
getWidth() / 2 + getWidth() / 3 - getWidth() / 40,
getHeight() / 2 + getWidth() / 3 - getWidth() / 40);
/*根据传来的进度数据计算进度条的大小*/
float sweepAngle = (float) (3.6 * mProgress);
/*若要画圆环,第四个参数设置为false,画笔模式为Paint.Style.STROKE,
如果画圆形,第四个参数设置为true,画笔模式为Paint.Style.FILL*/
canvas.drawArc(rectF, mStartAngle, sweepAngle, false, mPaint);
//字体
setPaint(Color.BLACK, Paint.Style.FILL, 2);
String txt = mProgress + "%";
/*设置字体的总长度*/
float textSize=((getWidth()*2)/3-getWidth()/20)/4;
mPaint.setTextSize(textSize);
/*计算字体的宽高*/
Paint.FontMetrics fm = mPaint.getFontMetrics();
int txtHeight = (int) Math.ceil(fm.descent - fm.ascent);
float txtWidth = mPaint.measureText(txt, 0, txt.length());
canvas.drawText(txt, getWidth() / 2 - txtWidth / 2, getHeight() / 2 + txtHeight / 4,mPaint);
}
private void setPaint(int color, Paint.Style mod, float size) {
//设置画笔颜色
mPaint.setColor(color);
//STROKE //描边
//FILL //填充
//FILL_AND_STROKE //描边加填充
//设置画笔模式
mPaint.setStyle(mod);
//设置画笔宽度为 size px
mPaint.setStrokeWidth(size);
}