public classCountDownView extendsView {
//圆环颜色private intmRingColor;//圆环宽度private floatmRingWidth;//圆环进度值文本大小private intmRingProgessTextSize;//宽度private intmWidth;//高度private intmHeight;privatePaint mPaint;//圆环的矩形区域privateRectF mRectF;//private intmProgessTextColor;private intmCountdownTime;private floatmCurrentProgress;ValueAnimator valueAnimator;/*** 监听事件*/privateOnCountDownListener mListener;publicCountDownView(Context context) {
this(context, null);}
publicCountDownView(Context context,@NullableAttributeSet attrs) {
this(context,attrs,0);}
publicCountDownView(Context context,@NullableAttributeSet attrs, intdefStyleAttr) {
super(context,attrs,defStyleAttr);// init();/*** 获取相关属性值*/TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.CountDownView);mRingColor= typedArray.getColor(R.styleable.CountDownView_ringColor,context.getResources().getColor(R.color.colorAccent));mRingWidth= typedArray.getFloat(R.styleable.CountDownView_ringWidth,40);mRingProgessTextSize= typedArray.getDimensionPixelSize(R.styleable.CountDownView_progressTextSize,20);mProgessTextColor= typedArray.getColor(R.styleable.CountDownView_progressTextColor,context.getResources().getColor(R.color.colorAccent));mCountdownTime= typedArray.getInteger(R.styleable.CountDownView_countdownTime,60);typedArray.recycle();mPaint= newPaint(Paint.ANTI_ALIAS_FLAG);mPaint.setAntiAlias(true);this.setWillNotDraw(false);}
@Overrideprotected voidonLayout(booleanchanged, intleft, inttop, intright, intbottom) {
super.onLayout(changed,left,top,right,bottom);mWidth= getMeasuredWidth();mHeight= getMeasuredHeight();mRectF= newRectF(0+ mRingWidth/ 2,0+ mRingWidth/ 2,mWidth- mRingWidth/ 2,mHeight- mRingWidth/ 2);}
/*** 设置倒计时间 单位秒*@parammCountdownTime*/public voidsetCountdownTime(intmCountdownTime) {
this.mCountdownTime= mCountdownTime;invalidate();}
// public CountDownView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {// super(context, attrs, defStyleAttr, defStyleRes);// }/*** 动画*@paramcountdownTime*@return*/privateValueAnimator getValueAnimator(longcountdownTime) {
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0,100);valueAnimator.setDuration(countdownTime);valueAnimator.setInterpolator(newLinearInterpolator());valueAnimator.setRepeatCount(0);returnvalueAnimator;}
@Overrideprotected voidonDraw(Canvas canvas) {
super.onDraw(canvas);/***圆环*///颜色mPaint.setColor(mRingColor);//空心mPaint.setStyle(Paint.Style.STROKE);//宽度mPaint.setStrokeWidth(mRingWidth);canvas.drawArc(mRectF,-90,mCurrentProgress- 360, false,mPaint);//绘制文本Paint textPaint = newPaint();textPaint.setAntiAlias(true);textPaint.setTextAlign(Paint.Align.CENTER);String text = mCountdownTime- (int) (mCurrentProgress/ 360f* mCountdownTime) + "";textPaint.setTextSize(mRingProgessTextSize);textPaint.setColor(mProgessTextColor);//文字居中显示Paint.FontMetricsInt fontMetrics = textPaint.getFontMetricsInt();intbaseline = (int) ((mRectF.bottom+ mRectF.top- fontMetrics.bottom- fontMetrics.top) / 2);canvas.drawText(text,mRectF.centerX(),baseline,textPaint);}
/*** 开始倒计时*/public voidstartCountDown() {
valueAnimator= getValueAnimator(mCountdownTime* 1000);valueAnimator.addUpdateListener(newValueAnimator.AnimatorUpdateListener() {
@Overridepublic voidonAnimationUpdate(ValueAnimator animation) {
floati = Float.valueOf(String.valueOf(animation.getAnimatedValue()));mCurrentProgress= (int) (360* (i / 100f));invalidate();}
});valueAnimator.start();valueAnimator.addListener(newAnimatorListenerAdapter() {
@Overridepublic voidonAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);//倒计时结束回调if(mListener!= null) {
mListener.countDownFinished();}
}
});}
/*** 停止倒计时*/public voidstopCountDdwn(){
valueAnimator.cancel();}
public voidsetOnCountDownListener(OnCountDownListener mListener) {
this.mListener= mListener;}
}