android字体颜色渐变色,实现TextView文本颜色渐变的骚操作

前言

最近开发过程中要实现文本颜色渐变的效果。什么,文本颜色也要渐变?虽然不乐意,但是也只能说好吧...

先来点最终效果图15e69bf3ef7b3ca23c1a1e5a19ef8739.png89df9d6f3e5b5e031e9823efe3d5e7da.png

常规操作

常见的渐变做法有两种,原理其实都是一样的。都是创建一个 LinearGradient 对象,并将其设置到 TextView 的画笔中。

先来简单介绍下 LinearGradient

LinearGradient

Shader 子类,用于实现线性渐变的效果。常用的构造方法如下

public LinearGradient(float x0,

float y0,

float x1,

float y1,

int color0,

int color1,

Shader.TileMode tile)

复制代码

参数说明

(x0, y0):渐变起始点坐标

(x1, y1):渐变结束点坐标

color0:渐变起始颜色

color1:渐变终止颜色

tile:填充模式

CLAMP:边缘拉伸。使用边缘颜色对区域外的范围进行填充

REPEAT:重复模式。在水平和垂直两个方向上重复填充

MIRROR:镜像模式。在水平和垂直两个方向上以镜像的方式重复填充,相邻图像间有间隙

做法一

继承 TextView,重写 onLayout 方法后设置 Shader

public class GradientTextView extends TextView {

...

@Override

protected void onLayout(boolean changed, int left, int top, int right, int bottom) {

super.onLayout(changed, left, top, right, bottom);

if (changed) {

getPaint().setShader(new LinearGradient(0, 0, getWidth(), getHeight(),

startColor,

endColor,

Shader.TileMode.CLAMP));

}

}

}

复制代码

创建 LinearGradient 时,传入的起始坐标为 (0,0),结束坐标为 (getWidth(), getHeight()),所以渐变效果是从左上角向右下角渐变的。效果如下23876571a09e713cd400d9dc955306f6.png

也可以改成从上往下渐变的效果

getPaint().setShader(new LinearGradient(0, 0, 0, getHeight(),

startColor,

endColor,

Shader.TileMode.CLAMP));

复制代码

效果如下c25042bd84cab2de2c83130f17705242.png

这种做法是为了获取 View 的宽或高作为 LinearGradient 的构造参数。如果渐变效果与 View 的宽或高无关,则无需使用此做法。另外此做法的渐变效果是整体的。如果想要实现 TextView 中每一行文本都渐变的话,可以参考下面的做法二

做法二

直接设置 Shader

Shader shader = new LinearGradient(0, 0, 0, textView.getLineHeight(),

Color.RED, Color.BLUE, Shader.TileMode.REPEAT);

textView.getPaint().setShader(shader);

textView.setText("哈喽,benio\n哈喽,benio\n哈喽,benio");

复制代码

效果如下9d91bac4b916dfbf45b88fe425f7a231.png

多行渐变,效果不错。但是这种做法有一点缺陷,那就是所有文字都变成渐变色了。假设我们只需要部分字符是渐变色的话,这种方式就不太合理了。特别是在一些使用了 Span 的场景下。

骚操作

要实现部分文字颜色不一样的话,第一时间我想到的是 Span。先看下官方提供的 ForegroundColorSpan

public class ForegroundColorSpan extends CharacterStyle

implements UpdateAppearance, ParcelableSpan {

private final int mColor;

public ForegroundColorSpan(@ColorInt int color) {

mColor = color;

}

...

/**

* Updates the color of the TextPaint to the foreground color.

*/

@Override

public void updateDrawState(@NonNull TextPaint textPaint) {

// 就是这里改了颜色

textPaint.setColor(mColor);

}

}

复制代码

可以看到,关键就是 updateDrawState() 方法。我们可以在该方法内实现想要的样式。接下来我们参考 ForegroundColorSpan 的做法,依照上面做法二的思路,实现一个渐变色的 Span

class LinearGradientForegroundSpan extends CharacterStyle implements UpdateAppearance {

private int startColor;

private int endColor;

private int lineHeight;

public LinearGradientForegroundSpan(int startColor, int endColor, int lineHeight) {

this.startColor = startColor;

this.endColor = endColor;

this.lineHeight = lineHeight;

}

@Override

public void updateDrawState(TextPaint tp) {

tp.setShader(new LinearGradient(0, 0, 0, lineHeight,

startColor, endColor, Shader.TileMode.REPEAT));

}

}

复制代码

测试代码

SpannableString part1 = new SpannableString("哈喽,");

part1.setSpan(new LinearGradientForegroundSpan(Color.RED, Color.LTGRAY, textView.getLineHeight()),

0, part1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

SpannableStringBuilder sb = new SpannableStringBuilder();

sb.append(part1);

sb.append("benio\n");

SpannableString part2 = new SpannableString("哈喽,benio\n哈喽,benio");

part2.setSpan(new LinearGradientForegroundSpan(Color.RED, Color.LTGRAY, textView.getLineHeight()),

0, part2.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

sb.append(part2);

textView.setText(sb);

复制代码

效果如下996ac238dfdd17bfc1c8ba4338fedccf.png

如果还不能满足你的需求,可以将 Shader 作为参数传入 Span 中

class ShaderForegroundSpan extends CharacterStyle implements UpdateAppearance {

private Shader mShader;

public ShaderForegroundSpan(Shader shader) {

mShader = shader;

}

@Override

public void updateDrawState(TextPaint tp) {

tp.setShader(mShader);

}

}

复制代码

小结

文本颜色渐变的原理都是通过创建一个 LinearGradient 对象,然后其设置到 TextView 的画笔中实现的。构造 LinearGradient 的参数不同,渐变效果也不一样

做法一:渐变效果与 View 的宽或高相关。适用于所有文本整体渐变的场景

做法二:渐变效果与行相关,每行的渐变效果一致。适用于每行文本渐变效果一致的场景

做法三:用 Span 来实现,适用于局部文本渐变,多行文本渐变的场景

参考

How to Create a Gradient TextView in Android

Text with gradient in Android

b739ec46bb5c46d9c0aa4ce35ba1ea56.png

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[实现TextView文本颜色渐变的骚操作]http://www.zyiz.net/tech/detail-132442.html

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 AndroidTextView实现字体颜色渐变的效果,你可以使用 SpannableString 和 ForegroundColorSpan 组合来实现。下面是一个示例代码: ```java TextView textView = findViewById(R.id.textView); String text = "Hello World!"; // 创建一个 SpannableString 对象 SpannableString spannableString = new SpannableString(text); // 定义渐变起始颜色和结束颜色 int startColor = Color.RED; int endColor = Color.BLUE; // 创建一个 ForegroundColorSpan 对象,并将其应用到 SpannableString ForegroundColorSpan colorSpan = new ForegroundColorSpan(startColor); spannableString.setSpan(colorSpan, 0, text.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); // 创建一个渐变效果的 Span Shader shader = new LinearGradient(0, 0, 0, textView.getPaint().getTextSize(), startColor, endColor, Shader.TileMode.CLAMP); ShaderSpan shaderSpan = new ShaderSpan(shader); // 将渐变效果的 Span 应用到 SpannableString spannableString.setSpan(shaderSpan, 0, text.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); // 设置 TextView文本为 SpannableString textView.setText(spannableString); ``` 在上面的示例中,我们首先创建了一个 SpannableString 对象,然后定义了起始颜色和结束颜色。接着,我们创建了一个 ForegroundColorSpan 对象,并将其应用到 SpannableString 中,以实现初始字体颜色。然后,我们创建了一个 LinearGradient 对象,并使用 ShaderSpan 来应用渐变效果。最后,我们将 SpannableString 设置为 TextView文本实现字体颜色渐变的效果。 请注意,这种方式只能实现单一的线性渐变效果。如果你想要实现更复杂的渐变效果,可能需要自定义 View 或使用第三方库。 希望这个示例对你有帮助。如果你有任何其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值