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

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

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

(一)前言

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

看完文章,还可以扫描下面的二维码下载快手极速版领4元红包

快手极速版二维码

快手极速版新人见面礼

除了扫码领红包之外,大家还可以在快手极速版做签到,看视频,做任务,参与抽奖,邀请好友赚钱)。

邀请两个好友奖最高196元,如下图所示:

快手极速版邀请好友奖励

扫描二维码推送至手机访问。

版权声明:本文由34楼发布,如需转载请注明出处。

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

分享给朋友:

相关文章

互联网有什么创业项目?这三种可以尝试下

互联网有什么创业项目?这三种可以尝试下

这几年来,很多互联网公司收到重创,苹果手机在中国的销量也在下跌,其股价更是跌得不行。京东创始人也因为去年的“桃色事件”一直名声不好,虽然后来解决了,不过还是有很大影响。互联网创业似乎已经步入了艰难期,不过,还是有很多人一头扎进来。在现在这个…

小成本投资创业项目有哪些?

小成本投资创业项目有哪些?

每个人可能都有想过投资创业发家致富,可是投资什么项目适合创业?根据小编的了解,现在适合创业的小成本投资创业项目还是有很多的,下面,我就跟大家分享几种吧。1.自媒体现在大家对自媒体不陌生,每天都在接触,其实按照大的方向区分自媒体分为两类文字型…

适合普通人做的小本创业点子

适合普通人做的小本创业点子

适合普通人做的小本创业生意有什么??随着零售行业的兴起,小型超市便利店生意成为创业者首选的项目之一,主要原因在于:投入资金小、回笼快,不需要太大的现金流来支撑、一年半左右就能回本。这对于拥有一部分闲置资金,想创业的投资者来说简直是很好的创业…

令人受益的三种说话方式了解一下

令人受益的三种说话方式了解一下

有人说:人与人之间最累的关系就是感觉话不投机,说得越多越费劲,最后只能无话可说其实,想让别人喜欢听你说话,要先掌握正确的表达方式。你对别人说话的样子,决定了你在别人眼中的样子。…

短视频文案素材哪里找(上热门的短视频素材)

短视频文案素材哪里找(上热门的短视频素材)

抖音怎么写文案?整理了100条抖音抖音爆款文案,直接套用就能火…

虚拟内存太低怎么设置(电脑磁盘空间不足清理步骤)

虚拟内存太低怎么设置(电脑磁盘空间不足清理步骤)

在电脑的平时使用中,经常会出现内存不足的提示,有时可能小伙伴们会疑惑了,明明自己是16G内存的性能为何也能出现这种提示呢?这是当你在运行多个大程序的时候,对内存的需求非常大,当物理内存不能满足需求时,有可能导致程序关闭而数据保存错误。那么在…