环形进度条CircleProgress

自定义环形进度条,两种颜色,背景颜色和进度颜色,记录进度值


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();
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值