Android倒计时功能的实现代码
好久没有写博客了,趁着年末,总结了下最近一年所遇到的一些技术问题,还有一些自定义控件,比如倒计时功能
首先倒计时的实现方式
1.Handler
2.Timer
3.RxJava
4.ValueAnimator
5.其他
这些方式中,我选择了ValueAnimator,主要是它的API比较友好,不需要我们去封装太多东西,具体的使用方式我就不单独写了,下面的代码都有备注
项目地址
项目图片
代码实现:
packagecom.example.countdownview;
importandroid.animation.Animator;
importandroid.animation.AnimatorListenerAdapter;
importandroid.animation.ValueAnimator;
importandroid.content.Context;
importandroid.content.res.TypedArray;
importandroid.graphics.Canvas;
importandroid.graphics.Color;
importandroid.graphics.Paint;
importandroid.graphics.RectF;
importandroid.util.AttributeSet;
importandroid.view.View;
importandroid.view.animation.LinearInterpolator;
publicclassCountDownViewextendsView{
//圆轮颜色
privateintmRingColor;
//圆轮宽度
privatefloatmRingWidth;
//宽度
privateintmWidth;
//高度
privateintmHeight;
privatePaintmPaint;
//圆环的矩形区域
privateRectFmRectF;
//
privateintmCountdownTime;
privatefloatmCurrentProgress;
privateOnCountDownFinishListenermListener;
ValueAnimatorvalueAnimator;
publicCountDownView(Contextcontext){
this(context,null);
}
publicCountDownView(Contextcontext,AttributeSetattrs){
this(context,attrs,0);
}
publicCountDownView(Contextcontext,AttributeSetattrs,intdefStyleAttr){
super(context,attrs,defStyleAttr);
TypedArraya=context.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=newPaint(Paint.ANTI_ALIAS_FLAG);
/**
*圆环
*/
//颜色
mPaint.setColor(mRingColor);
//空心
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setAntiAlias(true);//消除锯齿
//宽度
mPaint.setStrokeWidth(mRingWidth);
}
publicvoidsetCountdownTime(intmCountdownTime){
this.mCountdownTime=mCountdownTime;
}
@Override
protectedvoidonLayout(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);
}
@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
canvas.drawArc(mRectF,-90,mCurrentProgress,false,mPaint);
}
privateValueAnimatorgetValA(longcountdownTime){
ValueAnimatorvalueAnimator=ValueAnimator.ofFloat(0,100);
valueAnimator.setDuration(countdownTime);
valueAnimator.setInterpolator(newLinearInterpolator());
valueAnimator.setRepeatCount(0);
returnvalueAnimator;
}
/**
*开始倒计时
*/
publicvoidstartCountDown(){
setClickable(false);
valueAnimator=getValA(mCountdownTime*1000);
//状态更新监听
valueAnimator.addUpdateListener(newValueAnimator.AnimatorUpdateListener(){
@Override
publicvoidonAnimationUpdate(ValueAnimatoranimation){
floati=Float.valueOf(String.valueOf(animation.getAnimatedValue()));
mCurrentProgress=(int)(360*(i/100f));
invalidate();
}
});
valueAnimator.start();
//状态变化结束监听
valueAnimator.addListener(newAnimatorListenerAdapter(){
@Override
publicvoidonAnimationEnd(Animatoranimation){
super.onAnimationEnd(animation);
//倒计时结束回调
if(mListener!=null){
mListener.countDownFinished();
}
setClickable(true);
}
});
}
/**
*恢复
*/
publicvoidresumeCountDown(){
if(valueAnimator!=null){
valueAnimator.resume();
}
}
/**
*暂停
*/
publicvoidpauseCountDown(){
if(valueAnimator!=null){
valueAnimator.pause();
}
}
/**
*停止倒计时
*/
publicvoidstopCountDown(){
if(valueAnimator!=null){
valueAnimator.cancel();
}
}
publicvoidsetCountDownFinishListener(OnCountDownFinishListenermListener){
this.mListener=mListener;
}
publicinterfaceOnCountDownFinishListener{
voidcountDownFinished();
}
}
总结
以上所述是小编给大家介绍的Android倒计时功能的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。