前言

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

先来点最终效果图

常规操作

常见的渐变做法有两种,原理其实都是一样的。都是创建一个 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()),所以渐变效果是从左上角向右下角渐变的。效果如下

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

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

startColor,

endColor,

Shader.TileMode.CLAMP));

复制代码

效果如下

这种做法是为了获取 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");

复制代码

效果如下

多行渐变,效果不错。但是这种做法有一点缺陷,那就是所有文字都变成渐变色了。假设我们只需要部分字符是渐变色的话,这种方式就不太合理了。特别是在一些使用了 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);

复制代码

效果如下

如果还不能满足你的需求,可以将 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

关于找一找教程网

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

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

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

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

  1. TextView文本颜色状态选择器

    ImageView状态选择器 一般情况下,我们为ImageView设置一个状态选择器,实现点击控件改变其背景图片: 如: <ImageView android:id="@+id/nav ...

  2. Unity 颜色查找表富文本颜色

    颜色代码: 1.白色 #FFFFFF 2.红色 #FF0000 3 绿色 #00FF00 4 蓝色 #0000FF 5 牡丹红 #FF00FF 6 青色 #00FFFF 7 黄色 #FRFF00 8 ...

  3. Android开发中如何给TextView文本字体加粗

    TextView textView = (TextView) findViewById(R.id.TextView01); textView.setTypeface(Typeface.defaultF ...

  4. BootStrap4 文本颜色和背景颜色

    专门腾一篇颜色效果图出来了 文本颜色 背景颜色 文本颜色 <!-- BootStrap4 文字颜色 --><p class="text-muted">柔和的 ...

  5. Android学习笔记10:TextView的使用

    TextView不仅可以用于显示丰富的文本信息,还可以用来显示图文并茂的混排页面. 1.TextView常用属性 TextView的常用属性有以下一些: setText();              ...

  6. android code修改border颜色,Android自定义TextView边框颜色(动态改变边框颜色以及字体颜色)...

    最近写了一个带边框的TextView,因为项目中有许多地方需要用到一个带边框的TextView,而且需要根据不同的状态显示不同的边框颜色,当时的第一反应就是用shape做,但后来转念一想这要需要定义多 ...

  7. android textview 背景图片,Android—TextView 背景颜色与背景图片设置

    Android TextView 背景颜色与背景图片设置,android textview 控件,android textview 背景, android textview 图片,android te ...

  8. android textview获取背景颜色,Android TextView背景颜色与背景图片设置

    Android TextView 背景颜色与背景图片设置,android textview 控件,android textview 背景, android textview 图片,android te ...

  9. android字体颜色黑色,Android中颜色选择器和改变字体颜色的实例教程

    1.构建一张七彩图: 我们经常看到这种样子的颜色选择器吧.. 然后其实右边的亮度选择是: 这样我们的代码就可以进行啦... // 创建七彩图片 private void init() { int[] ...

  10. android 动态修改 selector,Android Selector 按下修改背景和文本颜色的实现代码

    1,selector 按下修改背景和文本颜色 [1]点击改变字体颜色 - android:state_pressed(按压状态) [2]selector状态选择器(bg_btn_two (存放 res ...

最新文章

  1. CV竞赛项目研究:脊柱疾病诊断(天池,GPU赛道,2020年9月)
  2. DeepLearning 应用概述
  3. mysql-Mac终端下遇到的问题总结
  4. 和老师一定要保持沟通
  5. POJ-2976 Dropping tests 01分数规划
  6. html5实现圆圈里带一个三角形,CSS制作箭头图标代码(圆,三角形,椭圆)c
  7. c#,xp系统,Matlab6.5
  8. keras中文文档_【DL项目实战02】图像识别分类——Keras框架+卷积神经网络CNN(使用VGGNet)
  9. 贪心算法——Huffman 压缩编码的实现
  10. 面向机器学习的特征工程 八、自动化特征提取器:图像特征提取和深度学习
  11. C#中的深度学习:了解神经网络架构
  12. Pytest框架教程(一)
  13. 使用Outlook Connector插件之后 qq发送过来的邮件为乱码
  14. 如何连接mac与无线打印机?
  15. DLNA(明基的返校讲座)
  16. Youtube推荐系统论文-《Deep Neural Networks for YouTube Recommendations》-简单总结
  17. 微信公众号游戏 服务器,永不消逝的69号服务器
  18. 机器学习——二分类、多分类的精确率和召回率
  19. 易优cms安装环境要求
  20. 成都市武侯区计算机实验学校,成都市武侯区金辉实验学校

热门文章

  1. 人脸识别:技术应用与商业实践
  2. python中ones zeros 的用法
  3. 客户机网络打印不能打印必须重启才能打印一次等假死现象的解决方法
  4. 齐次线性方程组系数矩阵的秩与解集的秩
  5. dsolve函数的功能_MATLAB 求解常微分方程的函数是dsolve()。
  6. vue项目中如何解决跨域问题
  7. 合成孔径雷达影像(SAR图像)变化检测传统研究方法
  8. 就在昨天,张一鸣宣布卸任字节跳动CEO!
  9. windows7家庭版,专业版,旗舰版,企业版版本区别
  10. 遇到流氓软件不要慌,一篇文章帮您完全清理