前言
如下圖,在同一個TextView中顯示不同的顏色、大小,有兩種方法:設置Span和html字符串
更新
不推薦在代碼中使用這種方法來控制顯示效果,非常不利於擴展,程序設計的思路應該是界面、邏輯分離。第一次在寫layout文件的時候稍微麻煩一點,以後修改、擴展的時候方便得多,java代碼簡潔、邏輯清晰。
SpannableString、SpannableStringBuilder類概述
SpannableString、SpannableStringBuilder和String都實現了CharSequence接口,都是字符串的載體。不同的是,SpannableString、SpannableStringBuilder還實現了Spannable接口,這個接口中有個setSpan()方法,用來設置字符串的風格(大小、顏色、背景等等),這就是本文要講的重點。
SpannableStringBuilder比SpannableString多實現了Appendable、Editable等接口,功能更多一些,類似於StringBuilder和String的區別。
setSpan(Object what, int start, int end, int flags)方法
參數1:各種類型的Span,比如控制字體大小的Span、控制字體顏色的Span等等;
參數2:開始應用Span的位置,索引從0開始;
參數3:結束應用Span的位置,並不包括這個位置。比如end爲3(即第4個字符),第4個字符不會有效果;
參數4:效果影響的模式,有下面4種;
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前後都不包括,即在指定範圍的前面和後面插入新字符都不會應用新樣式
Spannable.SPAN_EXCLUSIVE_INCLUSIVE :前面不包括,後面包括。即僅在範圍字符的後面插入新字符時會應用新樣式
Spannable.SPAN_INCLUSIVE_EXCLUSIVE :前面包括,後面不包括。
Spannable.SPAN_INCLUSIVE_INCLUSIVE :前後都包括。
tips1:setSpan()方法會將設置的Span存入一個數組中,所以各種效果是可以疊加的;
tips2:通過setSpan()方法設置的Span,主要是用於在控件中顯示,只有控件才能讀取到其中的Span信息,在其它地方,無法讀取到其中的Span信息,只能讀取到String信息,比如Canvas繪製文字;
各種Span使用
1、字體顏色設置(ForegroundColorSpan)
// 通過String構造SpannableString
SpannableString spanString = new SpannableString("同一個TextView顯示不同效果");
// 構造ForegroundColorSpan
ForegroundColorSpan span = new ForegroundColorSpan(0xfe8026);
//將ForegroundColorSpan應用於指定範圍的字體
spanString.setSpan(span, 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//設置顯示
editText.setText(spanString);
2、字體背景顏色(BackgroundColorSpan)
SpannableString spanString = new SpannableString("同一個TextView顯示不同效果");
BackgroundColorSpan span = new BackgroundColorSpan(0xfe8026);
spanString.setSpan(span, 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setText(spanString);
3、字體大小(AbsoluteSizeSpan)
SpannableString spanString = new SpannableString("同一個TextView顯示不同效果");
// 這裏的大小是px值,最好通過dp2px轉換一下
AbsoluteSizeSpan span = new AbsoluteSizeSpan(18);
spanString.setSpan(span, 2, 5, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
editText.setText(spanString);
4、粗體、斜體(StyleSpan)
SpannableString spanString = new SpannableString("同一個TextView顯示不同效果");
StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC);
spanString.setSpan(span, 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setText(spanString);
5、刪除線(StrikethroughSpan)
SpannableString spanString = new SpannableString("同一個TextView顯示不同效果");
StrikethroughSpan span = new StrikethroughSpan();
spanString.setSpan(span, 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setText(spanString);
6、下劃線(UnderlineSpan)
SpannableString spanString = new SpannableString("同一個TextView顯示不同效果");
UnderlineSpan span = new UnderlineSpan();
spanString.setSpan(span, 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setText(spanString);
7、圖片置換(ImageSpan)
SpannableString spanString = new SpannableString("同一個TextView顯示不同效果");
Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
spanString.setSpan(span, 2, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
editText.setText(spanString);
html字符串
// 佔坑,有空了再更新。。。