SpannableStringBuilder和Spannable
SpannableStringBuilder 和 Spannable 的关系就和
String 和 StringBuilder 的关系是一样的,使用SpannableStringBuilder的append(...)来拼接每一个的Spannable效率会更高
如何使用Spannable显示富文本
-
首先创建SpannableString对象,在其构造方法中传入要设置富文本的字符串
String s1 = "Java Android C C++ PHP JavaScript"; Spannable spannable = new SpannableString(s1);
-
设置Span
spannable.setSpan(Object what, int start, int end, int flags) 该方法有四个参数: what:设置文本Span类型,在android.text.style包下一共20个实现类Span start: 应用此Span的字符串的起始位置 end : 应用此Span的字符串的结束为止 flags: 此标记一共有4个,分别如下: SPAN_EXCLUSIVE_EXCLUSIVE 表示使用TextView进行拼接SpanableString时,当前的Span效果不应用到前后拼接的文本上(前后都不包括) SPAN_INCLUSIVE_INCLUSIVE 表示使用TextView进行拼接SpanableString时,当前的Span效果应用到前后拼接的文本上(前后都包括) SPAN_EXCLUSIVE_INCLUSIVE 前不包括,后包括 SPAN_INCLUSIVE_EXCLUSIVE 前包括,后不包括
-
案例,只列举了部分Span
String s1 = "Java Android C C++ PHP JavaScript"; SpannableStringBuilder stringBuilder = new SpannableStringBuilder(); Spannable spannable = new SpannableString(s1); //文本背景色 spannable.setSpan(new BackgroundColorSpan(Color.RED),0,4,Spannable.SPAN_INCLUSIVE_EXCLUSIVE); //文本前景色(字体色) spannable.setSpan(new ForegroundColorSpan(Color.BLUE),0,4,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //字体类型 spannable.setSpan(new TypefaceSpan("monospace"),0,4,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //设置文字觉得大小 spannable.setSpan(new AbsoluteSizeSpan(60),0,4,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //设置文字相对大小,相对于默认大小值 spannable.setSpan(new RelativeSizeSpan(4),5,12,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //在文本中插入图片 Drawable drawable = ContextCompat.getDrawable(this,R.mipmap.ic_launcher_round); drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());//设置图片显示区域 spannable.setSpan(new ImageSpan(drawable),12,13,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //设置文本语言环境 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { spannable.setSpan(new LocaleSpan(Locale.ENGLISH),13,14,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } //设置文本下划线 spannable.setSpan(new UnderlineSpan(),15,18,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //设置指定文本超链接 spannable.setSpan(new URLSpan("http://www.baidu.com"),19,22, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); textView.setMovementMethod(LinkMovementMethod.getInstance());//超链接跳转需要设置此方法来响应 //设置字体样式(bold italic normal) spannable.setSpan(new StyleSpan(Typeface.BOLD),23,33,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //在文本的开头添加一个垂直的条带的一个span //(垂直布局方向)。必须从第一个字符连接到一个字符的最后一个字符,否则不显示 spannable.setSpan(new QuoteSpan(),0,s1.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); stringBuilder.append(spannable); textView.setText(stringBuilder);