@H_
450_20@
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.content.Co
ntext;
import android.content.re
s.TypedArray;
import android.graphic
s.Canvas;
import android.graphic
s.Paint;
import android.graphic
s.RectF;
import android.uti
l.AttributeSet;
import android.view.View;
import android.view.animation.LinearInterpolator;
/
**
* Created by 王 on 2017/10/21.
*/
public class CountDownView extends View
{
//圆轮颜色
privat
E int mRingColor;
//圆轮宽度
private float mRingWidth;
//圆轮进度值文本大小
privat
E int mRingProgessTextSize;
//宽度
privat
E int mWidth;
//高度
privat
E int mHeight;
private Paint mPaint;
//圆环的矩形区域
private RectF mRectF;
//
privat
E int mProgessTextColor;
privat
E int mCountdownTime;
private float mCurrentProgress;
private OnCountDownFinishListener mListener;
public CountDownView(Co
ntext co
ntext)
{
this(co
ntext,
null);
}
public CountDownView(Co
ntext co
ntext,AttributeSet attrs)
{
this(co
ntext,attrs,0
);
}
public CountDownView(Co
ntext co
ntext,AttributeSet attrs,int defStyleAttr)
{
super(co
ntext,defStyleAttr
);
TypedArray a = co
ntext
.obtainStyledAttributes(attrs,R.styleable.CountDownView
);
mRingColor = a.getColor(R.styleable.CountDownView_ringColor,co
ntext.get
resources().getColor(R.color.col
Oraccent)
);
mRingWidth = a.getFloat(R.styleable.CountDownView_ringWidth,40
);
mRingProgessTextSize = a.getDimensionPixelSize(R.styleable.CountDownView_progressTextSize,DisplayUti
l.sp2px(co
ntext,20)
);
mProgessTextColor = a.getColor(R.styleable.CountDownView_progressTextColor,co
ntext.get
resources().getColor(R.color.col
Oraccent)
);
mCountdownTime = a.get
Integer(R.styleable.CountDownView_countdownTime,10
);
a.recycle(
);
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG
);
mPaint.setAntiAlias
(true);
thi
s.setWillNotDraw
(false);
}
public void setCountdownTime(int mCountdownTim
E) {
thi
s.mCountdownTime = mCountdownTime;
}
@Override
protected void onLayout(
Boolean changed,int left,int top,int right,int bottom)
{
super
.onLayout(changed,left,top,right,bottom
);
mWidth = getMeasuredWidth(
);
mHeight = getMeasuredHeight(
);
mRectF = new RectF(0 + mRingWidth / 2,0 + mRingWidth / 2,mWidth - mRingWidth / 2,mHeight - mRingWidth / 2
);
}
@Override
protected void onDraw(Canvas canvas)
{
super
.onDraw(canvas
);
/
**
*圆环
*/
//颜色
mPaint.setColor(mRingColor
);
//空心
mPaint.setStyle(Paint.Style.
stroke);
//宽度
mPaint.set
strokeWidth(mRingWidth
);
canva
s.drawArc(mRectF,-90,mCurrentProgress - 360,
false,mPa
int);
//绘制文本
Paint textPaint = new Paint(
);
textPaint.setAntiAlias
(true);
textPaint.setTextAlign(Paint.Align.CENTER
);
String text = mCountdownTime - (
int) (mCurrentProgress / 360f * mCountdownTim
E) + "";
textPaint.setTextSize(mRingProgessTextSiz
E);
textPaint.setColor(mProgessTextColor
);
//
文字居中
显示
Paint.FontMetricsInt fontMetrics = textPaint.getFontMetricsInt(
);
int baseline = (
int) ((mRectF
.bottom + mRectF.top - fontMetrics
.bottom - fontMetric
s.to
p) / 2
);
canva
s.drawText(text,mRectF.centerX(),baseline,textPa
int);
}
private ValueAnimat
or getValA(long countdownTim
E) {
ValueAnimator valueAnimator = ValueAnimator
.ofFloat(0,100
);
valueAnimator.setDuration(countdownTim
E);
valueAnimator.se
Tinterpolator(new LinearInterpolator()
);
valueAnimator.setRepeatCount(0
);
return valueAnimator;
}
/
**
* 开始倒计时
*/
public void startCountDown()
{
setClickable
(false);
ValueAnimator valueAnimator = getValA(mCountdownTime * 1000
);
valueAnimator.add
updateListener(new ValueAnimator.Animator
updateListener()
{
@Override
public void onAnimation
update(ValueAnimator animation)
{
float i = Float.valueOf(
String.valueOf(animation.getAnimatedValue())
);
mCurrentProgress = (
int) (360 * (i / 100f)
);
invalidate(
);
}
}
);
valueAnimator.start(
);
valueAnimator.addListener(new AnimatorListenerAdapter()
{
@Override
public void onAnimationEnd(Animator animation)
{
super
.onAnimationEnd(animation
);
//倒计时结束回调
if (mListener
!= null)
{
mListener.countDownFinished(
);
}
setClickable
(true);
}
}
);
}
public void setAddCountDownListener(OnCountDownFinishListener mListener)
{
thi
s.mListener = mListener;
}
publi
c interface OnCountDownFinishListener
{
void countDownFinished(
);
}
}