package com.aspsine.swipetoloadlayout.demo.view.drawable.google;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
/**
* Created by aspsine on 15/9/11.
*/
public class RingProgressDrawable extends ProgressDrawable {
/**
* in dp
*/
private static final int DEFAULT_BORDER_WIDTH = 3;
private static final int DEFAULT_START_ANGLE = 270;
private static final int DEFAULT_FINAL_DEGREES = 360;
private Paint mPaint;
private Path mPath;
private RectF mBounds;
private int mAlpha;
private float mDegrees;
private float mAngle;
private int mColorIndex;
private float mPercent;
public RingProgressDrawable(Context context) {
super(context);
mBounds = new RectF();
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeWidth(dp2px(DEFAULT_BORDER_WIDTH));
mPath = new Path();
mPaint.setColor(Color.WHITE);
}
@Override
public void setPercent(float percent, boolean isUser) {
if (percent >= 1) {
percent = 1;
}
int colors[] = getColors();
mPaint.setColor(colors[0]);
mAngle = DEFAULT_FINAL_DEGREES * percent - 0.001f;
mAlpha = (int) (255 * percent);
mDegrees = 360 * percent;
invalidateSelf();
}
@Override
public void start() {
setRunning(true);
post(mAnimRunnable);
}
@Override
public void stop() {
setRunning(false);
removeCallBacks(mAnimRunnable);
mAngle = 0;
mDegrees = 0;
}
private Runnable mAnimRunnable = new Runnable() {
@Override
public void run() {
if (isRunning()) {
int[] colors = getColors();
int length = colors.length;
mDegrees += 5;
if (mDegrees >= 360) {
mDegrees = 0;
mColorIndex++;
if (mColorIndex >= length) {
mColorIndex = 0;
}
mPaint.setColor(colors[mColorIndex]);
}
mAngle = mDegrees;
invalidateSelf();
postDelayed(this, DELAY);
}
}
};
@Override
public void setAlpha(int alpha) {
mAlpha = alpha;
invalidateSelf();
}
@Override
public void draw(Canvas canvas) {
canvas.save();
canvas.rotate(mDegrees, canvas.getWidth() / 2, canvas.getHeight() / 2);
mPath.reset();
float d = Math.min(canvas.getWidth(), canvas.getHeight());
float left = dp2px(DEFAULT_BORDER_WIDTH);
float top = dp2px(DEFAULT_BORDER_WIDTH);
float right = (d - dp2px(DEFAULT_BORDER_WIDTH));
float bottom = (d - dp2px(DEFAULT_BORDER_WIDTH));
mBounds.set(left, top, right, bottom);
mPath.arcTo(mBounds, DEFAULT_START_ANGLE, mAngle, true);
mPaint.setAlpha(mAlpha);
canvas.drawPath(mPath, mPaint);
canvas.restore();
}
}