You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Jetpack Compose实现点击后按钮定时禁用再启用

实现点击后暂禁的可复用Modifier(Jetpack Compose)

要实现点击后禁用一段时间、超时自动恢复的功能,我们可以封装一个自定义Modifier,这样不仅能复用在Button上,还能应用到任意可点击的Compose组件上。

自定义Modifier实现

import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.alpha
import androidx.compose.foundation.clickable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Modifier
import androidx.compose.ui.composed
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.semantics.Role

fun Modifier.clickableWithCooldown(
    cooldownMs: Long = 1000, // 默认冷却1秒
    enabled: Boolean = true,
    onClickLabel: String? = null,
    role: Role? = null,
    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
    onClick: () -> Unit
): Modifier = composed {
    var isInCooldown by remember { mutableStateOf(false) }

    // 冷却超时后恢复可点击状态
    LaunchedEffect(isInCooldown) {
        if (isInCooldown) {
            kotlinx.coroutines.delay(cooldownMs)
            isInCooldown = false
        }
    }

    this
        // 冷却期间降低透明度,提供视觉反馈
        .alpha(if (enabled && !isInCooldown) 1f else 0.6f)
        .clickable(
            enabled = enabled && !isInCooldown,
            onClickLabel = onClickLabel,
            role = role,
            interactionSource = interactionSource,
            indication = null // 可根据需求保留默认点击反馈
        ) {
            isInCooldown = true
            onClick()
        }
}

使用示例

应用在Button上

Button(
    onClick = {}, // 这里留空,点击逻辑由Modifier接管
    modifier = Modifier.clickableWithCooldown(
        cooldownMs = 1500, // 自定义冷却1.5秒
        onClick = {
            // 处理点击事件
            println("Button clicked!")
        }
    )
) {
    Text(text = "Click me")
}

应用在其他组件(比如Text)上

Text(
    text = "Clickable Text",
    color = Color.Blue,
    modifier = Modifier.clickableWithCooldown(
        onClick = {
            println("Text clicked!")
        }
    )
)

关键说明

  • 状态管理:用remember和mutableStateOf保存冷却状态,确保重组时状态不丢失。
  • 冷却逻辑:LaunchedEffect监听冷却状态,一旦进入冷却就启动延迟任务,超时后重置状态。
  • 视觉反馈:通过alpha modifier在冷却期间降低组件透明度,让用户直观感知到组件不可点击。
  • 兼容性:保留了原生clickable modifier的参数(如enabled、role等),保证API一致性和扩展性。

内容的提问来源于stack exchange,提问作者acakojic

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 00:13:22