在我們平時的開發(fā)過程中,肯定會遇見過一些圖文混排的東西,甚至,同一段文字中,還有不同的字體、不同顏色、還有下劃線、中間刪除線、在我上家公司開發(fā)中的過程中,產(chǎn)品狗經(jīng)常會問我們,這些字體能不能變得粗一點(diǎn)。這些需求。當(dāng)時的思路就是很復(fù)雜的去自定義一些空間也能實(shí)現(xiàn)這樣的需求,殊不知TextView就有這樣的功能。這些復(fù)雜的功能就用一個TextView去實(shí)現(xiàn),確實(shí)很讓我吃驚?,F(xiàn)在我就把我實(shí)現(xiàn)的這些效果的流程給走一遍。其實(shí)使用是很簡單的。
一、首先我們先看一個我做的效果圖。

二、使用的步驟
1.實(shí)現(xiàn)TextView中部分文字的文字顏色、文字背景顏色。如果一般的開發(fā)人員就會選擇利用多個TextView實(shí)現(xiàn)這樣一段文字不同文字不用顏色、不同背景色的功能。
實(shí)現(xiàn)代碼如下
/**
* 設(shè)置文字背景色和文字顏色
*/
private void setBackAndForeColor(){
String content = "Iloveandroid!";
SpannableStringBuilder builder = new SpannableStringBuilder(content);
//背景顏色
BackgroundColorSpan span = new BackgroundColorSpan(Color.RED);
//設(shè)置文字的顏色
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>
代碼中有我們比較熟悉的代碼,一般情況下我們會這樣直接調(diào)用TextView.setText()設(shè)置TextView的文本內(nèi)容。
String content = "Iloveandroid!";
first.setText(builder);
2.TextView實(shí)現(xiàn)不同樣式的步驟,最后在總結(jié)的時候在同闡述各個效果類、方法參數(shù)的含義</br>
1.首先我們先對content進(jìn)行處理
SpannableStringBuilder builder = new SpannableStringBuilder(content);
創(chuàng)建不同樣式的對象,在這里咱們的代碼是實(shí)現(xiàn),部分位置的文字顏色、文字背景色的效果。就需要創(chuàng)建一個背景顏色的對象和一個文字顏色的對象。分別為
//背景顏色
BackgroundColorSpan span = new BackgroundColorSpan(Color.RED);
//設(shè)置文字的顏色
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.BLUE);
3.把樣式設(shè)置給要顯示的文本,并且要設(shè)置一定的顯示規(guī)則。
builder.setSpan(span,2,5,Spannable.SPAN_INCLUSIVE_INCLUSIVE);
4.把處理好的文本,設(shè)置給我們的控件,也是我們常用的。
first.setText(builder);
到這兒咱們就實(shí)現(xiàn)了在同一個TextView中實(shí)現(xiàn)復(fù)雜的樣式效果。
三、總結(jié)
先看下TextView.setText()方法。參數(shù)為:setText(CharSequence text);
在看一下CharSequence的繼承關(guān)系
如下圖所示

SpannableStringBuilder 和 我們平時使用的String都是CharSequence 子類,所以我們可以這樣使用。
我們在看看 都有什么樣式類
![ZB~80{D5A)$V0{R{L7}4OM.png
我們先羅列出幾個樣式的類
使用的基本上都是和設(shè)置文字顏色和背景顏色都是相同的
* AbsoluteSizeSpan: 設(shè)置部分字體的大小
* MaskFilterSpan:設(shè)置字體效果、模糊等
* StyleSpan:
* StrikethroughSpan:設(shè)置文字的刪除線
* UnderlineSpan:設(shè)置文字的下劃線
* ImageSpan:插入圖片
* ClickableSpan:為部分文字 加入點(diǎn)擊事件 加入點(diǎn)擊事件的時候當(dāng)在為textview加入點(diǎn)擊事件就會失效,這是事件分發(fā)機(jī)制的問題??梢宰约航鉀Q
添加點(diǎn)擊事件的代碼如下
* 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());//這段代碼一定要加上,否則點(diǎn)擊事件沒有響應(yīng)。
tv5.setText(builder);
}
*/
builder.setSpan(foregroundColorSpan,5,7,Spannable.SPAN_INCLUSIVE_INCLUSIVE);
第一個參數(shù)是樣式的對象
第二個參數(shù)是開始位置
第三個參數(shù)是結(jié)束位置
第四個參數(shù)是顯示的模式如下:
/**
* Spannable.SPAN_EXCLUSIVE_EXCLUSIVE目標(biāo)位置前后都不應(yīng)用span效果
* Spannable.SPAN_SPAN_INCLUSIVE_INCLUSIVE標(biāo)位置前不應(yīng)用span效果,后面應(yīng)用
* Spannable.SPAN_EXCLUSIVE_INCLUSIVE標(biāo)位置前不應(yīng)用span效果,后應(yīng)用
* Spannable.SPAN_INCLUSIVE_EXCLUSIVE標(biāo)位置前后都應(yīng)用span效果
*/