TextView一般用來顯示普通文本,可是有時候須要對其中某些文本進行樣式、事件方面的設置。Android系統經過SpannableString類來對指定文本進行相關處理,具體有如下功能:android
一、BackgroundColorSpan 背景色
二、ClickableSpan 文本可點擊,有點擊事件
三、ForegroundColorSpan 文本顏色(前景色)
四、MaskFilterSpan 修飾效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
五、MetricAffectingSpan 父類,通常不用
六、RasterizerSpan 光柵效果
七、StrikethroughSpan 刪除線(中劃線)
八、SuggestionSpan 至關於佔位符
九、UnderlineSpan 下劃線
十、AbsoluteSizeSpan 絕對大小(文本字體)
十一、DynamicDrawableSpan 設置圖片,基於文本基線或底部對齊。
十二、ImageSpan 圖片
1三、RelativeSizeSpan 相對大小(文本字體)
1四、ReplacementSpan 父類,通常不用
1五、ScaleXSpan 基於x軸縮放
1六、StyleSpan 字體樣式:粗體、斜體等
1七、SubscriptSpan 下標(數學公式會用到)
1八、SuperscriptSpan 上標(數學公式會用到)
1九、TextAppearanceSpan 文本外貌(包括字體、大小、樣式和顏色)
20、TypefaceSpan 文本字體
2一、URLSpan 文本超連接app
一、BackgroundColorSpan 背景色字體
SpannableString spanText = new SpannableString("蘿蔔白菜的博客 -- http://orgcent.com");
spanText.setSpan(new BackgroundColorSpan(Color.GREEN), 0, spanText.length(),this
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);spa
二、ClickableSpan 文本可點擊,有點擊事件orm
Android系統默認把網址、電話、地圖(geo地址)、郵箱等轉換爲超連接。對象
具體請查看android:TextView設置文本樣式和超連接繼承
和HTML中的同樣,默認超連接都帶下劃線的,下面的方案能夠在TextView中去掉超連接的下劃線:事件
一、重寫ClickableSpan類來去掉下劃線樣式(系統默認使用ClickableSpan來封裝超連接)
//無下劃線超連接,使用textColorLink、textColorHighlight分別修改超連接前景色和按下時的顏色
private class NoLineClickSpan extends ClickableSpan {
String text;
public NoLineClickSpan(String text) {
super();
this.text = text;
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(ds.linkColor);
ds.setUnderlineText(false); <span style="color: red;">//去掉下劃線</span>
}
@Override
public void onClick(View widget) {
processHyperLinkClick(text); <span style="color: red;">//點擊超連接時調用</span>
}
}
二、把超連接文本封裝爲NoLineClickSpan對象,並添加到TextView中
TextView tv = findViewById(R.id.tv_click);
SpannableString spStr = new SpannableString("蘿蔔白菜博客-->http://orgcent.com");
ClickSpan clickSpan = new NoLineClickSpan(vo); //設置超連接
spStr.setSpan(clickSpan, 0, str.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
tv.append(spStr);
tv.setMovementMethod(LinkMovementMethod.getInstance());
PS:不用把TextView的屬性autoLink設爲」all」.
三、設置超連接爲可點擊狀態
tv.setMovementMethod(LinkMovementMethod.getInstance());
PS:在NoLineClickSpan類中實現onClick()回調方法.
三、ForegroundColorSpan 文本顏色(前景色)
spanText = new SpannableString("蘿蔔白菜的博客 -- http://orgcent.com");
spanText.setSpan(new ForegroundColorSpan(Color.BLUE), 6, spanText.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);
四、MaskFilterSpan 修飾效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
spanText = new SpannableString("MaskFilterSpan -- http://orgcent.com");
int length = spanText.length();
//模糊(BlurMaskFilter)
MaskFilterSpan maskFilterSpan = new MaskFilterSpan(new BlurMaskFilter(3, Blur.OUTER));
spanText.setSpan(maskFilterSpan, 0, length - 10, Spannable.
SPAN_INCLUSIVE_EXCLUSIVE);
//浮雕(EmbossMaskFilter)
maskFilterSpan = new MaskFilterSpan(new EmbossMaskFilter(new float[]{1,1,3}, 1.5f, 8, 3));
spanText.setSpan(maskFilterSpan, length - 10, length, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);
PS:從上圖看,浮雕效果不明顯。把字體設置大點後能夠看得清晰些。須要其餘效果能夠繼承MaskFilter來自定義。
六、RasterizerSpan 光柵效果
spanText = new SpannableString("StrikethroughSpan");
spanText.setSpan(new StrikethroughSpan(), 0, 7, Spannable.
SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);
七、StrikethroughSpan 刪除線(中劃線)
spanText = new SpannableString("StrikethroughSpan");
spanText.setSpan(new StrikethroughSpan(), 0, 7, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);
八、SuggestionSpan
至關於佔位符,通常用在EditText輸入框中。當雙擊此文本時,會彈出提示框選擇一些建議(推薦的)文字,選中的文本將替換此佔位符。在輸入法上用的較多。
PS:API 14新增,暫無示例。
九、UnderlineSpan 下劃線
spanText = new SpannableString("UnderlineSpan");
spanText.setSpan(new UnderlineSpan(), 0, spanText.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);
十、AbsoluteSizeSpan 絕對大小(文本字體)
spanText = new SpannableString("AbsoluteSizeSpan");
spanText.setSpan(new AbsoluteSizeSpan(20, true), 0, spanText.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);
十一、DynamicDrawableSpan 設置圖片,基於文本基線或底部對齊。
DynamicDrawableSpan drawableSpan =
new DynamicDrawableSpan(DynamicDrawableSpan.ALIGN_BASELINE) {
@Override
public Drawable getDrawable() {
Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
d.setBounds(0, 0, 50, 50);
return d;
}
};
DynamicDrawableSpan drawableSpan2 = new DynamicDrawableSpan(
DynamicDrawableSpan.ALIGN_BOTTOM) {
@Override
public Drawable getDrawable() {
Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
d.setBounds(0, 0, 50, 50);
return d;
}
};
spanText.setSpan(drawableSpan, 3, 4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
spanText.setSpan(drawableSpan2, 7, 8, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);
十二、ImageSpan 圖片
spanText = new SpannableString("ImageSpan");
Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
</strong>d.setBounds(0, 0, 50, 50);
spanText.setSpan(new ImageSpan(d), 3, 4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);
1三、RelativeSizeSpan 相對大小(文本字體)
spanText = new SpannableString("RelativeSizeSpan");
//參數proportion:比例大小
spanText.setSpan(new RelativeSizeSpan(2.5f), 3, 4,
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);
1五、ScaleXSpan 基於x軸縮放
spanText = new SpannableString("ScaleXSpan -- 蘿蔔白菜的博客");
//參數proportion:比例大小
spanText.setSpan(new ScaleXSpan(3.8f), 3, 7, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);
1六、StyleSpan 字體樣式:粗體、斜體等
spanText = new SpannableString("StyleSpan -- 蘿蔔白菜的博客");
//Typeface.BOLD_ITALIC:粗體+斜體
spanText.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 3, 7,
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);
1七、SubscriptSpan 下標(數學公式會用到)
spanText = new SpannableString("SubscriptSpan -- 蘿蔔白菜的博客");
spanText.setSpan(new SubscriptSpan(), 6, 7, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);
1八、SuperscriptSpan 上標(數學公式會用到)
spanText = new SpannableString("SuperscriptSpan -- 蘿蔔白菜的博客");
spanText.setSpan(new SuperscriptSpan(), 6, 7, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);
1九、TextAppearanceSpan 文本外貌(包括字體、大小、樣式和顏色)
spanText = new SpannableString("TextAppearanceSpan -- 蘿蔔白菜的博客");
//若需自定義TextAppearance,能夠在系統樣式上進行修改
spanText.setSpan(new TextAppearanceSpan(this, android.R.style.TextAppearance_Medium),
6, 7, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);
PS:系統還提供了相關值TextAppearance_Small, TextAppearance_Large等。若有須要可在以上樣式基礎上修改。
20、TypefaceSpan 文本字體
spanText = new SpannableString("TypefaceSpan -- 蘿蔔白菜的博客");
//若需使用自定義字體,可能要重寫類TypefaceSpan
spanText.setSpan(new TypefaceSpan("monospace"), 3, 10,
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);
2一、URLSpan 文本超連接
spanText = new SpannableString("URLSpan -- 蘿蔔白菜的博客");
spanText.setSpan(new URLSpan("http://orgcent.com"), 10, spanText.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTVText.append("\n");
mTVText.append(spanText);
//讓URLSpan能夠點擊
mTVText.setMovementMethod(new LinkMovementMethod());