Compose 修改默认点击效果

一、Compose的默认点击效果

使用Modifier.clickables可以使Text有点击效果

 Text(text = "我是Text", modifier = Modifier.clickable {

    })

源码分析,点击效果clickable方法中的indication来实现的。
在这里插入图片描述
在Indication.kt中,indication默认是由DefaultDebugIndication实现的。
NoIndication是没有点击效果
在这里插入图片描述

二、实现自己的点击效果

比如实现一个红色、并且带有圆角的点击效果

@SuppressLint("ModifierFactoryUnreferencedReceiver")
fun Modifier.clickRed(
    enabled: Boolean = true,
    onClickLabel: String? = null,
    role: Role? = null,
    onClick: () -> Unit
) = composed(
    inspectorInfo = debugInspectorInfo {
        name = "clickable"
        properties["enabled"] = enabled
        properties["onClickLabel"] = onClickLabel
        properties["role"] = role
        properties["onClick"] = onClick
    }
) {
    Modifier.clickable(
        enabled = enabled,
        onClickLabel = onClickLabel,
        onClick = onClick,
        role = role,
        indication = RedLocalIndication.current,
        interactionSource = remember { MutableInteractionSource() }
    )
}

val RedLocalIndication = staticCompositionLocalOf<Indication> {
    RedBgIndication
}

private object RedBgIndication : Indication {

    private class RedBgIndication(
        private val isPressed: State<Boolean>,
        private val isHovered: State<Boolean>,
        private val isFocused: State<Boolean>,
    ) : IndicationInstance {
        override fun ContentDrawScope.drawIndication() {
            drawContent()
            if (isPressed.value) {
                // 点击红色效果
                drawRoundRect(
                    color = Color(0x52ff0000),
                    cornerRadius = CornerRadius(4.dp.toPx()),
                    size = size
                )
            } else if (isHovered.value || isFocused.value) {
                drawRect(color = Color.Black.copy(alpha = 0.1f), size = size)
            }
        }
    }

    @Composable
    override fun rememberUpdatedInstance(interactionSource: InteractionSource): IndicationInstance {
        val isPressed = interactionSource.collectIsPressedAsState()
        val isHovered = interactionSource.collectIsHoveredAsState()
        val isFocused = interactionSource.collectIsFocusedAsState()
        return remember(interactionSource) {
            RedBgIndication(isPressed, isHovered, isFocused)
        }
    }
}

// 使用
 Text(text = "我是Text", modifier = Modifier.clickRed{

    })
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值