项目上碰到一个需求,需要对一篇文章进行多样标记,类似于批改作文那样。
想了很久,一开始觉得应该在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,接下来会在项目中考虑使用,有下一步进展,再来更新这篇文章