好久没有写博客了,趁着年末,总结了下最近一年所遇到的一些技术问题,还有一些自定义控件,比如倒计时功能
首先倒计时的实现方式
1。处理程序
2.计时器
3.RxJava
4.ValueAnimator
5 .其他
这些方式中,我选择了ValueAnimator,主要是它的API比较友好,不需要我们去封装太多东西,具体的使用方式我就不单独写了,下面的代码都有备注
项目地址
项目图片
代码实现:
包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倒计时功能的实现代码