服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android倒计时功能的实现代码

Android倒计时功能的实现代码

2022-11-13 15:02仙人掌007 Android

这篇文章主要介绍了Android倒计时功能的实现代码,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

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

首先倒计时的实现方式

1.Handler
2.Timer
3.RxJava
4.ValueAnimator
5.其他

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

项目地址

项目图片

Android倒计时功能的实现代码

代码实现:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
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();
  }
}

 

总结

以上所述是小编给大家介绍的Android倒计时功能的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

原文链接:https://blog.csdn.net/TE28093163/article/details/103685854

延伸 · 阅读

精彩推荐
  • Android仿iphone中短信以及通话记录的时间显示

    仿iphone中短信以及通话记录的时间显示

    本篇文章是对仿iphone中短信以及通话记录的时间显示进行了详细的分析介绍,需要的朋友参考下 ...

    Android开发网10932021-01-31
  • AndroidAndroid实现沉浸式状态栏功能

    Android实现沉浸式状态栏功能

    这篇文章主要为大家详细介绍了Android实现沉浸式状态栏功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    季风__7542022-11-02
  • Android在Android系统中使用gzip进行数据传递实例代码

    在Android系统中使用gzip进行数据传递实例代码

    HTTP协议上的GZIP编码是一种用来改进WEB应用程序性能的技术,4.4MB的文本数据经过Gzip传输到客户端之后变为392KB,压缩效率极高,下面与大家分享下具体的实...

    Android开发网8052021-01-25
  • AndroidAndroid双击返回键退出程序的实现方法

    Android双击返回键退出程序的实现方法

    这篇文章主要介绍了Android双击返回键退出程序的实现方法,是Android程序开发中非常具有实用价值的重要技巧,需要的朋友可以参考下...

    Android开发网8242021-03-08
  • Android基于Android代码实现常用布局

    基于Android代码实现常用布局

    大家在日常中经常见到用xml文件实现android常用布局,但是大家知道如何用代码实现呢?使用代码实现可以帮助我们学习sdk api,所以小编把我日常整理些关...

    Android开发网3932021-04-13
  • AndroidAndroid仿qq消息拖拽效果

    Android仿qq消息拖拽效果

    这篇文章主要为大家详细介绍了Android仿qq消息拖拽效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    老胡杨11972022-09-21
  • Android详解Android版本适配:9.0 Pie

    详解Android版本适配:9.0 Pie

    这篇文章主要介绍了Android版本适配9.0 Pie,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小...

    Anlia3852022-10-14
  • AndroidFlutter实现可循环轮播图效果

    Flutter实现可循环轮播图效果

    这篇文章主要介绍了Flutter实现可循环轮播图效果,本文图文并茂通过实例代码给大家介绍的非常详细,需要的朋友可以参考下...

    LuodiJack6272022-10-26