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

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

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

(一)前言

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

分享给朋友:

相关文章

多认识人有什么好处?朋友多好办事我是这么理解的

多认识人有什么好处?朋友多好办事我是这么理解的

多认识人有什么好处?俗话说,人多好办事,认识的人多了,你的路子就宽了,想办什么事情,跟大家一商量,人家都会给你出出主意,比起自己一个人在那瞎折腾,要好很多。这点,我相信很多朋友都深有体会吧。…

好太太抽油烟机推荐,目前行业领先产品

好太太抽油烟机推荐,目前行业领先产品

好太太抽油烟机是目前行业当中比较领先的一个品牌,这个牌子的油烟机一直采用的是国际的先进生产技术,而且技术都是达到国际的标准了。另外好太太油烟机还有不同的研发中心。当收集完消费者的意见以后,好太太油烟机的研发中心就开始进行研发,生产出合乎消费…

智能电视和普通电视的区别,智能电视好还是普通电视好?

智能电视和普通电视的区别,智能电视好还是普通电视好?

好多人对智能电视和普通的区别还分不大清楚,今天小编就将智能电视和和普通电视做个简单明了的介绍,希望对大家有所帮助。简单的讲,就是智能电视可以看直播电视,也可以点播一些网络电视来看,这个就是最大的区别。当然,有些智能电视还有储存功能,比如,可…

coco奶茶店加盟费大概多少钱?有哪些优势?

coco奶茶店加盟费大概多少钱?有哪些优势?

CoCo奶茶来自宝岛台湾的奶茶加盟连锁品牌,以绿色健康休闲奶茶饮品为主打的连锁机构,在中国及东南亚地区拥有众多加盟连锁店。相信很多人都想加盟这个奶茶店吧?那么,coco奶茶店加盟费大概多少钱?加盟有哪些优势呢?下面小编就详细和大家介绍下吧。…

女人励志语录20句,满满的正能量句子

女人励志语录20句,满满的正能量句子

1、每一个太阳升起,老想带去期待的问候:让每日的气体全是清爽让每日的情绪全是伸展让每日的获得全是丰富!…

用侠肝义胆造句30句

用侠肝义胆造句30句

1、李大哥侠肝义胆,受到四邻的交口称赞。…