Spannable 富文本

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);

你可能感兴趣的:(Spannable 富文本)