Android TextView 動態(tài)改變字體顏色

實際上這個問題百度一大堆,但是你不一定能找到真正好的

http://blog.csdn.net/harvic880925/article/details/38984705

這篇博文寫的就是好的,站在巨人的肩上,借鑒注明出處。

SO

了解到的方法有兩種,一種是設(shè)置span,一種是讓TextView顯示網(wǎng)頁格式。

一般來說,我們調(diào)用一個TextView的setText();方法時,傳入的是一個String對象,這樣TextView就會幫我們把字符串展示出來,而實際上,

setText傳入的是一個CharSequence,而String實現(xiàn)了CharSequence,所以可以作為參數(shù)設(shè)置進來,同樣道理,這兩種能改變字符樣式的方法,用到的類也是CharSequence的子類或者實現(xiàn)類,只不過他比String,多了能改變樣式的特性。


方法一,設(shè)置字符樣式

會用到SpannableStringSpannableStringBuilder來取代String

SpannableString 和 SpannableStringBuilder的區(qū)別是SpannableString 需要一次性傳入字符構(gòu)造,并且不允許更改添加字符

SpannableString spanString = new SpannableString("這是測試文本");

而SpannableStringBuilder和StringBuilder一樣,是可以使用append拼接字符串的。

SpannableStringBuilder builder = new SpannableStringBuilder();

builder.append("字符一");

builder.append("字符二");

builder.append("字符三");

接著是SpannableString 和 SpannableStringBuilder的

setSpan(Object?what,int start,int end,int flags)方法

四個參數(shù)

Object what: 設(shè)置的span類型,顏色,粗體,下劃線等等

int start: 開始作用的索引,包括start,索引從0開始

int end: span結(jié)束作用的索引,不包括end

int flags: 有四個取值,分別表示是否作用于span范圍前后新增的字符

Spannable.SPAN_EXCLUSIVE_EXCLUSIVE,前后都不作用

Spannable.SPAN_EXCLUSIVE_INCLUSIVE,后面作用

Spannable.SPAN_INCLUSIVE_EXCLUSIVE,前面作用

Spannable.SPAN_INCLUSIVE_INCLUSIVE,前后都作用

可以這樣區(qū)分,SPAN之后第一個字母是前,第二個字母是后,EXCLUSIVE不包括,INCLUSIVE包括.

舉個例子

SpannableStringBuilder builder = new SpannableStringBuilder();

builder.append("字符一");

builder.append("字符二");

builder.append("字符三");

ForegroundColorSpan span = new ForegroundColorSpan(Color.rgb(254,58,54));

builder.setSpan(span, 2, 4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

edit.setText(builder);



EditText展示


EditText展示

可以看到,索引2,4,作用的是下標(biāo)為2,3的字符,而設(shè)置flag設(shè)置為Spannable.SPAN_INCLUSIVE_EXCLUSIVE的效果,“一字”之前添加的字符是同樣會被樣式作用的,而之后的字符是不會的。

關(guān)于Span類型

字體顏色

SpannableString spanString = new SpannableString("這是測試文本");

ForegroundColorSpan span = new ForegroundColorSpan(Color.rgb(254,58,54));

spanString.setSpan(span, 2, 4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

tv.setText(spanString);


ForegroundColorSpan

構(gòu)建ForegroundColorSpan時需要傳入一個顏色的int值,可以選用android自帶的Color下的顏色,也可以用自定義在color.xml里的顏色,也可以像上面寫的用Color.rgb去解析一個顏色,RGB值可以用拾色器去取,一般用第二種了,比較規(guī)范,這里是試試第三種行不行忘了改回來。

關(guān)于其他的span,還有

字體的背景顏色BackgroundColorSpan

字體大小AbsoluteSizeSpan

AbsoluteSizeSpan span = new AbsoluteSizeSpan(11);

注意一下,設(shè)置的是像素值。

粗體,斜體 : StyleSpan

StyleSpan styleSpan = new StyleSpan(Typeface.BOLD);

可以看到,參數(shù)是Typeface下的常量,而Typeface下有各種參量。SERIF之類的,能用的只有粗體和斜體。


StyleSpan構(gòu)造函數(shù)


TypeFace下的style

可以看到,構(gòu)造函數(shù)告訴我們參數(shù)是TypeFace下的常量,而Typeface下有個很友好的提示Style指示這四個常量,不用擔(dān)心會用到別的常量,因為你不填這四個,構(gòu)造函數(shù)是會報錯的。

刪除線 :StrikethroughSpan

下劃線UnderlineSpan

圖文置換:ImageSpan 把文字替換成圖片,感覺實用性不大,有需要就看看上面提到的那篇博文。

總結(jié)一下

首先用SpannableString 和 SpannableStringBuilder構(gòu)建你的字符串,挑選自己需要的span,把span設(shè)置到字符串里,最后把字符串設(shè)置到TextView中。

方法二

讓TextView顯示html的標(biāo)簽樣式

例如:

html樣式

調(diào)用Html.fromHtml去解析一個包含html標(biāo)簽的String字符串,該方法返回一個Spanned對象,Spanned是CharSequence的子類。

需要主意的是,String 里的html標(biāo)簽用到雙引號,要用轉(zhuǎn)移字符

其次是fromHtml這個方法,上面可以看到是個過時的方法,代替方法是

fromHtml(String source, int flags)

有個flags,實際上這個過時方法也有一個flags

@Deprecated

public static Spanned fromHtml(String source) {

return fromHtml(source, FROM_HTML_MODE_LEGACY, null, null);

}

FROM_HTML_MODE_LEGACY ?。android N 之前留下的特性,遇到塊級元素就會換行,也就是說html標(biāo)簽里的<p>,<h1>之類的標(biāo)簽,會自動換行

回到文章來說,如果是只改變顏色,那只會用到<font color>這個標(biāo)簽。不用在意這個flags

如果硬要展示各種標(biāo)簽,而且對flags有要求,可以去Html這個類里看看其他幾個flags能不能滿足要求。太復(fù)雜的網(wǎng)頁,還是用WebView展示吧。

所以。這就是改變字體顏色的兩種方法了~

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

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

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