实现的效果就像这样,不知道是不是叫做动态处理文本。效果就是这么个效果,实现就是这么去实现,看下文分析。
使用场景
需要高亮文本中的某些内容,以突出重要的数据或者诱导用户去点击该内容。实现方式可以通过Html.fromHtml()
方式和SpannableStringBuilder
( 或者SpannableString
)去实现。
Tip: SpannableStringBuilder和SpannableString 的区别是 SpannableString 无法更改 String 的内容,也无法拼接多个SpannableString;
SpannableStringBuilder则可以通过其append()方法来拼接多个String,这里只介绍了SpannableStringBuilder的实现方式。
Html.fromHtml( ) 方式
Android目前不支持全部的HTML的标签,目前只支持与文本显示
和段落等标签,对于图片和其他的多媒体,还有一些自定义标签不能识别;
实现效果
使用方式
首先需要拿到你要高亮的字符串,通过html标签去设置,下面的代码用到了font标签和strong标签。然后通过Html.from(string) 方法去解析该字符串即可实现效果。
String str2 = "我要打赏这个内容,作者太TM帅了balabala,谁也不许拦我,除非她给我发红包,或者点个Star";
mTvTestHtmlText.setText(Html.fromHtml(str2));
SpannableStringBuilder 方式
主要能实现的效果如下:
修改字体颜色
设置字体背景颜色
设置字体大小
设置粗体斜体
设置删除线
设置下划线
设置图片----将位置为多少多少的地方设置为图片
设置点击事件
使用方式
主要是通过 setSpan()方法去实现,由于该方法能够同时使用多个,因此同一个字符串的长度内的内容可以有多种显示效果,例如:效果图中的打赏二字,添加了下划线的同时字体的颜色页变成偏蓝色,而且还添加了点击效果哦
组合使用实现的效果:代码中有注释,挺好理解的
需要注意的是setSpan方法
的最后一个参数,这个参数的含义是:控制第二和第三个参数的生效范围。它有四个可选值,分别是:
(前指的是第二个参数,后指的是第三个参数)
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
(前后都不包括)
Spanned.SPAN_INCLUSIVE_EXCLUSIVE
(前面包括,后面不包括)
Spanned.SPAN_EXCLUSIVE_INCLUSIVE
(前面不包括,后面包括)
Spanned.SPAN_INCLUSIVE_INCLUSIVE
(前后都包括)
String str2 = "我要打赏这个内容,作者太TM帅了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());
项目地址
这是一个我平时遇到的不能一下子实现的功能而做的 Demo 仓库,里面实现的内容很杂,想到什么就去实现什么,所以见谅吧。
地址是: AndroidLeaningDemo 在166~197行左右