Android倒计时功能的实现代码

  

好久没有写博客了,趁着年末,总结了下最近一年所遇到的一些技术问题,还有一些自定义控件,比如倒计时功能

  

首先倒计时的实现方式

  

1。处理程序
  2.计时器
  3.RxJava
  4.ValueAnimator
  5 .其他

  

这些方式中,我选择了ValueAnimator,主要是它的API比较友好,不需要我们去封装太多东西,具体的使用方式我就不单独写了,下面的代码都有备注

  

项目地址

  

项目图片

  

 Android倒计时功能的实现代码

  

代码实现:

        包com.example.countdownview;   进口android.animation.Animator;   进口android.animation.AnimatorListenerAdapter;   进口android.animation.ValueAnimator;   进口android.content.Context;   进口android.content.res.TypedArray;   进口android.graphics.Canvas;   进口android.graphics.Color;   进口android.graphics.Paint;   进口android.graphics.RectF;   进口android.util.AttributeSet;   进口android.view.View;   进口android.view.animation.LinearInterpolator;   公开课CountDownView扩展视图{//圆轮颜色   私人int mRingColor;//圆轮宽度   私人mRingWidth浮动;//宽度   私人int mWidth;//高度   私人int mHeight;   私人油漆mPaint;//圆环的矩形区域   私人RectF mRectF;//私人int mCountdownTime;   私人mCurrentProgress浮动;   私人OnCountDownFinishListener mListener;   ValueAnimator ValueAnimator;   公共CountDownView(上下文语境){   这(上下文,null);   }   公共CountDownView(上下文语境,AttributeSet attrs) {   这(上下文、attrs 0);   }   公共CountDownView(上下文语境、AttributeSet attrs int defStyleAttr) {   超级(上下文、attrs defStyleAttr);   TypedArray=上下文。obtainStyledAttributes (attrs R.styleable.CountDownView);   mRingColor=a.getColor (R.styleable。CountDownView_ringColor Color.RED);   mCountdownTime=a.getInteger (R.styleable。CountDownView_countdownTime 10);   mRingWidth=a.getDimension (R.styleable.CountDownView_ringWidth 2);   a.recycle ();   mPaint=new油漆(Paint.ANTI_ALIAS_FLAG);/* *   *圆环   *///颜色   mPaint.setColor (mRingColor);//空心   mPaint.setStyle (Paint.Style.STROKE);   mPaint.setAntiAlias(真正的);//消除锯齿//宽度   mPaint.setStrokeWidth (mRingWidth);   }   公共空间setCountdownTime (int mCountdownTime) {   这一点。mCountdownTime=mCountdownTime;   }   @Override   保护无效onLayout(布尔改变,int, int, int, int底部){   超级。onLayout(改变,左,上,右,下);   mWidth=getMeasuredWidth ();   mHeight=getMeasuredHeight ();   mRectF=new RectF (0 + mRingWidth/2 0 + mRingWidth/2,   mWidth - mRingWidth/2, mHeight - mRingWidth/2);   }   @Override   保护无效onDraw(帆布画布){   super.onDraw(画布);   画布。mCurrentProgress drawArc (mRectF, -90年,假,mPaint);   }   私人ValueAnimator getValA(长countdownTime) {   ValueAnimator ValueAnimator=ValueAnimator。ofFloat (0, 100);   valueAnimator.setDuration (countdownTime);   valueAnimator。setInterpolator(新LinearInterpolator ());   valueAnimator.setRepeatCount (0);   返回valueAnimator;   }/* *   *开始倒计时   */公共空间startCountDown () {   setClickable(假);   valueAnimator=getValA (mCountdownTime * 1000);//状态更新监听   valueAnimator。addUpdateListener(新ValueAnimator.AnimatorUpdateListener () {   @Override   公共空间onAnimationUpdate (ValueAnimator动画){   浮动i=Float.valueOf (String.valueOf (animation.getAnimatedValue ()));   mCurrentProgress=(int)(360 *(我/100 f));   无效();   }   });   valueAnimator.start ();//状态变化结束监听   valueAnimator。addListener(新AnimatorListenerAdapter () {   @Override   公共空间onAnimationEnd(动画动画){   super.onAnimationEnd(动画);//倒计时结束回调   如果(mListener !=null) {   mListener.countDownFinished ();   }   setClickable(真正的);   }   });   }/* *   *恢复   */公共空间resumeCountDown () {   如果(valueAnimator !=null) {   valueAnimator.resume ();   }   }/* *   *暂停   */公共空间pauseCountDown () {   如果(valueAnimator !=null) {   valueAnimator.pause ();   }   }/* *   *停止倒计时   */公共空间stopCountDown () {   如果(valueAnimator !=null) {   valueAnimator.cancel ();   }   }   公共空间setCountDownFinishListener (OnCountDownFinishListener mListener) {   这一点。mListener=mListener;   }   公共接口OnCountDownFinishListener {   空白countDownFinished ();   }   }

Android倒计时功能的实现代码