在我们平时的开发过程中,肯定会遇见过一些图文混排的东西,甚至,同一段文字中,还有不同的字体、不同颜色、还有下划线、中间删除线、在我上家公司开发中的过程中,产品狗经常会问我们,这些字体能不能变得粗一点。这些需求。当时的思路就是很复杂的去自定义一些空间也能实现这样的需求,殊不知TextView就有这样的功能。这些复杂的功能就用一个TextView去实现,确实很让我吃惊。现在我就把我实现的这些效果的流程给走一遍。其实使用是很简单的。
一、首先我们先看一个我做的效果图。
二、使用的步骤
1.实现TextView中部分文字的文字颜色、文字背景颜色。如果一般的开发人员就会选择利用多个TextView实现这样一段文字不同文字不用颜色、不同背景色的功能。
实现代码如下
/**
* 设置文字背景色和文字颜色
*/
private void setBackAndForeColor(){
String content = "Iloveandroid!";
SpannableStringBuilder builder = new SpannableStringBuilder(content);
//背景颜色
BackgroundColorSpan span = new BackgroundColorSpan(Color.RED);
//设置文字的颜色
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.BLUE);
builder.setSpan(span,2,5,Spannable.SPAN_INCLUSIVE_INCLUSIVE);
builder.setSpan(foregroundColorSpan,5,7,Spannable.SPAN_INCLUSIVE_INCLUSIVE);
SpannableStringBuilder builder1 = new SpannableStringBuilder(content);
first.setText(builder);
}
</code>
代码中有我们比较熟悉的代码,一般情况下我们会这样直接调用TextView.setText()设置TextView的文本内容。
String content = "Iloveandroid!";
first.setText(builder);
2.TextView实现不同样式的步骤,最后在总结的时候在同阐述各个效果类、方法参数的含义</br>
1.首先我们先对content进行处理
SpannableStringBuilder builder = new SpannableStringBuilder(content);
创建不同样式的对象,在这里咱们的代码是实现,部分位置的文字颜色、文字背景色的效果。就需要创建一个背景颜色的对象和一个文字颜色的对象。分别为
//背景颜色
BackgroundColorSpan span = new BackgroundColorSpan(Color.RED);
//设置文字的颜色
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.BLUE);
3.把样式设置给要显示的文本,并且要设置一定的显示规则。
builder.setSpan(span,2,5,Spannable.SPAN_INCLUSIVE_INCLUSIVE);
4.把处理好的文本,设置给我们的控件,也是我们常用的。
first.setText(builder);
到这儿咱们就实现了在同一个TextView中实现复杂的样式效果。
三、总结
先看下TextView.setText()方法。参数为:setText(CharSequence text);
在看一下CharSequence的继承关系
如下图所示
SpannableStringBuilder 和 我们平时使用的String都是CharSequence 子类,所以我们可以这样使用。
我们在看看 都有什么样式类
![ZB~80{D5A)$V0{R{L7}4OM.png
我们先罗列出几个样式的类
使用的基本上都是和设置文字颜色和背景颜色都是相同的
* AbsoluteSizeSpan: 设置部分字体的大小
* MaskFilterSpan:设置字体效果、模糊等
* StyleSpan:
* StrikethroughSpan:设置文字的删除线
* UnderlineSpan:设置文字的下划线
* ImageSpan:插入图片
* ClickableSpan:为部分文字 加入点击事件 加入点击事件的时候当在为textview加入点击事件就会失效,这是事件分发机制的问题。可以自己解决
添加点击事件的代码如下
* private void setClick(){
String content = "Iloveandroid!";
SpannableStringBuilder builder = new SpannableStringBuilder(content);
ClickableSpan span = new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(MainActivity.this,"click",Toast.LENGTH_SHORT).show();
}
};
builder.setSpan(span,3,7,Spanned.SPAN_INCLUSIVE_INCLUSIVE);
tv5.setMovementMethod(LinkMovementMethod.getInstance());//这段代码一定要加上,否则点击事件没有响应。
tv5.setText(builder);
}
*/
builder.setSpan(foregroundColorSpan,5,7,Spannable.SPAN_INCLUSIVE_INCLUSIVE);
第一个参数是样式的对象
第二个参数是开始位置
第三个参数是结束位置
第四个参数是显示的模式如下:
/**
* Spannable.SPAN_EXCLUSIVE_EXCLUSIVE目标位置前后都不应用span效果
* Spannable.SPAN_SPAN_INCLUSIVE_INCLUSIVE标位置前不应用span效果,后面应用
* Spannable.SPAN_EXCLUSIVE_INCLUSIVE标位置前不应用span效果,后应用
* Spannable.SPAN_INCLUSIVE_EXCLUSIVE标位置前后都应用span效果
*/