SpannableString----讓TextView實(shí)現(xiàn)炫酷效果

在我們平時的開發(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í)使用是很簡單的。

一、首先我們先看一個我做的效果圖。


效果.png

二、使用的步驟

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)系
如下圖所示


`6V$S9}6[)]@K(%GNR9W@AV.png

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效果
   */
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容