前言
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、字型大小(AbsoluteSizeSpan)
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);
複製程式碼