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

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

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

(一)前言

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

分享给朋友:

相关文章

名人名言大全,分享100句

名人名言大全,分享100句

名人名言100句:…

视频号怎么开通微信小商店技巧流程方法分享

视频号怎么开通微信小商店技巧流程方法分享

这两年直播的风口一直高居不下,微信终于也跟上了直播热潮,视频号直播新增购物车功能,已经开通了小商店的视频号,可以在直播中上架小商店商品,直播过程可以展示并售卖商品。视频号直播带货无疑让更多创作者加入其中,同时也意味着视频号功能的进一步完善,…

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

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

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

爱奇艺“水逆”一整年

爱奇艺“水逆”一整年

图源:摄图网 编者按:本文来自微信公众号锌财经(ID:xincaijing),作者:路世明,编辑:大风,创业邦经授权转载 12月1日,有消息称,当天爱奇艺开始进行一轮大规模裁员。多位被裁员工称,此次裁员是爱奇艺历史上规模最大的一轮裁员,部分…

联想之鉴,大厂“芯”领神会

联想之鉴,大厂“芯”领神会

编者按:本文转自光子星球,作者文烨豪,编辑吴先之,创业邦经授权转载。 近日,阿里云宣布,达摩院成功研发出存算一体芯片。腾讯造芯的波澜还未平复,阿里便再次出招,造芯似乎成为了互联网巨头们的新常态。 就拿2021年来说,百度宣布昆仑2芯片量产,…

ajax请求步骤详细代码(前端ajax请求的五个步骤)

ajax请求步骤详细代码(前端ajax请求的五个步骤)

由于在工作中需要使用AJAX请求其他域名下的请求,但是会出现拒绝访问的情况,这是因为基于安全的考虑,AJAX只能访问本地的资源,而不能跨域访问。 比如说你的网站域名是aaa.com,想要通过AJAX请求bbb.com域名中的内容,浏览器就…