Android 动态处理文本的两种半~方式

image.png

(以上文字纯属乱写,如有雷同,那就告诉我…天底下还有人比我帅了??)实现的效果就像这样,不知道是不是叫做动态处理文本。效果就是这么个效果,实现就是这么去实现,看下文分析。

使用场景

需要高亮文本中的某些内容,以突出重要的数据或者诱导用户去点击该内容。实现方式可以通过Html.fromHtml()方式和SpannableStringBuilder( 或者SpannableString )去实现。

Tip: SpannableStringBuilderSpannableString 的区别是

  • SpannableString 无法更改 String 的内容,也无法拼接多个 SpannableString
  • SpannableStringBuilder 则可以通过其append()方法来拼接多个String,这里只介绍了SpannableStringBuilder的实现方式。

Html.fromHtml( ) 方式

Android目前不支持全部的HTML的标签,目前只支持与文本显示段落等标签,对于图片和其他的多媒体,还有一些自定义标签不能识别;

  • 实现效果

    image.png

  • 使用方式

首先需要拿到你要高亮的字符串,通过html标签去设置,下面的代码用到了font标签strong标签

然后通过Html.from(string) 方法去解析该字符串即可实现效果。

1
2
String str2 = "我要<font color='#FF4081'>打赏</font>这个内容,<strong><font color='#FF4081'>作者太TM帅</font></strong>了balabala,谁也不许拦我,除非她给我发红包,或者点个Star";
mTvTestHtmlText.setText(Html.fromHtml(str2));

SpannableStringBuilder 方式

  • 使用方式

主要是通过 setSpan() 方法去实现,由于该方法能够同时使用多个,因此同一个字符串的长度内的内容可以有多种显示效果,

例如:效果图中的打赏二字,添加了下划线的同时字体的颜色页变成偏蓝色,而且还添加了点击效果哦

image.png

组合使用实现的效果:代码中有注释,挺好理解的 需要注意的是setSpan方法的最后一个参数,这个参数的含义是:控制第二和第三个参数的生效范围。它有四个可选值,分别是

  • Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括,前指的是第二个参数,后指的是第三个参数)
  • Spanned.SPAN_INCLUSIVE_EXCLUSIVE(前面包括,后面不包括)
  • Spanned.SPAN_EXCLUSIVE_INCLUSIVE(前面不包括,后面包括)
  • Spanned.SPAN_INCLUSIVE_INCLUSIVE(前后都包括)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
String str2 = "我要<font color='#FF4081'>打赏</font>这个内容,<strong><font color='#FF4081'>作者太TM帅</font></strong>了balabala,谁也不许拦我,除非她给我发红包,或者点个Star";

SpannableStringBuilder builder = new SpannableStringBuilder(str1);
// "我要"字体颜色变为粉色,Spanned.SPAN_EXCLUSIVE_INCLUSIVE 表示起始和终止的模式为:包左不包右
builder.setSpan(new ForegroundColorSpan(Color.parseColor("#FF4081")), 0, 2, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
// 设置背景色
builder.setSpan(new BackgroundColorSpan(Color.parseColor("#009ad6")), 4, 6, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
// 设置字体大小(绝对值,单位:像素)
builder.setSpan(new AbsoluteSizeSpan(80), 12, 14, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
// 设置粗体和斜体
builder.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 15, 23, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
// 设置删除线
builder.setSpan(new StrikethroughSpan(), 23, 29, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
// 设置下划线
builder.setSpan(new UnderlineSpan(), 29, 35, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
// 设置图片
builder.setSpan(new ImageSpan(this, R.mipmap.ic_launcher), 35, 38, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
// 设置点击
builder.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(MainActivity.this, "点击了打赏", Toast.LENGTH_SHORT).show();
}
}, 2, 4, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);

mTvTestSpannerText.setText(builder);
// 设置点击
mTvTestSpannerText.setMovementMethod(LinkMovementMethod.getInstance());

还有一种方式实现 TextView 文本的删除线,加粗,下划线,斜体

1
2
3
4
5
6
7
8
9
//代码中添加删除线
textView1.getPaint().setFlags(Paint.STRIKE_THRU_TEXT_FLAG);
//在代码中设置加粗
textView2.getPaint().setFlags(Paint.FAKE_BOLD_TEXT_FLAG);
//添加下划线
textView3.getPaint().setFlags(Paint.UNDERLINE_TEXT_FLAG);

在 xml 布局中设置加粗,斜体可以这么添加
android:textStyle="italic|bold"

项目地址

这是一个我平时遇到的不能一下子实现的功能而做的 Demo 仓库,里面实现的内容很杂,想到什么就去实现什么,所以见谅吧。

地址是: AndroidLeaningDemo 在166~197行左右

小额支持我写出更好的文章~