前言
TextView設置部分或指定背景色和字體顏色應該算是開發中經常用到且不被熟悉的用法,今天就簡單的記錄下他的用法
效果圖
代碼
TextView t_question=findViewById(R.id.question);
? ? ? ? String s_question=" 問答題 :String是基本類型嗎?可以被繼承嗎?";
? ? ? ? SpannableStringBuilder style=new SpannableStringBuilder(s_question);
? ? ? ? style.setSpan(new BackgroundColorSpan(Color.RED),0,5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
? ? ? ? style.setSpan(new ForegroundColorSpan(Color.RED),13,15,Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
? ? ? ? t_question.setText(style);
SpannableStringBuilder
SpannableString、SpannableStringBuilder與String的關系
簡單來點說,string只能是字符串,而SpannableString、SpannableStringBuilder可以在原來String上加下劃線、加背景色、改變字體顏色、用圖片把指定的文字給替換掉,等等
SpannableString、SpannableStringBuilder之間關系
它們的區別在于 SpannableString像一個String一樣,構造對象的時候傳入一個String,之后再無法更改String的內容,也無法拼接多個 SpannableString;而SpannableStringBuilder則更像是StringBuilder,它可以通過其append()方法來拼接多個String:
用法
void setSpan (Object what, int start, int end, int flags)
函數意義:給SpannableString或SpannableStringBuilder特定范圍的字符串設定Span樣式,可以設置多個(比如同時加上下劃線和刪除線等),Falg參數標識了當在所標記范圍前和標記范圍后緊貼著插入新字符時的動作,即是否對新插入的字符應用同樣的樣式。(這個后面會具體舉例說明)
參數說明:
object what :對應的各種Span,后面會提到;
int start:開始應用指定Span的位置,索引從0開始
int end:結束應用指定Span的位置,特效并不包括這個位置。比如如果這里數為3(即第4個字符),第4個字符不會有任何特效。從下面的例子也可以看出來。
int flags:取值有如下四個
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范圍的前面和后面插入新字符都不會應用新樣式
Spannable.SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括。即僅在范圍字符的后面插入新字符時會應用新樣式
Spannable.SPAN_INCLUSIVE_EXCLUSIVE:前面包括,后面不包括。
Spannable.SPAN_INCLUSIVE_INCLUSIVE:前后都包括。
舉個例子來說明這個前后包括的問題:
由于Flag的作用是用來指定范圍前后輸入新的字符時,會不會應用效果的,所以我們利用EditText來顯示SpannableString
public class MainActivity extends Activity {?
? ? ?
? ? private EditText editText;? ?
? ? @Override?
? ? protected void onCreate(Bundle savedInstanceState) {?
? ? ? ? super.onCreate(savedInstanceState);?
? ? ? ? setContentView(R.layout.activity_main);?
? ? ? ? ?
? ? ? ? editText = (EditText)findViewById(R.id.edit);?
? ? ? ? ?
? ? ? ? //改變字體顏色?
? ? ? ? //先構造SpannableString?
? ? ? ? SpannableString spanString = new SpannableString("歡迎光臨Harvic的博客");? ?
? ? ? //再構造一個改變字體顏色的Span?
? ? ? ? ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);? ?
? ? ? ? //將這個Span應用于指定范圍的字體?
? ? ? ? spanString.setSpan(span, 1, 3, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);? ?
? ? ? ? //設置給EditText顯示出來?
? ? ? ? editText.setText(spanString);?
? ? }?
}?
初始化效果是這樣的:
分別在設置Span的前面和后面加入新文字,結果是這樣的
在前面和后面都加入蝦米兩個字,可見,前面的蝦米沒有任何效果,后面的則不同,添加上相同的Span特效,這是由于我們設置了Spannable.SPAN_EXCLUSIVE_INCLUSIVE的原因,即(前面不應用特效,后面應用特效),其它幾個Flags參數的含義想必大家也都清楚了。在此就不再贅述。
二、各種Span設置
1、字體顏色設置(ForegroundColorSpan)
SpannableString spanString = new SpannableString("輸入字體");? ?
//再構造一個改變字體顏色的Span?
ForegroundColorSpan span = new ForegroundColorSpan(Color.BLUE);? ?
//將這個Span應用于指定范圍的字體?
spanString.setSpan(span, 1, 5, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);? ?
//設置給EditText顯示出來?
editText.setText(spanString);?
2、字體背景顏色(BackgroundColorSpan)
SpannableString spanString = new SpannableString("輸入字體");? ?
BackgroundColorSpan span = new BackgroundColorSpan(Color.YELLOW);? ?
spanString.setSpan(span, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);? ?
editText.setText(spanString);? ?
3、字體大?。ˋbsoluteSizeSpan)
SpannableString spanString = new SpannableString("輸入字體");? ?
AbsoluteSizeSpan span = new AbsoluteSizeSpan(16);? ?
spanString.setSpan(span, 2, 5, Spannable.SPAN_INCLUSIVE_INCLUSIVE);? ?
editText.setText(spanString);?
4、粗體、斜體(StyleSpan)
SpannableString spanString = new SpannableString("輸入字體");? ?
StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC);? ?
spanString.setSpan(span, 1, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);? ?
editText.setText(spanString);?
5、刪除線(StrikethroughSpan)
SpannableString spanString = new SpannableString("輸入字體");? ?
StrikethroughSpan span = new StrikethroughSpan();? ?
spanString.setSpan(span, 2, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);? ?
editText.setText(spanString);
6、下劃線(UnderlineSpan)
SpannableString spanString = new SpannableString("輸入字體");? ?
UnderlineSpan span = new UnderlineSpan();? ?
spanString.setSpan(span, 1, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);? ?
editText.setText(spanString);?
7、圖片置換(ImageSpan)
SpannableString spanString = new SpannableString("輸入字體");? ?
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);
作者:? 夢乾
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。