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
)
相关推荐
城东米粉儿11 分钟前
android 流量优化笔记
android
似霰1 小时前
HIDL Hal 开发笔记10----添加硬件访问服务(Java 层调用 HIDL)
android·framework·hal
佛系打工仔3 小时前
绘制K线第三章:拖拽功能实现
android·前端·ios
我命由我123453 小时前
Android 项目路径包含非 ASCII 字符问题:Your project path contains non-ASCII characters
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
wszy18093 小时前
rn_for_openharmony_空状态与加载状态:别让用户对着白屏发呆
android·javascript·react native·react.js·harmonyos
城东米粉儿3 小时前
JobScheduler 相关笔记
android
城东米粉儿3 小时前
android 耗电优化 笔记
android
张小潇3 小时前
AOSP15的Zygote启动流程源码分析
android
毕设源码-钟学长4 小时前
【开题答辩全过程】以 基于安卓的医疗健康查询系统为例,包含答辩的问题和答案
android
归真仙人4 小时前
【UE】UMG安卓相关问题
android·ue5·游戏引擎·ue4·虚幻·unreal engine