Hasta ahora, Jetpack Compose no proporciona gradientes de texto ni sombras internas listas para usar. Por lo tanto, necesita pintarlo usted mismo:

@Composable fun drawGradientText(name: String, modifier: Modifier = Modifier) { val paint = Paint().asFrameworkPaint() val gradientShader: Shader = LinearGradientShader( from = Offset(0f, 0f), to = Offset(0f, 400f), listOf(Color.Blue, Color.Cyan) ) Canvas(modifier.fillMaxSize()) { paint.apply { isAntiAlias = true textSize = 400f typeface = Typeface.create(Typeface.DEFAULT, Typeface.BOLD) style = android.graphics.Paint.Style.FILL color = android.graphics.Color.parseColor("#cdcdcd") xfermode = PorterDuffXfermode(PorterDuff.Mode.DST_OVER) maskFilter = BlurMaskFilter(30f, Blur.NORMAL) } drawIntoCanvas { canvas -> canvas.save() canvas.nativeCanvas.translate(2f, 5f) canvas.nativeCanvas.drawText(name, 0f, 400f, paint) canvas.restore() paint.shader = gradientShader paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR) paint.maskFilter = null canvas.nativeCanvas.drawText(name, 0f, 400f, paint) canvas.nativeCanvas.translate(2f, 5f) paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.DST_OVER) paint.maskFilter = BlurMaskFilter(30f, Blur.NORMAL) canvas.nativeCanvas.drawText(name, 0f, 400f, paint) } paint.reset() } }Puede ajustar los modos y compensaciones de PorterDuff para cumplir con sus requisitos.
Acabo de encontrarme con el mismo caso de uso, pero solo para un degradado simple en el texto. Lo publico aquí por si ayuda a alguien.
Lo que funcionó para mí fue dibujar el contenido y luego el degradado a través de Modifier.graphicsLayer (extrapolado de esta respuesta en Slack):
Text( text = "$ 20", /** size/font style, etc. **/ modifier = Modifier.graphicsLayer(alpha = 0.99f) .drawWithCache { val brush = Brush.horizontalGradient(listOf(StartColor, EndColor)) onDrawWithContent { drawContent() drawRect(brush, blendMode = BlendMode.SrcAtop) } } ) Terminé convirtiéndolo en un Modifier para su reutilización:
fun Modifier.textBrush(brush: Brush) = this .graphicsLayer(alpha = 0.99f) .drawWithCache { onDrawWithContent { drawContent() drawRect(brush, blendMode = BlendMode.SrcAtop) } }Resultado de ejemplo: