当前位置:首页 > 谈天说地

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

34资源网2022-02-14686
目录
  • (一)前言
  • (二)效果展示
  • (三)实现思路
  • (三)代码地址
  • 总结

(一)前言

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倒计时控件内容请搜索萬仟网以前的文章或继续浏览下面的相关文章希望大家以后多多支持萬仟网!

版权声明:34楼发布

本文链接:https://www.34l.com/post/7662.html

分享给朋友:

相关文章

2020年最新整理的男女生微信网名大全,看看有没有你需要的

2020年最新整理的男女生微信网名大全,看看有没有你需要的

现在是2020年了,大家有没有给自己的微信名取个霸气的名字呢?如果你还没有取,不知道给自己取个啥名好的话,可以看下小编为你推荐的这些微信网名吧,下面都是最新整理的,相信会对大家有帮助的。…

2021年创业的话,试试这几个点子行不行

2021年创业的话,试试这几个点子行不行

想要在平淡的生活工作中发现一些好的创业项目还真没那么容易。2019年即将过去一半,那么大家有没有发现什么2019年最新创业点子呢?哪些项目的市场前景以及利润可观呢?下面跟随快马小编一起来看看吧。说不定能够激发你的创业灵感!…

谈2022年平衡发展策略,我们要平衡的发展

谈2022年平衡发展策略,我们要平衡的发展

2022年解决方案的第二个关键词叫平衡。我们要平衡的发展,长期的发展。你的个人生活,你的公司事业,还有国家的形势,我觉得一定要平衡的去发展,不能说我只赚钱,身体就搞垮,或者说我只赚快钱,但是不关心国家的形势。你看,密室逃脱这个行业,上周国家…

抖音黄v认证有什么好处(抖音流量高的是蓝v和黄v)

抖音黄v认证有什么好处(抖音流量高的是蓝v和黄v)

我将要在这里告诉你们关于抖音号橱窗蓝v抖音小店所有的知识,认真看完。…

itunes备份路径在哪里(教你查看itunes备份路径)

itunes备份路径在哪里(教你查看itunes备份路径)

用itunes备份的都知道,备份到C盘的,日积月累,C盘越来越小了,上网教程参差不齐,本教程本人亲测,因为我看到我的64G SSD空间越来越小,伤不起!!!操作步骤1、下载Junction,将Junction.exe拷贝到C:Windows…

刘强东章泽天携手布局,“大厂”为何掀起私募热潮?

刘强东章泽天携手布局,“大厂”为何掀起私募热潮?

编者按:本文来自雷达财经(ID:leidacj),创业邦经授权发布。 作者|张凯旌 编辑|深海 京东在私募股权投资上又有新动作。 11月29日,由刘强东、章泽天、李瑞玉共同持股的海南三亚天博产业私募基金管理有限公司(下称“海南天博私…