将像素转换为 Dp 以在 Jetpack Compose 中自定义圆形指示

时间:2021-01-14 22:22:40

标签: android android-jetpack-compose

我想在单击按钮时显示自定义指示。指示应在角落处倒圆并覆盖较深的颜色。到目前为止,我能够使用以下代码实现这一点

Modifier.clickable(onClick = {}, indication = PressedIndication)
object PressedIndication : Indication {

    private object DefaultIndicationInstance : IndicationInstance {
        override fun ContentDrawScope.drawIndication(interactionState: InteractionState) {
            drawContent()
            if (interactionState.contains(Interaction.Pressed)) drawRoundRect(
                cornerRadius = CornerRadius(4f, 4f), //<-- How to use dp values?
                color = Color.Black.copy(
                    alpha = 0.3f
                ), size = size
            )

        }
    }

    override fun createInstance(): IndicationInstance {
        return DefaultIndicationInstance
    }
}

我可以使用 drawRoundRectcornerRadius 实现圆角,但有没有办法使用 dp 值?

注意:我不能使用 clickableclip,因为可点击区域与指示区域不完全匹配

2 个答案:

答案 0 :(得分:1)

你可以通过 Dp,但你必须调整到屏幕的密度。密度范围代码块内的扩展函数 Dp.toPx() 工作正常。

val sizeInPx = with(AmbientDensity.current) { 16.dp.toPx() }

答案 1 :(得分:1)

2jan222 所述,您可以使用 Dp.toPx() 进行转换。

在您的情况下,您可以避免构建自定义 Indication
你也可以使用类似的东西:

 val interactionSource = remember { MutableInteractionSource() }
 Modifier.clickable(
        interactionSource = interactionSource,
        indication = rememberRipple(
             radius = 4.dp,
             color=Color.Black.copy(alpha = 0.3f))
        )