Android Jetpack Compose 中的文本渐变

Dmy*_*nko 10 android kotlin android-jetpack-compose

无法弄清楚如何使用 Jetpack Compose 中的修饰符向带有内部阴影的文本添加渐变。有这样的事情?有任何想法吗?

在此处输入图片说明

小智 17

在 Jetpack Compose 1.2.0-beta01中添加了文本渐变。

例子:

@Composable
fun BrushDemo() {
    Text(
        "Brush is awesome\nBrush is awesome\nBrush is awesome",
        style = TextStyle(
            brush = Brush.linearGradient(
                colors = RainbowColors,
                tileMode = TileMode.Mirror
            ),
            fontSize = 30.sp
        )
    )
}
Run Code Online (Sandbox Code Playgroud)

更多示例请参见此处


neb*_*hie 16

刚刚遇到了相同的用例,但只是为了文本上的简单渐变。将其发布在这里以防对某人有帮助。

对我有用的是绘制内容,然后通过(从Slack 上的这个Modifier.graphicsLayer答案推断)绘制渐变:

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)
        }
     }
)
Run Code Online (Sandbox Code Playgroud)

我最终将其设为Modifier可重用:

fun Modifier.textBrush(brush: Brush) = this
   .graphicsLayer(alpha = 0.99f)
   .drawWithCache {
      onDrawWithContent {
         drawContent()
         drawRect(brush, blendMode = BlendMode.SrcAtop)
      }
   }
Run Code Online (Sandbox Code Playgroud)

结果示例:

带渐变的文字


Vas*_*iyT 12

到目前为止,jetpack compose 没有提供开箱即用的文本渐变和内部阴影。因此需要自己绘制:

结果图像

@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()
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以调整 PorterDuff 模式和偏移以满足您的要求。