效果:圆圈进度条,该进度条有两层
里面一层为一整圈 可以设置一整圈代表的总进度外层代表当前进度,可设置当前的进度,运行效果是平滑地从0进度滑动到当前进度
贴上一张图(由于是截图没有动画效果)
思路:
继承View画出两个空心圆,并且两个圆重叠,两个圆圈的边宽大小不同(外>内)计算当前进度占总进度的大小,得出最后滑动到的角度。利用动画监听使得产生滑动的效果,在动画更新监听中获取当前动画的时间比例值用该时间比例值和估值器,在动画更新监听中更新角度比例直到当前进度的角度比例。在每次角度更新后调用invalidate(),进而刷新进度。
代码
public class ProgressCircle extends View implements ValueAnimator.AnimatorUpdateListener{
private final String TAG=
"ASENDI";
private Paint mPaint;
private Paint mShadowPaint;
private int mProgressBorderWidth=
20;
private int mProgressShadowWidth=
3;
private int mProgressBorderColor;
private int mProgressShadowColor;
private float mProgressCurrent;
private float mProgressTotal;
private final float mStartProgress=-
90f;
private final int mTotalProgressAngle=
360;
private float mDeltaProgressAngle=
0f;
private float mFinalDeltaProgressAngle;
private IntEvaluator mEvaluator;
public ProgressCircle(Context context) {
this(context,
null);
}
public ProgressCircle(Context context, AttributeSet attrs) {
this(context, attrs,
0);
}
public ProgressCircle(Context context, AttributeSet attrs,
int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray typeArray=context.obtainStyledAttributes(attrs,
R.styleable.ProgressCircle,defStyleAttr,
0);
mProgressBorderWidth=typeArray.getDimensionPixelSize(R.styleable.ProgressCircle_progress_border_width
,
10);
mProgressBorderColor=typeArray.getColor(R.styleable.ProgressCircle_progress_border_color,
getResources().getColor(R.color.colorWhite));
mProgressShadowColor=typeArray.getColor(R.styleable.ProgressCircle_progress_shadow_color,
getResources().getColor(R.color.colorWhite));
mProgressCurrent=typeArray.getFloat(R.styleable.ProgressCircle_progress_current,
0f);
mProgressTotal=typeArray.getFloat(R.styleable.ProgressCircle_progress_total,
360f);
}
private float getCurrentDelta(
float progressCurrent ,
float progressTotal) {
float percent=progressCurrent/progressTotal;
float currentDelta=percent*mTotalProgressAngle;
Log.i(TAG,
"getCurrentDelta: "+currentDelta);
return currentDelta;
}
public void startAni(){
ValueAnimator valueAnimator=ValueAnimator.ofInt(
1,(
int) mProgressTotal);
valueAnimator.addUpdateListener(
this);
mEvaluator=
new IntEvaluator();
mProgressCurrent=getProgressCurrent();
mProgressTotal=getProgressTotal();
mFinalDeltaProgressAngle=getCurrentDelta(mProgressCurrent,mProgressTotal);
valueAnimator.setDuration(
4000).start();
}
public int getProgressBorderWidth() {
return mProgressBorderWidth;
}
public void setProgressBorderWidth(
int progressBorderWidth) {
mProgressBorderWidth = progressBorderWidth;
}
public int getProgressBorderColor() {
return mProgressBorderColor;
}
public void setProgressBorderColor(
int progressBorderColor) {
mProgressBorderColor = progressBorderColor;
}
public int getProgressShadowColor() {
return mProgressShadowColor;
}
/**
* 设置整个圆弧颜色
* @param progressShadowColor
*/
public void setProgressShadowColor(
int progressShadowColor) {
mProgressShadowColor = progressShadowColor;
}
/**
* 圆弧的进度
* @return
*/
public float getProgressCurrent() {
return mProgressCurrent;
}
public void setProgressCurrent(
float progressCurrent) {
mProgressCurrent = progressCurrent;
}
/**
* 整个圆弧的进度
* @return
*/
public float getProgressTotal() {
return mProgressTotal;
}
public void setProgressTotal(
float progressTotal) {
mProgressTotal = progressTotal;
}
@Override
protected void onMeasure(
int widthMeasureSpec,
int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int widthSpaceSize=MeasureSpec.getSize(widthMeasureSpec);
int heightSpaceSize=MeasureSpec.getSize(heightMeasureSpec);
int sideLength=Math.min(widthSpaceSize,heightSpaceSize);
setMeasuredDimension(sideLength,sideLength);
}
@Override
protected void onDraw(Canvas canvas) {
initPaint();
RectF mBigOval=
new RectF(mProgressBorderWidth/
2
,mProgressBorderWidth/
2
,getWidth()-(mProgressBorderWidth-
1)/
2
,getHeight()-(mProgressBorderWidth-
1)/
2);
canvas.drawArc(mBigOval,mStartProgress,mTotalProgressAngle,
false,mShadowPaint);
canvas.drawArc(mBigOval,mStartProgress,mDeltaProgressAngle,
false,mPaint);
Log.i(
"TAG",
"onDraw: ");
super.onDraw(canvas);
}
private void initPaint() {
mPaint=
new Paint();
mPaint.setAntiAlias(
true);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(mProgressBorderColor);
mPaint.setStrokeWidth(mProgressBorderWidth);
mPaint.setStrokeJoin(Paint.Join.ROUND);
mPaint.setStrokeCap(Paint.Cap.ROUND);
mShadowPaint=
new Paint();
mShadowPaint.setAntiAlias(
true);
mShadowPaint.setStyle(Paint.Style.STROKE);
mShadowPaint.setColor(mProgressShadowColor);
mShadowPaint.setStrokeWidth(mProgressShadowWidth);
mShadowPaint.setStrokeJoin(Paint.Join.ROUND);
mShadowPaint.setStrokeCap(Paint.Cap.ROUND);
}
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int currentValue= (
int) animation.getAnimatedValue();
Log.i(
"SENDI",
"onAnimationUpdate: currentValue:"+currentValue);
float fraction=animation.getAnimatedFraction();
Log.i(TAG,
"onAnimationUpdate: fraction:"+fraction);
mDeltaProgressAngle=mEvaluator.evaluate(fraction,
0, (
int) mFinalDeltaProgressAngle);
Log.i(
"TAG",
"onAnimationUpdate: mDeltaProgress:"+mDeltaProgressAngle);
invalidate();
}
}