Android文字渐变的实现

Android文字渐变的实现

最近设计师提了一个特殊字体,是从上到下渐变的效果。

正常是这样:

intArrayOf(startColor, endColor), // 只需两个颜色

但是我发现颜色不太对,颜色底部的太浅,顶部太深。优化下应该是这样:

intArrayOf(startColor, startColor, endColor, endColor),

可以这样写:

kotlin 复制代码
class GradientTextView @JvmOverloads constructor(
    context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : AppCompatTextView(context, attrs, defStyleAttr) {

    private var startColor = 0x00FFFF.toInt()
    private var endColor = 0xFFFFFF.toInt()

    override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
        super.onLayout(changed, left, top, right, bottom)
        if (changed) updateGradient()
    }

    private fun updateGradient() {
        if (width == 0 || height == 0) return
        paint.shader = LinearGradient(
            0f, 0F,
            0f, height.toFloat(),
            intArrayOf(startColor, startColor, endColor, endColor),
            null,
            Shader.TileMode.CLAMP
        )
        invalidate()
    }
}

下面是AI逐行解释


这段代码是 Android 自定义 View 中用于创建和更新线性渐变效果的代码。让我逐步解释:

1. onLayout 方法

kotlin 复制代码
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
    super.onLayout(changed, left, top, right, bottom)
    if (changed) updateGradient()
}
  • 作用:当 View 的布局发生变化时被调用
  • 参数
    • changed: 布局是否改变(尺寸或位置变化)
    • left/top/right/bottom: View 相对于父容器的位置坐标
  • 逻辑 :只有在布局真正改变时(changed == true)才更新渐变,避免不必要的重绘

2. updateGradient 方法

kotlin 复制代码
private fun updateGradient() {
    if (width == 0 || height == 0) return  // ①
    paint.shader = LinearGradient(         // ②
        0f, 0f,                            // 起点坐标 (x1, y1)
        0f, height.toFloat(),              // 终点坐标 (x2, y2)
        intArrayOf(startColor, startColor, endColor, endColor),  // ③
        null,                              // ④
        Shader.TileMode.CLAMP              // ⑤
    )
    invalidate()                           // ⑥
}

关键点解析

尺寸检查

  • 避免在 View 还未测量完成时创建渐变(width/height 为 0)

LinearGradient 线性渐变

  • (0, 0)(0, height) 创建垂直渐变(从上到下)

颜色数组

kotlin 复制代码
intArrayOf(startColor, startColor, endColor, endColor)
  • 包含 4 个颜色值,但只有两种颜色
  • 这样配置会创建特殊的渐变效果(可能是为了控制渐变的分布)

位置数组为 null

  • 不指定颜色的位置,系统会均匀分布颜色
  • 如果是 [0f, 0.3f, 0.7f, 1f] 则可以精确控制每个颜色的位置

TileMode.CLAMP

  • 超出渐变范围的区域使用边缘颜色填充

invalidate()

  • 触发 View 重绘,使新的渐变生效

渐变效果示意

复制代码
┌─────────────┐
│ startColor  │ ← 顶部
│ startColor  │
│             │ 
│   渐变过渡   │
│             │
│  endColor   │
│  endColor   │ ← 底部
└─────────────┘

可能的改进建议

如果想要简单的双色渐变,可以简化为:

kotlin 复制代码
paint.shader = LinearGradient(
    0f, 0f,
    0f, height.toFloat(),
    intArrayOf(startColor, endColor),  // 只需两个颜色
    null,
    Shader.TileMode.CLAMP
)
相关推荐
SharpCJ16 分钟前
Android 开发者为什么必须掌握 AI 能力?端侧视角下的技术变革
android·ai·aigc
_李小白1 小时前
【OSG学习笔记】Day 38: TextureVisitor(纹理访问器)
android·笔记·学习
JJay.1 小时前
Kotlin 高阶函数学习指南
android·开发语言·kotlin
jinanwuhuaguo1 小时前
截止到4月8日,OpenClaw 2026年4月更新深度解读剖析:从“能力回归”到“信任内建”的范式跃迁
android·开发语言·人工智能·深度学习·kotlin
JJay.2 小时前
Android Kotlin 协程使用指南
android·开发语言·kotlin
BLUcoding3 小时前
Android 布局介绍
android
summerkissyou19873 小时前
android-蓝牙-状态和协议值总结及监听例子
android·蓝牙
徒 花3 小时前
数据库知识复习05
android·数据库
提子拌饭1335 小时前
番茄时间管理:鸿蒙Flutter 实现的高效时间管理工具
android·flutter·华为·架构·开源·harmonyos·鸿蒙
4311媒体网5 小时前
帝国CMS二次开发实战:精准实现“最新资讯”标识与高亮判断
android