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
)
相关推荐
林九生7 分钟前
【实用技巧】MySQL 绿色版一键路径更新脚本详解 —— update_path.bat 深度解析
android·数据库·mysql
故渊at1 小时前
第十三板块:Android 综合架构与未来演进 | 第三十一篇:Android 架构演进与 Fuchsia OS 的挑战
android·架构·宏内核·微内核·fuchsia·ipc 性能博弈
aqi001 小时前
一文速览 HarmonyOS 6.1.1 推出的十个新特性
android·华为·harmonyos·鸿蒙·harmony
matrixmind12 小时前
aiomysql:异步场景下的 MySQL 驱动
android·数据库·mysql·其他
随遇丿而安2 小时前
第8周:弹窗 / 提示组件全功能与弹窗优化
android
zh_xuan2 小时前
诡异Bug:输入框删除字符,却越删越多
android·bug
nwsuaf_huasir2 小时前
matlab绘制尺寸和字体合适的图片插入到latex的方法
android·开发语言·matlab
future_li2 小时前
Speed Tools:一套低侵入的 Android 插件化 + 动态换肤 + 字体切换框架
android
杊页2 小时前
第一板块:Android 系统基石与运行原理 | 第二篇:Android 编译、打包与安装机制
android·操作系统
故渊at2 小时前
第十二板块:Android 系统启动与初始化 | 第三十篇:Zygote 孵化机制与 System Server 的启动
android·wms·pms·ams·zygote·ipc