Android 自定义View之倒计时

本文介绍了一种自定义验证码按钮的方法,包括按钮的样式设置、倒计时功能及界面状态切换等。通过XML配置文件和自定义View实现了获取验证码后的倒计时效果。

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

Android 自定义View之倒计时

概述

在这里插入图片描述

在这里插入图片描述

代码实现

Kotlin代码:

class CountdownView @JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet?,
    defStyleAttr: Int = 0
) : AppCompatTextView(context, attrs, defStyleAttr), Runnable {

    private var totalSecond = 10
    private var currentSecond = 0
    private var TIMING_FINISHED = "发送验证码"
    private val TIMING_TEXT = "已发送(%d)"

    init {
        text = TIMING_FINISHED
        gravity = Gravity.CENTER
        minWidth = 80.dp
        textSize = 13F
        setPadding(10.dp)
        setTextColor(Color.parseColor("#FFFFFF"))
        background = ContextCompat.getDrawable(context, R.drawable.selector_countdown)
    }

    /**
     * 开始倒计时
     */
    fun start() {
        isEnabled = false
        currentSecond = totalSecond
        post(this)
    }

    /**
     * 结束倒计时
     */
    fun cancel() {
        currentSecond = 0
        text = TIMING_FINISHED
        isEnabled = true
    }

    override fun run() {
        if (currentSecond == 0) {
            cancel()
            return
        }
        currentSecond--
        text = String.format(TIMING_TEXT, currentSecond)
        postDelayed(this, 1000)
    }

    override fun onDetachedFromWindow() {
        super.onDetachedFromWindow()
        removeCallbacks(this)
    }
}

selector_countdown.xml:

<?xml version="1.0" encoding="utf-8"?><!-- 默认获取验证码按钮样式 -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false">
        <shape android:shape="rectangle">
            <corners android:radius="3dp" />
            <solid android:color="#BBBBBB" />
        </shape>
    </item>
    <item>
        <shape android:shape="rectangle">
            <corners android:radius="3dp" />
            <solid android:color="#FFB716" />
        </shape>
    </item>
</selector>

使用:

countdownView.start()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值