Android Jetpack Compose 中的文本渐变

Posted

技术标签:

【中文标题】Android Jetpack Compose 中的文本渐变【英文标题】:Text Gradient in Android Jetpack Compose 【发布时间】:2021-01-19 23:59:29 【问题描述】:

不知道如何将渐变添加到带有内阴影的文本中Jetpack Compose 中的修饰符。 有这样的东西?有什么想法吗?

【问题讨论】:

【参考方案1】:

到目前为止,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()
    

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

【讨论】:

你能帮忙解决这个问题吗? ***.com/questions/68996525/…【参考方案2】:

刚刚遇到了相同的用例,但只是为了在文本上进行简单的渐变。把它贴在这里以防它对某人有帮助。

对我有用的是绘制内容,然后通过Modifier.graphicsLayer 绘制渐变(从this 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)
        
     
)

我最终将其设为 Modifier 以供重复使用:

fun Modifier.textBrush(brush: Brush) = this
   .graphicsLayer(alpha = 0.99f)
   .drawWithCache 
      onDrawWithContent 
         drawContent()
         drawRect(brush, blendMode = BlendMode.SrcAtop)
      
   

示例结果:

【讨论】:

以上是关于Android Jetpack Compose 中的文本渐变的主要内容,如果未能解决你的问题,请参考以下文章

Android Jetpack Compose学习—— Jetpack compose基础布局

Android Jetpack Compose学习—— Jetpack compose入门

Android Jetpack Compose学习—— Jetpack compose入门

Jetpack Compose 和 Compose Navigation 如何处理 Android 活动?

Android:Activity 中的 Jetpack Compose 和 XML

android -------- Jetpack Compose基础使用