Android实现一个倒计时自定义控件

目录
  • (一)前言
  • (二)效果展示
  • (三)实现思路
  • (三)代码地址
  • 总结

(一)前言

Android 其实提供了一个倒计时控件叫做CountDownTimer,这个倒计时控件用起来也很简单,但是要按照我们想要的倒计时样式去做就比较繁琐了。比如说我们希望倒计时按照我们想要的样式展示HH:MM:SS或者是HH-MM-SS等样式,或者希望如下展示:

要做的工作就会比较繁琐了,不是说不能实现,只是实现起来代价比较大,所以如果我们将其做成一个自定义的view,可以根据用户传进来的样式去做倒计时样式的展示(注:本文的代码未做这些样式的功能,但是基于本文代码很容易实现这个功能),下面就一起看看我实现的倒计时自定义控件吧。
(注;本文代码不可直接使用到项目中,如果需要使用到项目中,还需要对代码做处理,比如固定时间到显示宽度,不然显示时间时会出现跳跃和显示不全对情况,例如可以测量“00:00:00”的宽度设置个显示的view,或者读者可以自己选择解决的办法,还有显示的时候是否需要去掉字体的内边距,这个都需要读者自己去决定,去掉内边距也简单,就是TextView的一个方法setIncludeFontPadding(false)就行了)

(二)效果展示

这个倒计时是精确到了毫秒,但也可以根据自己的需求去修改。很简单将格式从“HH:MM:SS SSS ”改为“HH:MM:SS”就可以了

(三)实现思路

实现的思路其实很简单,继承自一个TextView,参照系统的倒计时控件做一个封装就可以了。
首先初始化需要倒计时的时间:

 public void init(long timeInFuture, long timeInterval){
        mTimeInFuture = timeInFuture;
        mTimeInterval = timeInterval;
        mStopTimeInFuture = SystemClock.elapsedRealtime() + mTimeInFuture;
        updateText(mStopTimeInFuture);
    }

timeInFuture 表示你要倒计时的一个时间长度,比如说10秒,3天,5天等,timeInterval表示时间间隔,即每次倒计时递减多少时间,可以是1秒,2秒,3秒…,elapsedRealtime表示获取从设备boot后经历的时间值,通过他加上我们的时间长度,就可以准备开始倒计时了。

  public  void start() {
        mStarted = true;
        updateTimer();
    }

当用户调用start()函数时,会调用updateTimer()函数,这个函数会执行倒计时的逻辑:

private void updateTimer() {
        boolean running = mVisible && mStarted && isShown();
        if(running != mRunning){
            if(running) {
                doCountDownTimer();
            }else{
                removeCallbacks(mTickRunnable);
            }
            mRunning = running;
        }

    }

从代码中可知,只有控件可见并且时mStarted的情况下才会去做倒计时。倒计时的执行函数doCountDownTimer如下:

 private void doCountDownTimer() {
        final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();
        if(millisLeft <= 0){
            onFinish();
        }else{
            long lastUpdateTextStart = SystemClock.elapsedRealtime();
            updateText(millisLeft);
            // take into account updateText() take time to execute
            long lastUpdateTextDuration = SystemClock.elapsedRealtime() - lastUpdateTextStart;
            long delay;

            if(millisLeft < mTimeInterval){
                delay = millisLeft - lastUpdateTextDuration;

                if(delay < 0) {
                    delay = 0;
                }
            } else {
                delay = mTimeInterval - lastUpdateTextDuration;
                while (delay < 0) {
                    delay += mTimeInterval;
                }
            }
            postDelayed(mTickRunnable,delay);
        }
    }

代码很容易看懂,这个地方需要特别说明的是,咱们的倒计时利用了view的postDelayed方法,lastUpdateTextDuration这个变量值记录了上一次更新倒计时text所耗费的时间,把这个时间考虑上会让倒计时更加精确,因为在demo为了演示的需要所以加了两个按钮,在秒杀时,这个时间的精确性还是有要求的,如果差异太大的话会影响用户体验。

文章开头说可以让时间显示各种样式,其实就是把时间中的每个字符分离出来,这样就能单独的定义样式了:

 private String formatTime(long now) {
        String split = " : ";
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss SSS", Locale.CHINA);
        String time = sdf.format(now).replace(" ",":");
        Log.d(TAG,"zhongxj: " + time);
        String[] time_arr = time.split(":");
        int hour = Integer.parseInt(time_arr[0]);
        Log.d(TAG,"zhongxj: before transform " + hour);
        hour-=8;
        Log.d(TAG,"zhongxj: " + hour);
        if(hour<10){
            time_arr[0] = "0"+hour;
        }else{
            time_arr[0] = "" + hour;
        }

        return time_arr[0] + split + time_arr[1] + split
                +time_arr[2] + split + time_arr[3];
    }

需要加样式就设计好样式后把分割好的字符填到样式中就可以了!!!

倒计时的逻辑其实是参照的系统倒计时的,这里有个自定义控件的小技巧,当我们接到需求时,先不要忙着去百度,因为大公司很多时候设计的控件百度上很难找到的就算找到了可能也不符合要求,还可能会有隐藏的bug,这时可以参照Android系统是如何实现类似的控件的,参照系统的控件做出来的自定义控件,效果和性能会相对好一些。先说这么多,有问题欢迎一起讨论。

(三)代码地址

代码仓库使用的是国内的gitee,推荐大家使用起来!!!!
源码地址

总结

到此这篇关于Android实现一个倒计时自定义控件的文章就介绍到这了,更多相关Android倒计时控件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android实现一个完美的倒计时功能

    目录 一. 已有倒计时方案存在的问题 1. CountDownTimer 2. Handler 3. Timer 二. 自己封装倒计时 总结 一. 已有倒计时方案存在的问题 在开发倒计时功能时往往我们会为了方便直接使用CountDownTimer或者使用Handler做延时来实现,当然CountDownTimer内部封装也是使用的Handler. 如果只是做次数很少的倒计时或者不需要精确的倒计时逻辑那倒没关系,比如说我只要倒计时10秒,或者我大概5分钟请求某个接口 但是如果是需要做精确的倒计时操

  • Android实现启动页倒计时效果

    今天介绍一个很简单的倒计时动画,仿酷狗音乐的启动页倒计时效果,也是大多数APP在用的一个动画,来看看效果图: 整体的思路就是用一个平滑的帧动画来画圆弧就行了. 这篇文章学到什么? 了解属性动画ValueAnimator的用法 了解动画属性插值Interpolator,让动画过度得更自然 如何画圆弧 开始准备 新建一个类继承TextView,因为中间还有跳过的文本,所以选择用TextView来画个动起来的背景图. /** * 倒计时文本 */ @SuppressLint("AppCompatCus

  • 利用Android设计一个倒计时组件

    目录 1 背景 2 对比分析 2.1 是否是倒计时 2.2 支持多任务 2.3 支持时间校准 2.4 支持同帧刷新 2.5 支持延迟执行 2.6 支持CPU休眠 3 需求目标 4 设计类结构 5 具体实现 5.1 收口 5.2 支持与RxJava协同 5.3 支持时间校准 5.4 支持同步刷新 5.5 支持延迟执行 1 背景 我们在项目中经常有倒计时的场景,比如活动倒计时.抢红包倒计时等等.通常情况下,我们实现倒计时的方案有Android中的CountDownTimer.Java中自带的Time

  • Android自定义View实现APP启动页倒计时效果

    Android自定义View实现APP启动页倒计时效果,供大家参考,具体内容如下 之前也是做过APP启动页的倒计时效果,但是只有文字变化,没有动画效果,这次通过使用自定义View控件来制作一个带有动画效果的倒计时. 倒计时效果的基本思路如下: Canvas提供了绘制弧形的方法,drawArc(),使用这个方法通过定时刷新计算当前弧形的角度,就可以模拟出倒计时的动画效果,同时借助drawText()方法可以实现倒计时文字.(1)继承View(2)使用canvas的drawArc()来绘制弧形,模拟

  • Android 实现抢购倒计时功能的示例

    一.效果图 二.思路 算多少秒,秒数取余60,(满足分后剩下的秒数) 算多少分,秒数除60,再取余60 (总分数满足小时后剩下的分数) 算多少时,秒数除60,除60,再取余24 (总小时满足天后剩下的小时) 算多少天,秒数除60,除60,除24 等到的整数就是天数 三.实现步骤: 我们这里的时间格式为后台返回,格式为: 2021-12-24 00:00:00 1.时间转换的工具类 //将年-月-天 时:分:秒转化为毫秒格式 public static long residueTimeout(St

  • Android实现一个倒计时自定义控件

    目录 (一)前言 (二)效果展示 (三)实现思路 (三)代码地址 总结 (一)前言 Android 其实提供了一个倒计时控件叫做CountDownTimer,这个倒计时控件用起来也很简单,但是要按照我们想要的倒计时样式去做就比较繁琐了.比如说我们希望倒计时按照我们想要的样式展示HH:MM:SS或者是HH-MM-SS等样式,或者希望如下展示: 要做的工作就会比较繁琐了,不是说不能实现,只是实现起来代价比较大,所以如果我们将其做成一个自定义的view,可以根据用户传进来的样式去做倒计时样式的展示(注

  • android实现一个图片验证码倒计时功能

    1.如图所示,要实现一个验证码的倒计时的效果          2.实现 图中获取验证码那块是一个button按钮 关键部分,声明一个TimeCount,继承自CountDownTimer /*验证码倒计时*/ private class TimeCount extends CountDownTimer{ /** * @param millisInFuture 总时间长度(毫秒) * @param countDownInterval 时间间隔(毫秒),每经过一次时间间隔都会调用onTick方法

  • Android自定义扇形倒计时实例代码

    一.概述 严格来说,我是Android小白,写的目的只是想作为知识储备而已-.但是想到别人或许会不小心搜到我的这篇,如果我只是简单的描述,别人有可能看不懂,说不定还被吐槽,那岂不是很冤吗? 所以,我还是把问题及过程描述清楚,这也是对自己的一个交代,同时,这也是我的第一篇,我应该做好它; 先说一下需求: 最近工作中需要做一个倒计时,是那种一个圆,慢慢的被吃掉的动画倒计时,由于自己知识不是很足,只知道要用Canvas来画,在网上搜了一圈,发现要么是静态的画了一个扇形,要么是不能控制控件的位置大小-.

  • Android中验证码倒计时的简单实现方法示例

    前言 现在的很多app都是使用手机注册的,为了确认使用的是自己的手机,都会加上一个短线验证码的选项,最近公司的项目使用到了这个短信验证码,并且要加入验证码倒计时功能,也就是60秒才能发送一次验证码,再次做过记录,以后使用的时候,可以随时拿来用. 实现 发送验证码的时候一般都会有一个按钮,点击之后便会给你输入的手机发送一条验证码,我这里使用的是一个TextView,显示特定的数字,只用设置TextView的点击事件即可: Android中有一个类,可以很方便的时候该功能,但是也会存在一个问题,就是

  • Android自定义圆环倒计时控件

    本文实例为大家分享了Android自定义圆环倒计时控件的具体代码,供大家参考,具体内容如下 先来一张最终效果图: 主要思路: 在画渐变色圆环的时候,设置一个属性动画,根据属性动画的执行时长,来作为倒计时的时长.监听属性动画的进度,来达到 倒计时的目的. 二话不说,直接贴代码.具体实现思路都在注释上. 自定义属性: <declare-styleable name="CountDownProgressBar"> <attr name="countDown_cir

  • Android 简单实现倒计时功能

    在 Android 中倒计时功能是比较常用的一个功能,比如短信验证码,付款倒计时等.实现方式有Handler.Thread 等,但是实现起来都有点麻烦,其实Android已经为我们封装好了一个抽象类 CountDownTimer,可以简单的实现倒计时功能,如下图所示. CountDownTimer 实现倒计时功能的机制也是用Handler 消息控制,只是它帮我们已经封装好了,先看一下它的介绍. Schedule a countdown until a time in the future, wi

  • Android创建一个Activity的方法分析

    本文实例讲述了Android创建一个Activity的方法.分享给大家供大家参考,具体如下: 为了创建一个新的Activity,你需要继承Activity类,定义UI,实现功能.新的Activity的最基本的框架代码如下所示: package com.paad.myapplication; import android.app.Activity; import android.os.Bundle; public class MyActivity extends Activity { /** Ca

  • Android实现时间倒计时功能

    本文实例为大家分享了Android实现时间倒计时功能展示的具体代码,供大家参考,具体内容如下 效果展示 MainActivity(主页面代码) public class MainActivity extends Activity { private RelativeLayout countDown; // 倒计时 private TextView daysTv, hoursTv, minutesTv, secondsTv; private long mDay = 10; private long

随机推荐