先上效果图:
下边是核心代码:
private TextView tv = null;
tv = (TextView)v.findViewById(R.id.tv);
//BackgroundColorSpan
String st = getString(R.string.BackgroundColorSpan);
SpannableString spanText = new SpannableString(st);
spanText.setSpan(new BackgroundColorSpan(Color.GREEN), 0, spanText.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
tv.append(spanText);
//ClickableSpan
st = getString(R.string.ClickableSpan);
spanText = new SpannableString(st);
ClickableSpan clickSpan = new NoLineClickSpan(st); //设置超链接
spanText.setSpan(clickSpan, 0, 9, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanText);
tv.setMovementMethod(LinkMovementMethod.getInstance()); //设置可点击
//ForegroundColorSpan
st = getString(R.string.ForegroundColorSpan);
spanText = new SpannableString(st);
spanText.setSpan(new ForegroundColorSpan(Color.BLUE), 0, spanText.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanText);
//MaskFilterSpan
st = getString(R.string.MaskFilterSpan);
spanText = new SpannableString(st);
MaskFilterSpan maskFilterSpan = new MaskFilterSpan(new BlurMaskFilter(3, Blur.OUTER));//模糊(BlurMaskFilter)
spanText.setSpan(maskFilterSpan, 0, spanText.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanText);
maskFilterSpan = new MaskFilterSpan(new EmbossMaskFilter(new float[]{1,1,3}, 1.5f, 8, 3));//浮雕(EmbossMaskFilter)
spanText.setSpan(maskFilterSpan, 0, spanText.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanText);
//StrikethroughSpan
st = getString(R.string.StrikethroughSpan);
spanText.setSpan(new StrikethroughSpan(), 0, spanText.length(), Spannable. SPAN_INCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanText);
//UnderLineSpan
st = getString(R.string.UnderLineSpan);
spanText = new SpannableString(st);
spanText.setSpan(new UnderlineSpan(), 0, spanText.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanText);
//AbsoluteSizeSpan
st = getString(R.string.AbsoluteSizeSpan);
spanText = new SpannableString(st);
spanText.setSpan(new AbsoluteSizeSpan(20, true), 0, spanText.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanText);
//
st = getString(R.string.RelativeSizeSpan);
spanText = new SpannableString(st);
spanText.setSpan(new RelativeSizeSpan(2.5f), 3, 4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); //参数proportion:比例大小
tv.append("\n");
tv.append(spanText);
//DynamicDrawableSpan
st = getString(R.string.DynamicDrawableSpan);
spanText = new SpannableString(st);
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);
tv.append("\n");
tv.append(spanText);
//ImageSpan
st = getString(R.string.ImageSpan);
spanText = new SpannableString(st);
Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
d.setBounds(0, 0, 50, 50);
spanText.setSpan(new ImageSpan(d), 3, 4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanText);
//ScaleXSpan
st = getString(R.string.ScaleXSpan);
spanText = new SpannableString(st);
spanText.setSpan(new ScaleXSpan(3.8f), 3, 7, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanText);
//StyleSpan
st = getString(R.string.StyleSpan);
spanText = new SpannableString(st);
spanText.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 3, 7, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanText);
//SubscriptSpan
st = getString(R.string.SubscriptSpan);
spanText = new SpannableString(st);
spanText.setSpan(new SubscriptSpan(), 3, 4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanText);
//SuperscriptSpan
st = getString(R.string.SuperscriptSpan);
spanText = new SpannableString(st);
spanText.setSpan(new SuperscriptSpan(), 3, 4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanText);
//TextappearanceSpan
st = getString(R.string.TextappearanceSpan);
spanText = new SpannableString(st);
spanText.setSpan(new TextAppearanceSpan(this, android.R.style.TextAppearance_Medium), 3, 7, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanText);
//TypefaceSpan
st = getString(R.string.TypefaceSpan);
spanText = new SpannableString(st);
spanText.setSpan(new TypefaceSpan("serif"), 3, 7, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);//"sans"(默认),"serif"和"monospace",
tv.append("\n");
tv.append(spanText);
//URLSpan
st = getString(R.string.URLSpan);
spanText = new SpannableString(st);
spanText.setSpan(new URLSpan("http://www.baidu.com"), 0, 3, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
tv.append("\n");
tv.append(spanText);
tv.setMovementMethod(new LinkMovementMethod());
//BackgroundImageSpan
st = getString(R.string.BackgroundImageSpan);
spanText = new SpannableString(st);
int len = tv.getText().length();
tv.append("\n");
tv.append(spanText);
Spannable spanable = (Spannable)tv.getText();
spanable.setSpan(new ReplacementSpan() {
float lm = 20.0f;
@Override
public int getSize(Paint paint, CharSequence text, int start, int end,
FontMetricsInt fm) {
// TODO Auto-generated method stub
float[] widths = new float[text.length()];
paint.getTextWidths(text, start, end, widths);
float returnValue = 0.0f;
for (float width : widths)
returnValue += width;
return (int)(returnValue + lm);
}
@Override
public void draw(Canvas canvas, CharSequence text, int start, int end,
float x, int top, int y, int bottom, Paint paint) {
// TODO Auto-generated method stub
float imageWidth = lm;
{
float[] widths = new float[text.length()];
paint.getTextWidths(text, start, end, widths);
for (float width : widths)
imageWidth += width;
}
Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.history_recipients);
NinePatch np = new NinePatch(bm, bm.getNinePatchChunk(), null);
np.draw(canvas, new Rect(0, top - 2, (int)imageWidth, bottom + 2), paint);
Path pt = new Path();
pt.moveTo(0, y);
pt.lineTo(imageWidth, y);
String st = text.subSequence(start, end).toString();
canvas.drawTextOnPath(st, pt, lm, 0.0f, paint);
}
}, len, spanable.length() - 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
//无下划线超链接,使用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);
}
@Override
public void onClick(View widget) {
Toast.makeText(TextViewActivity.this, "NoLineClickSpan was Clicked!", 1000).show();
}
}