在項(xiàng)目開發(fā)中經(jīng)常遇到一種情況:給字符串的某個(gè)或某幾個(gè)字符設(shè)置不同的顏色,比較笨的方法是使用幾個(gè)textview連著放置殃饿。這種方式太麻煩谋作,下面我們使用一種新的方式。
TextView中有一個(gè)類SpannableString壁晒,這是源碼的解釋:
/**
* This is the class for text whose content is immutable but to which
* markup objects can be attached and detached.
* For mutable text, see {@link SpannableStringBuilder}.
*/
大概意思是這是文本編輯類(英語水平一般就不翻譯了)瓷们,可以對(duì)文本內(nèi)容就行設(shè)置和編輯。類方法不多秒咐,就兩個(gè):setSpan(設(shè)置文本樣式)和removeSpan(移除文本樣式)谬晕。
下面說一下具體的使用:
一、給textview設(shè)置背景色
通常情況下都是通過xml布局文件和textview.setBackground來設(shè)置背景(簡(jiǎn)單携取,就不說了)攒钳,下面我們來使用SpannableString給textView設(shè)置背景(上代碼)。
//設(shè)置背景色
SpannableString spannableString = new SpannableString("設(shè)置背景色");
spannableString.setSpan(new BackgroundColorSpan(Color.GREEN), 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvShowContent.setText(spannableString);
構(gòu)造器的參數(shù)就是要顯示的內(nèi)容雷滋,setSpan有四個(gè)參數(shù)不撑,第一個(gè)Object是我們要設(shè)置的背景顏色文兢,第二個(gè)參數(shù)和第三個(gè)參數(shù)是設(shè)置的背景色從哪開始,到哪結(jié)束焕檬,設(shè)置的文本的startIndex和endIndex姆坚,第四個(gè)參數(shù)有四個(gè)值:
Spanned.SPAN_INCLUSIVE_EXCLUSIVE:使用該樣式的文本之前的文本使用該樣式,之后的不使用
Spanned.SPAN_EXCLUSIVE_INCLUSIVE:使用該樣式的文本之前的不使用該樣式实愚,之后的使用該樣式
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE:使用該樣式的文本之前和之后的都不使用該樣式
Spanned.SPAN_INCLUSIVE_INCLUSIVE:使用該樣式的文本之前和之后都使用該樣式
效果圖:
二兼呵、給文本設(shè)置點(diǎn)擊事件
上代碼:
//設(shè)置背景色
SpannableString spannableString = new SpannableString("設(shè)置背景色");
spannableString.setSpan(new BackgroundColorSpan(Color.GREEN), 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//設(shè)置點(diǎn)擊事件
spannableString.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(MainActivity2.this, "點(diǎn)擊前面的背景", Toast.LENGTH_SHORT).show();
}
}, 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//這個(gè)必須的增加,對(duì)同一個(gè)控件只需要設(shè)置一次就行
tvShowContent.setMovementMethod(LinkMovementMethod.getInstance());
tvShowContent.setText(spannableString);
效果圖:
三腊敲、設(shè)置文本字體顏色
//前面設(shè)置文本內(nèi)容都一樣击喂,就不寫了,只放核心代碼
spannableString.setSpan(new ForegroundColorSpan(Color.GREEN), 0, 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
第一個(gè)參數(shù)就是設(shè)置的文本顏色碰辅,第2個(gè)和第3個(gè)參數(shù)控制著給那些文本設(shè)置顏色懂昂,第4個(gè)參數(shù)和上面的解釋是一樣的。擴(kuò)展一下:根據(jù)這個(gè)方法就可以給一個(gè)字符串的某個(gè)字符設(shè)置單獨(dú)的顏色没宾。
上圖:
四凌彬、設(shè)置刪除線和下劃線
SpannableString spannableString3 = new SpannableString("\n1998");
spannableString3.setSpan(new ForegroundColorSpan(Color.RED), 0, spannableString3.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//設(shè)置刪除線
spannableString3.setSpan(new StrikethroughSpan(), 0, spannableString3.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//增加下劃線
spannableString3.setSpan(new UnderlineSpan(), 0, spannableString3.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvShowContent.append(spannableString3);
刪除線一般都用在電商的價(jià)格上,刪除原價(jià)榕吼,顯示優(yōu)惠后的價(jià)格
五饿序、在某個(gè)位置插入圖片
//在textview中設(shè)置圖片
SpannableString spannableString5 = new SpannableString("\n設(shè)置圖片,在第一個(gè)字符上設(shè)置");
spannableString5.setSpan(new DynamicDrawableSpan() {
@Override
public Drawable getDrawable() {
Drawable d = getResources().getDrawable(R.drawable.ic_launcher_background);
d.setBounds(0, 0, 50, 50);
return d;
}
}, 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvShowContent.append(spannableString5);
其中d.setBounds()用來設(shè)置顯示的圖片的大小羹蚣,2和4表示圖片的位置原探,即將"圖片"字由圖片代替,上圖:
六顽素、設(shè)置縮放
//設(shè)置縮放
SpannableString spannableString16=new SpannableString("\n基于x軸縮放");
//ScaleXSpan中的參數(shù)==1表示正常顯示咽弦,大于1表示橫向擴(kuò)大,小于0表示反向正常大小顯示胁出,小于-1表示反向顯示且橫向擴(kuò)大
//大于0小于1表示縮放
spannableString16.setSpan(new ScaleXSpan( 0.9f),0,spannableString16.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvShowContent.append(spannableString16);
縮放的規(guī)則在注釋中都有解釋型型,0.9f表示在原來的基礎(chǔ)上縮小了0.1
七、設(shè)置字體樣式 粗體 斜體
SpannableString spannableString7=new SpannableString("\n我是粗體,我是斜體,我是粗斜體");
spannableString7.setSpan(new StyleSpan(Typeface.BOLD),0,5,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString7.setSpan(new StyleSpan(Typeface.ITALIC),5,10,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString7.setSpan(new StyleSpan(Typeface.BOLD_ITALIC),10,spannableString7.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvShowContent.append(spannableString7);
Typeface.BOLD:粗體
Typeface.ITALIC:斜體
Typeface.BOLD_ITALIC:斜粗體
NORMAL.NORMAL:正常字體
八全蝶、設(shè)置超鏈接
SpannableString spannableString8=new SpannableString("\n打電話闹蒜,發(fā)短信,發(fā)郵件抑淫,打開網(wǎng)頁");
spannableString8.setSpan(new URLSpan("tel:18838206194"),1,4,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString8.setSpan(new URLSpan("smsto:18838206194"),5,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString8.setSpan(new URLSpan("mailto:653848947@qq.com"),9,12,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannableString8.setSpan(new URLSpan("http://www.baidu.com"),13,17,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//tvShowContent.setMovementMethod(LinkMovementMethod.getInstance());//這行代碼如果tvShowContent已經(jīng)設(shè)置過了可以不寫
tvShowContent.append(spannableString8);
超鏈接的字體顏色是根據(jù)手機(jī)不用來顯示的