項目上碰到一個需求,需要對一篇文章進行多樣標記,類似於批改作文那樣。
想了很久,一開始覺得應該在String中加標籤,突然被同事一提醒,SpannableString,茅塞頓開啊
先上兩個參考地址,隨項目進行中來補全這篇文章
案例非常詳細了
1.http://blog.it985.com/14433.html
解釋flag
2.http://blog.csdn.net/xijiaohuangcao/article/details/7839856
以下是我的Demo源碼及效果
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
switch (position) {
case 0:
//下劃線
SpannableString spanString = new SpannableString("這是一條下劃線");
UnderlineSpan span = new UnderlineSpan();
spanString.setSpan(span, 0, 6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mTxt.append(spanString);
break;
case 1:
//文字顏色
SpannableString spanString1 = new SpannableString("文字顏色藍色");
ForegroundColorSpan span1 = new ForegroundColorSpan(Color.BLUE);
spanString1.setSpan(span1, 0, 6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mTxt.append(spanString1);
break;
case 2:
//字體大小
SpannableString spanString2 = new SpannableString("36號字體");
AbsoluteSizeSpan span2 = new AbsoluteSizeSpan(36);
spanString2.setSpan(span2, 0, 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mTxt.append(spanString2);
break;
case 3:
//光棧效果
SpannableString spanString3 = new SpannableString("要展現光棧效果");
spanString3.setSpan(new StrikethroughSpan(), 0, 7, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
mTxt.append(spanString3);
break;
case 4:
//加粗
SpannableString spanString4 = new SpannableString("粗體很粗");
StyleSpan span4 = new StyleSpan(Typeface.BOLD_ITALIC);
spanString4.setSpan(span4, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mTxt.append(spanString4);
break;
case 5:
//刪除線
SpannableString spanString5 = new SpannableString("刪除線");
StrikethroughSpan span5 = new StrikethroughSpan();
spanString5.setSpan(span5, 0, 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mTxt.append(spanString5);
break;
case 6:
//文字背景顏色
SpannableString spanString6 = new SpannableString("文字背景顏色");
BackgroundColorSpan span6 = new BackgroundColorSpan(Color.YELLOW);
spanString6.setSpan(span6, 0, 6, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mTxt.append(spanString6);
break;
case 7:
//文字的某一部分轉變爲圖片
SpannableString spanString7 = new SpannableString("文字轉變爲圖片");
Drawable d1 = getResources().getDrawable(R.drawable.ic_launcher);
d1.setBounds(0, 0, d1.getIntrinsicWidth(), d1.getIntrinsicHeight());
ImageSpan span7 = new ImageSpan(d1, ImageSpan.ALIGN_BASELINE);
spanString7.setSpan(span7, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
mTxt.append(spanString7);
break;
}
}
應該很清楚了,這是在gridview中的OnItemClick事件(偷懶拿了個以前簡單的Gridview做demo),不同Item實現不同的效果。
第1個Item是加 下劃線
第2個Item是加 文字顏色
第3個Item是加 字體大小
第4個Item是加 光棧效果
第5個Item是加 粗
第6個Item是加 文字背景顏色
第7個Item是將 文字的某一部分轉變爲圖片
說明一下,SPAN_EXCLUSIVE_EXCLUSIVE/ SPAN_INCLUSIVE_EXCLUSIVE/ SPAN_EXCLUSIVE_INCLUSIVE,
這三個不同的值的意義在於,如果你在原先文本的效果上繼續添加左右兩側的文字,那INCLUSIVE代表延續原有的效果(色彩、大小等等),EXCLUSIVE代表不延續,使用默認的黑色文字。這個屬性是按左右排列,左邊EXCLUSIVE就是你的富文本左側新加文字不使用富文本效果,左邊INCLUSIVE就是你的富文本左側新加文字使用你富文本的效果,右側同理。
好了,目前爲止,只是Demo,接下來會在項目中考慮使用,有下一步進展,再來更新這篇文章