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{

    })
Jetpack Compose 中的 `BottomNavigationView` 默认不会改变其背景色当你点击某个选项。然而,如果你想实现这种效果,你可以自定义 `BottomNavigationView` 的样式,并在切换选项时动态更改其背景颜色。以下是一个简单的步骤: 1. 首先,在主题中设置一个状态变量来表示当前选中的导航条项,以及它的对应颜色: ```kotlin val selectedNavigationItem = remember { mutableStateOf(BottomNavigationView.ItemState.UNSELECTED) } val bottomNavColor = when (selectedNavigationItem.value) { BottomNavigationView.ItemState.SELECTED -> Color.Black else -> Color.Transparent } ``` 2. 然后在 `BottomNavigationView` 组件上设置 `background` 属性: ```kotlin BottomNavigationView( items = menuItems, modifier = Modifier .padding(horizontal = 16.dp) .clickable(onClick = { selectedNavigationItem.value = it }) .background(bottomNavColor) ) ``` 这里使用了 `clickable` 功能,当某个项被点击时会更新 `selectedNavigationItem`。 3. 最后,在你的 Activity 或者 ViewModel 中监听 `selectedNavigationItem` 的变化,更新其他视图的颜色以便与底部栏形成对比: ```kotlin LaunchedEffect(Unit) { viewModel.selectedNavigationItem.collect { value -> // 更新其他界面元素的背景颜色或其他相关处理 } } ``` 请注意,这只是一个基本的示例,实际应用中可能需要配合 `MaterialTheme` 和更复杂的逻辑。如果要在切换时让整个屏幕变暗,可能需要使用一个 `Dialog` 或者 `Screen过渡` 来达到类似的效果
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值