Android中如何实现倒计时功能
创始人
2024-12-20 05:41:26
0次

1.Handler2.Timer3.RxJava4.ValueAnimator5.其他

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

代码实现:

package com.example.countdownview;import android.animation.Animator;import android.animation.AnimatorListenerAdapter;import android.animation.ValueAnimator;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.util.AttributeSet;import android.view.View;import android.view.animation.LinearInterpolator;public class CountDownView extends View {  //圆轮颜色  private int mRingColor;  //圆轮宽度  private float mRingWidth;  //宽度  private int mWidth;  //高度  private int mHeight;  private Paint mPaint;  //圆环的矩形区域  private RectF mRectF;  //  private int mCountdownTime;  private float mCurrentProgress;  private OnCountDownFinishListener mListener;  ValueAnimator valueAnimator;  public CountDownView(Context context) {    this(context, null);  }  public CountDownView(Context context, AttributeSet attrs) {    this(context, attrs, 0);  }  public CountDownView(Context context, AttributeSet attrs, int defStyleAttr) {    super(context, attrs, defStyleAttr);    TypedArray a = 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 = new Paint(Paint.ANTI_ALIAS_FLAG);    /**     *圆环     */    //颜色    mPaint.setColor(mRingColor);    //空心    mPaint.setStyle(Paint.Style.STROKE);    mPaint.setAntiAlias(true); // 消除锯齿    //宽度    mPaint.setStrokeWidth(mRingWidth);  }  public void setCountdownTime(int mCountdownTime) {    this.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);    canvas.drawArc(mRectF, -90, mCurrentProgress, false, mPaint);  }  private ValueAnimator getValA(long countdownTime) {    ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 100);    valueAnimator.setDuration(countdownTime);    valueAnimator.setInterpolator(new LinearInterpolator());    valueAnimator.setRepeatCount(0);    return valueAnimator;  }  /**   * 开始倒计时   */  public void startCountDown() {    setClickable(false);    valueAnimator = getValA(mCountdownTime * 1000);    //状态更新监听    valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {      @Override      public void onAnimationUpdate(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 resumeCountDown(){    if (valueAnimator!=null){      valueAnimator.resume();    }  }  /**   * 暂停   */  public void pauseCountDown(){    if (valueAnimator!=null){        valueAnimator.pause();    }  }  /**   * 停止倒计时   */  public void stopCountDown(){    if (valueAnimator!=null){      valueAnimator.cancel();    }  }  public void setCountDownFinishListener(OnCountDownFinishListener mListener) {    this.mListener = mListener;  }  public interface OnCountDownFinishListener {    void countDownFinished();  }}

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...