自定义环形进度条,两种颜色,背景颜色和进度颜色,记录进度值
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
/**
* @author Joker_Ya
*/
public class MyCircleProgress extends View {
private int progress;
// 设置最大值
private int max;
// 圓環寬度
private int circleWidth;
// 控件的寬度
private int width;
// 控件的高度
private int height;
// 默認圓的半徑
private int radius;
// 绘制轨迹的画笔
private Paint paint;
// 绘制填充的画笔
private Paint fillpaint;
private RectF oval;
// View重绘标志
private boolean reset = false;
// 设置监听
private OnProgressChangeListener listener = null;
public MyCircleProgress(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
// 获得自定义属性
TypedArray mArray = context.obtainStyledAttributes(attrs,
R.styleable.myattrs);
// 获得自定义属性的初始进度属性,否则返回0
progress = mArray.getInteger(R.styleable.myattrs_progress, 0);
// 获得自定义属性的最大进度值属性,否则返回100
max = mArray.getInteger(R.styleable.myattrs_max, 100);
// 获得自定义属性的圆环宽度属性,否则返回20
circleWidth = mArray.getInteger(R.styleable.myattrs_circle_width, 20);
// 获得自定义属性的半径属性,否则返回120
radius = mArray.getInteger(R.styleable.myattrs_radius, 120);
paint = new Paint();
// 抗锯齿
paint.setAntiAlias(true);
// 帮助抗锯齿
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
// 设置样式为空心
paint.setStyle(Paint.Style.STROKE);
paint.setDither(true);
// paint.setStrokeJoin(Paint.Join.ROUND);
fillpaint = new Paint();
// 抗锯齿
fillpaint.setAntiAlias(true);
// 帮助抗锯齿
fillpaint.setFlags(Paint.ANTI_ALIAS_FLAG);
// 设置样式为空心
fillpaint.setStyle(Paint.Style.STROKE);
fillpaint.setDither(true);
// fillpaint.setStrokeJoin(Paint.Join.ROUND);
oval = new RectF();
// 回收mArray
mArray.recycle();
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
if (reset) {
canvas.drawColor(Color.TRANSPARENT);
reset = false;
}
// 获得组件的宽高
width = getMeasuredWidth();
height = getMeasuredHeight();
// 获得半径
radius = width / 2 - circleWidth;
// 设置画笔颜色64646d 背景颜色
paint.setColor(Color.argb(0xff, 0x64, 0x64, 0x6d));
// 设置画笔宽度
paint.setStrokeWidth(circleWidth);
// 中心画圆
canvas.drawCircle(width / 2, height / 2, radius, paint);
// /* 绘制边线 */
// // 画笔宽度
// paint.setStrokeWidth(1f);
// // 边线颜色
// paint.setColor(Color.RED);
// canvas.drawCircle(width / 2, height / 2, radius + circleWidth / 2
// + 0.5f, paint);
// canvas.drawCircle(width / 2, height / 2, radius - circleWidth / 2
// - 0.5f, paint);
//画笔填充颜色
fillpaint.setColor(Color.argb(0xff, 0xee, 0x6b, 0x9e));
// 设置填充画笔的类型,边角是圆角的
fillpaint.setStrokeCap(Paint.Cap.ROUND);
// 画笔宽度
fillpaint.setStrokeWidth(circleWidth);
// 设置左上角和右下角坐标
oval.set(width / 2 - radius, height / 2 - radius, width / 2 + radius,
height / 2 + radius);
// 绘制圆弧。第二个参数为起始角度,第三个为跨越的角度,第三個为实心,true为实心,false为空心
canvas.drawArc(oval, -90, ((float) progress / max) * 360, false,
fillpaint);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
int width = View.MeasureSpec.getSize(widthMeasureSpec);
int height = View.MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(width, height);
}
// 定义接口ProgressChangeListener
public interface OnProgressChangeListener {
public void ProgressChange(int progress1);
public void onComplete(int progress2);
}
public void setOnProgressChangeListener(OnProgressChangeListener listener) {
// TODO Auto-generated method stub
this.listener = listener;
}
// 设置进度
public void setProgress(int progress) {
this.progress = progress;
this.invalidate();
if (listener != null) {
if (this.max <= this.progress) {
listener.onComplete(progress);
} else {
listener.ProgressChange(progress);
}
}
}
// 重置进度
public void reset() {
reset = true;
progress = 0;
// 重绘
invalidate();
}
}