Android 自定义计时器

为解决项目中倒计时需求,本文介绍一种使用自定义View继承TextView,并结合CountDownTimer实现倒计时的方法,特别适用于adapter场景。通过将倒计时逻辑封装于view内,简化了外部调用流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前端时间公司项目需要使用倒计时。我在网上搜了一阵子,发现网上大部分都是 启动一个子线程 ,然后TextView 显示。 这种方式引起的两个问题:

1.  子线程写在外面,导致代码有点乱。

2.  倒计时如果在adapter中,实现起来比较麻烦。

刚好我们的倒计时是在adapter中。最后,我通过自定义view,继承 TextView,使用  CountDownTimer 。 把倒计时放在view中。外部调用只需要传入总时长就好了。下面是代码部分(使用的是kotlin)

class MyCountDownTimer : TextView {

    private var countTime = 0L
    private var countDownTimer: MyCountDownTimer? = null

    private var mContext: Context? = context

    constructor (context: Context?) : this(context, null)

    constructor(context: Context?, attrs: AttributeSet?) : this(context, attrs, 0)

    constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
        mContext = context
    }

    //设置数据
    fun setTime(time: Int) {
        if (time <= 0) {
            return
        }
        this.countTime = time * 1000L

        if (countDownTimer != null) {
            stopTimer()
        }
        startTimer()

    }

    //计时器
    private inner class MyCountDownTimer(totleTime: Long, durTime: Long) : CountDownTimer(totleTime, durTime) {
        override fun onFinish() {
            stopTimer()
        }

        override fun onTick(millisUntilFinished: Long) {
            var timeStr = getTimeByLong(millisUntilFinished / 1000)
            Log.i("111", timeStr)
            text = timeStr
        }

    }

    // hh:mm:ss
    var hour = 60 * 60
    var minute = 60
    fun getTimeByLong(time: Long): String {
        var timeStr = "00:00:00"
        if(time > 0){
            val h = time / hour
            val m = time % hour / minute
            val s = time % minute

            timeStr = String.format("%02d:%02d:%02d",h,m,s)
        }

        return  timeStr
    }


    private fun startTimer() {
        countDownTimer = MyCountDownTimer(countTime, 1000)
        countDownTimer!!.start()
    }

    private fun stopTimer() {
        if (countDownTimer != null) {
            countDownTimer!!.cancel()
            countDownTimer = null
        }
    }

    override fun onDetachedFromWindow() {
        super.onDetachedFromWindow()
        stopTimer()
    }
}

考虑到很多软件的倒计时有背景色之类的,可以用  BackgroundColorSpan  将字符串进行处理后再展示。具体的根据实际需要进行修改

PS: 第一次写东西,不喜勿喷。欢迎交流

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值